Source Code
Overview
CELO Balance
CELO Value
$0.00Multichain Info
Latest 16 from a total of 16 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Complete Crosswo... | 57245507 | 2 days ago | IN | 0 CELO | 0.00898251 | ||||
| Complete Crosswo... | 57209209 | 3 days ago | IN | 0 CELO | 0.0053031 | ||||
| Complete Crosswo... | 56776254 | 8 days ago | IN | 0 CELO | 0.00934687 | ||||
| Complete Crosswo... | 56715453 | 9 days ago | IN | 0 CELO | 0.0076223 | ||||
| Complete Crosswo... | 56707251 | 9 days ago | IN | 0 CELO | 0.01228839 | ||||
| Complete Crosswo... | 56701354 | 9 days ago | IN | 0 CELO | 0.01169442 | ||||
| Complete Crosswo... | 56701309 | 9 days ago | IN | 0 CELO | 0.01259658 | ||||
| Create Public Cr... | 56700827 | 9 days ago | IN | 100 CELO | 0.03768965 | ||||
| Complete Crosswo... | 56610456 | 10 days ago | IN | 0 CELO | 0.00997793 | ||||
| Complete Crosswo... | 56604569 | 10 days ago | IN | 0 CELO | 0.01169028 | ||||
| Complete Crosswo... | 56598022 | 10 days ago | IN | 0 CELO | 0.01169124 | ||||
| Complete Crosswo... | 56554384 | 10 days ago | IN | 0 CELO | 0.01103081 | ||||
| Complete Crosswo... | 56548277 | 10 days ago | IN | 0 CELO | 0.01259817 | ||||
| Create Public Cr... | 56546484 | 10 days ago | IN | 150 CELO | 0.03171591 | ||||
| Complete Crosswo... | 55581620 | 22 days ago | IN | 0 CELO | 0.01267455 | ||||
| Create Public Cr... | 55581589 | 22 days ago | IN | 1 CELO | 0.01873886 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CrosswordBoard
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 0 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
import "./libraries/ValidationLib.sol";
import "./libraries/ErrorMessages.sol";
// Interfaces for the modular contracts
interface ICrosswordCore {
struct CrosswordCompletion {
address user;
uint256 completionTimestamp;
uint256 durationMs;
}
function setCrossword(bytes32 crosswordId, string memory crosswordData) external;
function getCurrentCrossword() external view returns (bytes32, string memory, uint256);
function setSigner(address newSigner) external;
function completeCrossword(bytes32 crosswordId, uint256 durationMs, string calldata username, string calldata displayName, string calldata pfpUrl, bytes calldata signature) external;
function completeCrosswordForUser(address user, bytes32 crosswordId, uint256 durationMs, string calldata username, string calldata displayName, string calldata pfpUrl, bytes calldata signature) external;
function userCompletedCrossword(bytes32 crosswordId, address user) external view returns (bool);
function getCrosswordCompletions(bytes32 crosswordId) external view returns (CrosswordCompletion[] memory);
function emergencyClearCrossword() external;
function pause() external;
function unpause() external;
}
interface ICrosswordPrizes {
function createCrossword(bytes32 crosswordId, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external payable;
function createCrosswordWithoutValue(bytes32 crosswordId, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external;
function activateCrossword(bytes32 crosswordId) external;
function claimPrize(bytes32 crosswordId) external;
function isWinner(bytes32 crosswordId, address user) external view returns (bool);
function getUserRank(bytes32 crosswordId, address user) external view returns (uint256);
function recordCompletion(bytes32 crosswordId, address user) external returns (bool awardedPrize);
function getCrosswordDetails(bytes32 crosswordId) external view returns (
address token,
uint256 totalPrizePool,
uint256[] memory winnerPercentages,
address[] memory winners,
uint256 activationTime,
uint256 endTime,
uint8 state, // 0=Inactive, 1=Active, 2=Complete
bool isFinalized
);
function pause() external;
function unpause() external;
function grantOperatorRole(address operator) external;
function receiveNativeCELOForCrossword(bytes32 crosswordId) external payable;
function setFundingContract(address _fundingContract) external;
}
interface IUserProfiles {
function updateProfile(string calldata username, string calldata displayName, string calldata pfpUrl, string calldata bio, string calldata website) external;
function getUserProfile(address user) external view returns (string memory, string memory, string memory, uint256);
function pause() external;
function unpause() external;
}
interface IConfigManager {
function getBoolConfigWithDefault(string calldata key, bool defaultValue) external view returns (bool);
function pause() external;
function unpause() external;
}
interface IAdminManager {
function isAdminAddress(address addr) external view returns (bool);
function pause() external;
function unpause() external;
}
interface IPublicCrosswordManager {
function createCrossword(bytes32 crosswordId, string memory name, string memory crosswordData, string memory sponsoredBy) external payable;
function createCrosswordWithNativeCELOPrizePool(bytes32 crosswordId, string memory name, string memory crosswordData, string memory sponsoredBy, uint256 maxWinners, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external payable;
function createCrosswordWithPrizePool(bytes32 crosswordId, string memory name, string memory crosswordData, string memory sponsoredBy, uint256 maxWinners, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external;
function activateCrossword(bytes32 crosswordId) external;
function getCrosswordDetails(bytes32 crosswordId) external view returns (
string memory name,
string memory sponsoredBy,
string memory crosswordData,
address token,
uint256 totalPrizePool,
uint256 maxWinners,
uint256[] memory winnerPercentages,
uint256 activationTime,
uint256 endTime,
uint256 createdAt,
bool isActive,
bool isCompleted,
address creator
);
function getActiveCrosswordIds() external view returns (bytes32[] memory);
function getAllCrosswordIds() external view returns (bytes32[] memory);
function pause() external;
function unpause() external;
}
/**
* @title CrosswordBoard (Modularized Version)
* @dev Coordinator contract for the modularized Celo Crossword Learning App
* This contract coordinates between the modular contracts to provide unified functionality.
*/
contract CrosswordBoard is Ownable, ReentrancyGuard, Pausable {
// Contract addresses
ICrosswordCore public crosswordCore;
ICrosswordPrizes public crosswordPrizes;
IUserProfiles public userProfiles;
IConfigManager public configManager;
IAdminManager public adminManager;
IPublicCrosswordManager public publicCrosswordManager;
// Events
event ContractsUpdated(address core, address prizes, address profiles, address config, address admin, address publicManager);
/**
* @dev Constructor - sets the addresses of the modular contracts
*/
constructor(
address _crosswordCore,
address _crosswordPrizes,
address _userProfiles,
address _configManager,
address _adminManager,
address _publicCrosswordManager
) Ownable(msg.sender) {
updateContractAddresses(
_crosswordCore,
_crosswordPrizes,
_userProfiles,
_configManager,
_adminManager,
_publicCrosswordManager
);
}
/**
* @dev Update the addresses of the modular contracts
*/
function updateContractAddresses(
address _crosswordCore,
address _crosswordPrizes,
address _userProfiles,
address _configManager,
address _adminManager,
address _publicCrosswordManager
) public onlyOwner {
ValidationLib.validateNonZeroAddress(_crosswordCore, ErrorMessages.CROSSWORDBOARD_CORE_ZERO);
ValidationLib.validateNonZeroAddress(_crosswordPrizes, ErrorMessages.CROSSWORDBOARD_PRIZES_ZERO);
ValidationLib.validateNonZeroAddress(_userProfiles, ErrorMessages.CROSSWORDBOARD_PROFILES_ZERO);
ValidationLib.validateNonZeroAddress(_configManager, ErrorMessages.CROSSWORDBOARD_CONFIG_ZERO);
ValidationLib.validateNonZeroAddress(_adminManager, ErrorMessages.CROSSWORDBOARD_ADMIN_ZERO);
ValidationLib.validateNonZeroAddress(_publicCrosswordManager, ErrorMessages.CROSSWORDBOARD_ADMIN_ZERO); // Reusing error message
crosswordCore = ICrosswordCore(_crosswordCore);
crosswordPrizes = ICrosswordPrizes(_crosswordPrizes);
userProfiles = IUserProfiles(_userProfiles);
configManager = IConfigManager(_configManager);
adminManager = IAdminManager(_adminManager);
publicCrosswordManager = IPublicCrosswordManager(_publicCrosswordManager);
emit ContractsUpdated(_crosswordCore, _crosswordPrizes, _userProfiles, _configManager, _adminManager, _publicCrosswordManager);
}
// Convenience functions that delegate to the appropriate contracts
// Crossword Core Functions
function setCrossword(bytes32 crosswordId, string memory crosswordData) external {
crosswordCore.setCrossword(crosswordId, crosswordData);
}
function getCurrentCrossword() external view returns (bytes32, string memory, uint256) {
return crosswordCore.getCurrentCrossword();
}
function setSigner(address newSigner) external {
crosswordCore.setSigner(newSigner);
}
function completeCrossword(bytes32 crosswordId, uint256 durationMs, string calldata username, string calldata displayName, string calldata pfpUrl, bytes calldata signature) external {
crosswordCore.completeCrosswordForUser(msg.sender, crosswordId, durationMs, username, displayName, pfpUrl, signature);
// Record completion in prizes contract to determine if user is a winner
bool awardedPrize = crosswordPrizes.recordCompletion(crosswordId, msg.sender);
// If user was awarded a prize, they are a winner
if (awardedPrize) {
// User can now claim their prize manually via the leaderboard
}
}
function userCompletedCrossword(bytes32 crosswordId, address user) external view returns (bool) {
return crosswordCore.userCompletedCrossword(crosswordId, user);
}
function emergencyClearCrossword() external {
crosswordCore.emergencyClearCrossword();
}
// Crossword Prizes Functions
function createCrossword(bytes32 crosswordId, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external payable {
crosswordPrizes.createCrossword{value: msg.value}(crosswordId, token, prizePool, winnerPercentages, endTime);
}
function activateCrossword(bytes32 crosswordId) external {
crosswordPrizes.activateCrossword(crosswordId);
}
function claimPrize(bytes32 crosswordId) external {
crosswordPrizes.claimPrize(crosswordId);
}
function isWinner(bytes32 crosswordId, address user) external view returns (bool) {
return crosswordPrizes.isWinner(crosswordId, user);
}
function getUserRank(bytes32 crosswordId, address user) external view returns (uint256) {
return crosswordPrizes.getUserRank(crosswordId, user);
}
// Public Crossword Manager Functions
function createPublicCrossword(
bytes32 crosswordId,
string memory name,
string memory crosswordData,
string memory sponsoredBy
) external payable {
publicCrosswordManager.createCrossword{value: msg.value}(crosswordId, name, crosswordData, sponsoredBy);
// For crosswords without prize pools, we still need to ensure they exist in prizes contract
// to track completions properly, but with zero prize pool
try crosswordPrizes.createCrosswordWithoutValue(
crosswordId, address(0), 0, new uint256[](0), 0
) {
// If successful, activate it
try crosswordPrizes.activateCrossword(crosswordId) {
// Success
} catch {
// If activation fails, that's OK for no-prize crosswords
}
} catch {
// If creating in prizes contract fails, that's OK - it might already exist
}
}
function createPublicCrosswordWithNativeCELOPrizePool(
bytes32 crosswordId,
string memory name,
string memory crosswordData,
string memory sponsoredBy,
uint256 maxWinners,
uint256 prizePool,
uint256[] calldata winnerPercentages,
uint256 endTime
) external payable {
require(msg.value == prizePool, "Value must equal prize pool");
// Create the crossword in the public manager first (for tracking)
publicCrosswordManager.createCrosswordWithNativeCELOPrizePool{value: 0}(
crosswordId,
name,
crosswordData,
sponsoredBy,
maxWinners,
prizePool,
winnerPercentages,
endTime
);
// Create the crossword in the prizes contract and fund it with the received value
crosswordPrizes.createCrossword{value: msg.value}(
crosswordId,
address(0), // native CELO
prizePool,
winnerPercentages,
endTime
);
// Activate the crossword in prizes contract to allow completions
crosswordPrizes.activateCrossword(crosswordId);
}
/**
* @dev Function to fund the CrosswordPrizes contract with native CELO for a specific crossword
* @param crosswordId The ID of the crossword to fund
*/
function fundCrosswordPrizes(bytes32 crosswordId) external payable onlyOwner whenNotPaused {
crosswordPrizes.receiveNativeCELOForCrossword{value: msg.value}(crosswordId);
}
/**
* @dev Function to set the funding contract for CrosswordPrizes (should be called by admin)
* @param fundingContractAddr The address of the funding contract
*/
function setFundingContractForPrizes(address fundingContractAddr) external onlyOwner whenNotPaused {
crosswordPrizes.setFundingContract(fundingContractAddr);
}
function createPublicCrosswordWithPrizePool(
bytes32 crosswordId,
string memory name,
string memory crosswordData,
string memory sponsoredBy,
uint256 maxWinners,
address token,
uint256 prizePool,
uint256[] calldata winnerPercentages,
uint256 endTime
) external {
// Create the crossword in the public manager first (for tracking)
publicCrosswordManager.createCrosswordWithPrizePool(
crosswordId, name, crosswordData, sponsoredBy, maxWinners, token, prizePool, winnerPercentages, endTime
);
// Also create in prizes contract to track completions and prizes
crosswordPrizes.createCrosswordWithoutValue(
crosswordId, token, prizePool, winnerPercentages, endTime
);
// Activate the crossword in prizes contract to allow completions
crosswordPrizes.activateCrossword(crosswordId);
}
function activatePublicCrossword(bytes32 crosswordId) external {
publicCrosswordManager.activateCrossword(crosswordId);
}
function getPublicCrosswordDetails(bytes32 crosswordId) external view returns (
string memory name,
string memory sponsoredBy,
string memory crosswordData,
address token,
uint256 totalPrizePool,
uint256 maxWinners,
uint256[] memory winnerPercentages,
uint256 activationTime,
uint256 endTime,
uint256 createdAt,
bool isActive,
bool isCompleted,
address creator
) {
return publicCrosswordManager.getCrosswordDetails(crosswordId);
}
function getActivePublicCrosswords() external view returns (bytes32[] memory) {
return publicCrosswordManager.getActiveCrosswordIds();
}
function getAllPublicCrosswords() external view returns (bytes32[] memory) {
return publicCrosswordManager.getAllCrosswordIds();
}
function getCompletedCrosswords() external view returns (bytes32[] memory) {
bytes32[] memory allCrosswordIds = publicCrosswordManager.getAllCrosswordIds();
bytes32[] memory completedCrosswords = new bytes32[](allCrosswordIds.length);
uint256 completedCount = 0;
for (uint256 i = 0; i < allCrosswordIds.length; i++) {
try crosswordPrizes.getCrosswordDetails(allCrosswordIds[i]) returns (
address,
uint256,
uint256[] memory,
address[] memory,
uint256,
uint256,
uint8 state,
bool isFinalized
) {
// Check if the crossword is complete in the prizes contract
// State 2 corresponds to Complete (0=Inactive, 1=Active, 2=Complete)
if (state == 2 || isFinalized) {
completedCrosswords[completedCount] = allCrosswordIds[i];
completedCount++;
}
} catch {
// If the crossword doesn't exist in prizes contract, skip it
continue;
}
}
// Create result array with exact size
bytes32[] memory result = new bytes32[](completedCount);
for (uint256 i = 0; i < completedCount; i++) {
result[i] = completedCrosswords[i];
}
return result;
}
/**
* @dev Aggregated getCrosswordDetails for backward compatibility and easier frontend usage
*/
function getCrosswordDetails(bytes32 crosswordId) external view returns (
address token,
uint256 totalPrizePool,
uint256[] memory winnerPercentages,
ICrosswordCore.CrosswordCompletion[] memory completions,
uint256 activationTime,
uint256 endTime,
uint8 state,
string memory name,
string memory gridData,
string memory sponsoredBy
) {
// Get metadata from PublicCrosswordManager
(name, sponsoredBy, gridData, , , , , , , , , , ) = publicCrosswordManager.getCrosswordDetails(crosswordId);
// Get prize and state from CrosswordPrizes
try crosswordPrizes.getCrosswordDetails(crosswordId) returns (
address _token,
uint256 _totalPrizePool,
uint256[] memory _winnerPercentages,
address[] memory,
uint256 _activationTime,
uint256 _endTime,
uint8 _state,
bool
) {
token = _token;
totalPrizePool = _totalPrizePool;
winnerPercentages = _winnerPercentages;
activationTime = _activationTime;
endTime = _endTime;
state = _state;
} catch {
// If not found in prizes, metadata fields might still hold partial info
token = address(0);
totalPrizePool = 0;
activationTime = 0;
endTime = 0;
state = 0;
}
// Get completions from CrosswordCore
completions = crosswordCore.getCrosswordCompletions(crosswordId);
return (
token,
totalPrizePool,
winnerPercentages,
completions,
activationTime,
endTime,
state,
name,
gridData,
sponsoredBy
);
}
// User Profile Functions
function updateProfile(string calldata username, string calldata displayName, string calldata pfpUrl, string calldata bio, string calldata website) external {
userProfiles.updateProfile(username, displayName, pfpUrl, bio, website);
}
// Config Management Functions
function isReturnHomeButtonVisible() external view returns (bool) {
return configManager.getBoolConfigWithDefault("home_button_visible", true);
}
// Admin Management Functions
function isAdminAddress(address addr) external view returns (bool) {
return adminManager.isAdminAddress(addr);
}
// Pause/Unpause - all contracts
function pauseAll() external {
require(adminManager.isAdminAddress(msg.sender), ErrorMessages.CROSSWORDBOARD_NOT_ADMIN);
crosswordCore.pause();
crosswordPrizes.pause();
userProfiles.pause();
configManager.pause();
adminManager.pause();
publicCrosswordManager.pause();
}
function unpauseAll() external {
require(adminManager.isAdminAddress(msg.sender), ErrorMessages.CROSSWORDBOARD_NOT_ADMIN);
crosswordCore.unpause();
crosswordPrizes.unpause();
userProfiles.unpause();
configManager.unpause();
adminManager.unpause();
publicCrosswordManager.unpause();
}
// Fallback function to accept native CELO
receive() external payable {
// Funds received are assumed to be for prize pools and handled by the prizes contract
}
}// 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);
}
}// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
bool private _paused;
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
/**
* @dev The operation failed because the contract is paused.
*/
error EnforcedPause();
/**
* @dev The operation failed because the contract is not paused.
*/
error ExpectedPause();
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
if (paused()) {
revert EnforcedPause();
}
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title ErrorMessages
* @dev Library for standard error messages
*/
library ErrorMessages {
// Validation errors
string public constant ZERO_ADDRESS = "Zero address";
string public constant INVALID_SENDER = "Invalid sender";
string public constant VALUE_MISMATCH = "Value mismatch";
string public constant PRIZE_GT_ZERO = "Prize > 0";
string public constant DURATION_GT_ZERO = "Duration > 0";
string public constant DATA_EMPTY = "Data empty";
string public constant ALREADY_EXISTS = "Already exists";
string public constant DOES_NOT_EXIST = "Does not exist";
string public constant ALREADY_COMPLETED = "Already completed";
string public constant NO_CROSSWORD = "No crossword";
string public constant SIGNER_NOT_SET = "Signer not set";
string public constant MAX_COMPLETIONS = "Max completions";
string public constant INSUFFICIENT_BALANCE = "Insufficient balance";
string public constant TRANSFER_FAILED = "Transfer failed";
string public constant INVALID_SIGNATURE = "Invalid signature";
string public constant INVALID_RANK = "Invalid rank";
string public constant WINDOW_NOT_ELAPSED = "Window not elapsed";
string public constant TOO_MANY_WINNERS = "Too many winners";
string public constant PERCENTAGE_TOO_HIGH = "Percentage too high";
string public constant TOTAL_GT_100 = "Total > 100%";
string public constant END_TIME_TOO_FAR = "End time too far";
string public constant MAX_EXCEEDS_LIMIT = "Max exceeds limit";
string public constant ALREADY_CLAIMED = "Already claimed";
string public constant NOT_A_WINNER = "Not a winner";
string public constant NOT_OWNER_OR_ADMIN = "Not owner or admin";
string public constant NOT_ACTIVE_COMPLETE = "Not active/complete";
string public constant DEADLINE_PASSED = "Deadline passed";
string public constant TOKEN_NOT_ALLOWED = "Token not allowed";
string public constant PRIZE_POOL_GT_ZERO = "Prize > 0";
string public constant INVALID_END_TIME = "Invalid end time";
// String validation errors
string public constant INVALID_USERNAME = "Invalid username";
string public constant INVALID_DISPLAY_NAME = "Invalid display name";
string public constant PFPURL_TOO_LONG = "Pfp URL too long";
string public constant BIO_TOO_LONG = "bio too long";
string public constant WEBSITE_TOO_LONG = "website too long";
// UserProfiles specific errors
string public constant USERPROFILES_INVALID_USERNAME = "UserProfiles: invalid username length";
string public constant USERPROFILES_INVALID_DISPLAY_NAME = "UserProfiles: invalid display name length";
string public constant USERPROFILES_PFPURL_TOO_LONG = "UserProfiles: pfpUrl too long";
// AdminManager specific errors
string public constant ADMINMANAGER_ZERO_ADDRESS = "AdminManager: admin address cannot be zero";
string public constant ADMINMANAGER_ALREADY_EXISTS = "AdminManager: admin already exists";
string public constant ADMINMANAGER_DOES_NOT_EXIST = "AdminManager: admin does not exist";
string public constant ADMINMANAGER_CANNOT_REMOVE_OWNER = "AdminManager: cannot remove owner";
string public constant OPERATOR_ZERO_ADDRESS = "AdminManager: operator address cannot be zero";
// CrosswordBoard specific errors
string public constant CROSSWORDBOARD_CORE_ZERO = "CrosswordBoard: core address cannot be zero";
string public constant CROSSWORDBOARD_PRIZES_ZERO = "CrosswordBoard: prizes address cannot be zero";
string public constant CROSSWORDBOARD_PROFILES_ZERO = "CrosswordBoard: profiles address cannot be zero";
string public constant CROSSWORDBOARD_CONFIG_ZERO = "CrosswordBoard: config address cannot be zero";
string public constant CROSSWORDBOARD_ADMIN_ZERO = "CrosswordBoard: admin address cannot be zero";
string public constant CROSSWORDBOARD_NOT_ADMIN = "CrosswordBoard: caller is not an admin";
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @title ValidationLib
* @dev Library for common validation functions
*/
library ValidationLib {
/**
* @dev Validates that an address is not zero
*/
function validateNonZeroAddress(address addr, string memory errorMessage) internal pure {
require(addr != address(0), errorMessage);
}
/**
* @dev Validates string length is within bounds
*/
function validateStringLength(string memory str, uint256 minLength, uint256 maxLength, string memory errorMessage) internal pure {
uint256 len = bytes(str).length;
require(len >= minLength && len <= maxLength, errorMessage);
}
/**
* @dev Validates string length is within bounds (only minimum)
*/
function validateStringLengthMin(string memory str, uint256 minLength, string memory errorMessage) internal pure {
uint256 len = bytes(str).length;
require(len >= minLength, errorMessage);
}
/**
* @dev Validates string length is within bounds (only maximum)
*/
function validateStringLengthMax(string memory str, uint256 maxLength, string memory errorMessage) internal pure {
uint256 len = bytes(str).length;
require(len <= maxLength, errorMessage);
}
/**
* @dev Validates uint256 value is greater than zero
*/
function validateGreaterThanZero(uint256 value, string memory errorMessage) internal pure {
require(value > 0, errorMessage);
}
/**
* @dev Validates uint256 value is within bounds
*/
function validateRange(uint256 value, uint256 minValue, uint256 maxValue, string memory errorMessage) internal pure {
require(value >= minValue && value <= maxValue, errorMessage);
}
/**
* @dev Validates uint256 value is within bounds (only minimum)
*/
function validateMinValue(uint256 value, uint256 minValue, string memory errorMessage) internal pure {
require(value >= minValue, errorMessage);
}
/**
* @dev Validates uint256 value is within bounds (only maximum)
*/
function validateMaxValue(uint256 value, uint256 maxValue, string memory errorMessage) internal pure {
require(value <= maxValue, errorMessage);
}
}{
"evmVersion": "paris",
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"details": {
"constantOptimizer": true,
"cse": true,
"deduplicate": true,
"inliner": true,
"jumpdestRemover": true,
"orderLiterals": true,
"peephole": true,
"simpleCounterForLoopUncheckedIncrement": true,
"yul": true,
"yulDetails": {
"optimizerSteps": "dhfoDgvlFnTUtnIfxxxxxxx:fDnTOcmuO",
"stackAllocation": true
}
},
"runs": 0
},
"remappings": [],
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_crosswordCore","type":"address"},{"internalType":"address","name":"_crosswordPrizes","type":"address"},{"internalType":"address","name":"_userProfiles","type":"address"},{"internalType":"address","name":"_configManager","type":"address"},{"internalType":"address","name":"_adminManager","type":"address"},{"internalType":"address","name":"_publicCrosswordManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"core","type":"address"},{"indexed":false,"internalType":"address","name":"prizes","type":"address"},{"indexed":false,"internalType":"address","name":"profiles","type":"address"},{"indexed":false,"internalType":"address","name":"config","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"publicManager","type":"address"}],"name":"ContractsUpdated","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"activateCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"activatePublicCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminManager","outputs":[{"internalType":"contract IAdminManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"claimPrize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"uint256","name":"durationMs","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"internalType":"string","name":"displayName","type":"string"},{"internalType":"string","name":"pfpUrl","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"completeCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configManager","outputs":[{"internalType":"contract IConfigManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"createCrossword","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"}],"name":"createPublicCrossword","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"},{"internalType":"uint256","name":"maxWinners","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"createPublicCrosswordWithNativeCELOPrizePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"},{"internalType":"uint256","name":"maxWinners","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"createPublicCrosswordWithPrizePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crosswordCore","outputs":[{"internalType":"contract ICrosswordCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crosswordPrizes","outputs":[{"internalType":"contract ICrosswordPrizes","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyClearCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"fundCrosswordPrizes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getActivePublicCrosswords","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPublicCrosswords","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCompletedCrosswords","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"getCrosswordDetails","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"totalPrizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"completionTimestamp","type":"uint256"},{"internalType":"uint256","name":"durationMs","type":"uint256"}],"internalType":"struct ICrosswordCore.CrosswordCompletion[]","name":"completions","type":"tuple[]"},{"internalType":"uint256","name":"activationTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint8","name":"state","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"gridData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCrossword","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"getPublicCrosswordDetails","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"totalPrizePool","type":"uint256"},{"internalType":"uint256","name":"maxWinners","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"activationTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isCompleted","type":"bool"},{"internalType":"address","name":"creator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"}],"name":"getUserRank","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAdminAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReturnHomeButtonVisible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"}],"name":"isWinner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCrosswordManager","outputs":[{"internalType":"contract IPublicCrosswordManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"crosswordData","type":"string"}],"name":"setCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fundingContractAddr","type":"address"}],"name":"setFundingContractForPrizes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_crosswordCore","type":"address"},{"internalType":"address","name":"_crosswordPrizes","type":"address"},{"internalType":"address","name":"_userProfiles","type":"address"},{"internalType":"address","name":"_configManager","type":"address"},{"internalType":"address","name":"_adminManager","type":"address"},{"internalType":"address","name":"_publicCrosswordManager","type":"address"}],"name":"updateContractAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"username","type":"string"},{"internalType":"string","name":"displayName","type":"string"},{"internalType":"string","name":"pfpUrl","type":"string"},{"internalType":"string","name":"bio","type":"string"},{"internalType":"string","name":"website","type":"string"}],"name":"updateProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"}],"name":"userCompletedCrossword","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userProfiles","outputs":[{"internalType":"contract IUserProfiles","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523461002f5761002061001461010c565b94939093929192610132565b6040516131a9908161084e8239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761006b57604052565b610034565b9061008461007d60405190565b928361004a565b565b6001600160a01b031690565b90565b61009e81610086565b0361002f57565b9050519061008482610095565b909160c08284031261002f576100c883836100a5565b926100d681602085016100a5565b926100e482604083016100a5565b926100926100f584606085016100a5565b9360a061010582608087016100a5565b94016100a5565b61012a6139f78038038061011f81610070565b9283398101906100b2565b909192939495565b90610084959493929161014433610149565b6106c0565b61008490610195565b6100926100926100929290565b6100926001610152565b90600019905b9181191691161790565b61018861009261019092610152565b600154610169565b600155565b61019e906101e1565b6100846101a961015f565b610179565b6100866100926100929290565b610092906101ae565b6101cd90610086565b9052565b60208101929161008491906101c4565b60006101ec816101bb565b6101f581610086565b6101fe84610086565b1461020e575050610084906106fe565b631e4fbdf760e01b8252819061022790600483016101d1565b0390fd5b90610084959493929161023c610753565b6105b2565b6001600160401b03811161006b57602090601f01601f19160190565b0190565b61027361026e602b610241565b610070565b90602b8252565b61028761026e602d610241565b90602d8252565b61029b61026e602f610241565b90602f8252565b6102af61026e602c610241565b90602c8252565b6102be610261565b7f43726f7373776f7264426f6172643a20636f726520616464726573732063616e60208201526a6e6f74206265207a65726f60a81b604082015290565b6100926102b6565b6100926102fb565b61031361027a565b7f43726f7373776f7264426f6172643a207072697a65732061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b61009261030b565b610092610352565b61036a61028e565b7f43726f7373776f7264426f6172643a2070726f66696c6573206164647265737360208201526e2063616e6e6f74206265207a65726f60881b604082015290565b610092610362565b6100926103ab565b6103c361027a565b7f43726f7373776f7264426f6172643a20636f6e6669672061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b6100926103bb565b610092610402565b61041a6102a2565b7f43726f7373776f7264426f6172643a2061646d696e206164647265737320636160208201526b6e6e6f74206265207a65726f60a01b604082015290565b610092610412565b610092610458565b61009290610086906001600160a01b031682565b61009290610468565b6100929061047c565b90610100600160a81b039060081b61016f565b6104b06100926104b892610485565b60025461048e565b600255565b906001600160a01b039061016f565b6104db6100926104e392610485565b6003546104bd565b600355565b6104f76100926104ff92610485565b6004546104bd565b600455565b61051361009261051b92610485565b6005546104bd565b600555565b61052f61009261053792610485565b6006546104bd565b600655565b61054b61009261055392610485565b6007546104bd565b600755565b91946105a16105ab9298979561059760a09661058d6100849a61058360c08a019e60008b01906101c4565b60208901906101c4565b60408701906101c4565b60608501906101c4565b60808301906101c4565b01906101c4565b92936106bb929591946105cc6105c6610303565b86610824565b6105dd6105d761035a565b87610824565b6105ee6105e86103b3565b88610824565b6105ff6105f961040a565b82610824565b61061061060a610460565b83610824565b61062161061b610460565b84610824565b61063261062d86610485565b6104a1565b61064361063e87610485565b6104cc565b61065461064f88610485565b6104e8565b61066561066082610485565b610504565b61067661067183610485565b610520565b61068761068284610485565b61053c565b7f49e1de879727329b7d4d720127457a2857bcb190b237b00840edb50feb9361e0966106b260405190565b96879687610558565b0390a1565b90610084959493929161022b565b61009290610086565b6100926000546106ce565b6106f16100926106f992610485565b6000546104bd565b600055565b6107066106d7565b90610710816106e2565b61074361073d7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610485565b91610485565b9161074d60405190565b600090a3565b61075b610845565b339061076f61076983610086565b91610086565b036107775750565b63118cdaa760e01b60009081529081906102279060046101d1565b60005b8381106107a55750506000910152565b8181015183820152602001610795565b6107d66107df60209361025d936107ca815190565b80835293849260200190565b95869101610792565b601f01601f191690565b6020808252610092929101906107b5565b156108025750565b6102279061080f60405190565b62461bcd60e51b8152918291600483016107e9565b906100849161083e61076961083960006101bb565b610086565b14156107fa565b6100926106d756fe60e0604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630236bb5a1461027b57806303ff1a96146102765780630a713d68146102715780630f9969481461026c578063182296c3146102675780631a831f16146102625780631dc626b11461025d578063317d609b1461025857806339a84e5a146102535780633ab2648a1461024e57806340553dcd1461024957806347ce16f614610244578063595c6a671461023f5780635c975abb1461023a5780636c19e78314610235578063715018a6146102305780637807bd3c1461022b5780637849dbaa146102265780637e82686314610221578063842a42e31461021c5780638a2ddd03146102175780638da5cb5b146102125780639745808a1461020d5780639cc19f5b14610208578063a210b6a414610203578063a5f00e7d146101fe578063b043e032146101f9578063b0fc9440146101f4578063b55c3f97146101ef578063c4dc53d3146101ea578063ca0ab075146101e5578063cd10f4c6146101e0578063d9e268f7146101db578063ec03a37a146101d6578063f2fde38b146101d1578063f4b53f71146101cc578063f6ebc190146101c75763f8e5cbdb0361000e57611022565b610f42565b610ed4565b610ebe565b610e86565b610d16565b610cf3565b610c1b565b610bf9565b610be0565b610bbe565b610b9b565b610aee565b610ad5565b610aaf565b610a85565b610a60565b610a31565b610a1b565b610a0a565b6109e2565b61094f565b6108d1565b6108bb565b6108a2565b61088c565b610871565b6107b1565b61078d565b6106d9565b6105f9565b6104d9565b61049b565b61046a565b6103e2565b610349565b61032e565b6102d6565b6001600160a01b031690565b61029590610280565b90565b6102a18161028c565b036102a857565b600080fd5b905035906102ba82610298565b565b602060048203126102a8576102959060046102ad565b9052565b346102a8576103016102ef6102ea366102bc565b61109d565b60405191829182901515815260200190565b0390f35b806102a1565b905035906102ba82610305565b602060048203126102a85761029590600461030b565b346102a85761034461033f36610318565b61112b565b604051005b346102a85761034461035a36610318565b6111b7565b600460009103126102a857565b60009103126102a857565b0190565b9061039b61039461038a845190565b8084529260200190565b9260200190565b9060005b8181106103ac5750505090565b9091926103c96103c26001928651815260200190565b9460200190565b92910161039f565b60208082526102959291019061037b565b346102a8576103f03661035f565b6103016103fb611274565b604051918291826103d1565b610295916008021c610280565b610280565b906102959154610407565b61029560006007610419565b61041461029561029592610280565b61029590610430565b6102959061043f565b6102d290610448565b6020810192916102ba9190610451565b346102a8576104783661035f565b610301610483610424565b6040519182918261045a565b61029560016002610419565b346102a8576104a93661035f565b61030161048361048f565b906004916040838203126102a8576102959060206104d2828661030b565b94016102ad565b346102a8576103016102ef6104ed366104b4565b90611305565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761052a57604052565b6104f3565b604051906102ba606083610509565b906102ba61054b60405190565b9283610509565b6001600160401b03811161052a57602090601f01601f19160190565b90826000939282370152565b9092919261058f61058a82610552565b61053e565b93818552818301116102a8576102ba91602085019061056e565b9080601f830112156102a8578160206102959335910161057a565b9060046040818403126102a8576105db838261030b565b9260208201356001600160401b0381116102a85761029592016105a9565b346102a85761034461060a366105c4565b90611361565b909182601f830112156102a8578135916001600160401b0383116102a85760200192600183028401116102a857565b60049060c0828203126102a857610656818361030b565b92610664826020850161030b565b926001600160401b039160408201358381116102a85784610686918401610610565b93909460608401358281116102a857816106a1918601610610565b93909460808101358481116102a857836106bc918301610610565b93909460a08301359081116102a8576106d59201610610565b9091565b346102a8576103446106ea3661063f565b9897909796919695929594939461142e565b909182601f830112156102a8578135916001600160401b0383116102a85760200192602083028401116102a857565b60049160a0838303126102a857610742828461030b565b9261075083602083016102ad565b9261075e816040840161030b565b9260608301356001600160401b0381116102a857826107846080946102959387016106fc565b9490950161030b565b6103446107993661072b565b94939093929192611588565b61029560006003610419565b346102a8576107bf3661035f565b6103016104836107a5565b906004610100818403126102a8576107e2838261030b565b926001600160401b039260208301358481116102a857826108049185016105a9565b9360408401358181116102a8578361081d9186016105a9565b9360608101358281116102a857846108369183016105a9565b93610844816080840161030b565b936108528260a0850161030b565b9360c08401359081116102a8578261078460e0946102959387016106fc565b61034461087d366107ca565b979690969591959492946116d8565b346102a85761089a3661035f565b610344611943565b346102a8576108b03661035f565b6103016102ef611bcd565b346102a8576103446108cc366102bc565b611bd5565b346102a8576108df3661035f565b610344611c1a565b60046080818303126102a8576108fd828261030b565b926001600160401b039160208101358381116102a8578461091f9183016105a9565b9360408201358481116102a857816109389184016105a9565b9360608301359081116102a85761029592016105a9565b61034461095b366108e7565b92919091611ccd565b60005b8381106109775750506000910152565b8181015183820152602001610967565b6109a86109b16020936103779361099c815190565b80835293849260200190565b95869101610964565b601f01601f191690565b90815292916102ba916040906109dd9060608701908782036020890152610987565b940152565b346102a8576109f03661035f565b6103016109fb611eb2565b604051919391938493846109bb565b610344610a1636610318565b611f72565b346102a857610a293661035f565b610344611f7b565b346102a857610a3f3661035f565b610344611fb4565b6102d29061028c565b6020810192916102ba9190610a47565b346102a857610a6e3661035f565b610301610a79612037565b60405191829182610a50565b346102a857610301610a9f610a99366104b4565b90612053565b6040519182918290815260200190565b346102a8576103016102ef610ac3366104b4565b906120c3565b61029560006006610419565b346102a857610ae33661035f565b610301610483610ac9565b346102a857610afc3661035f565b6103016102ef6120f1565b60049060a0828203126102a8576001600160401b0382358181116102a85782610b31918501610610565b93909460208201358381116102a85784610b4c918401610610565b93909460408401358281116102a85781610b67918601610610565b93909460608101358481116102a85783610b82918301610610565b93909460808301359081116102a8576106d59201610610565b346102a857610344610bac36610b07565b989790979691969592959493946121b2565b346102a857610344610bcf36610318565b6121f0565b61029560006004610419565b346102a857610bee3661035f565b610301610483610bd4565b346102a857610344610c0a366102bc565b612258565b61029560006005610419565b346102a857610c293661035f565b610301610483610c0f565b90600491610120838203126102a857610c4d818461030b565b926001600160401b039160208201358381116102a85781610c6f9184016105a9565b9360408301358481116102a85782610c889185016105a9565b9360608401358181116102a85783610ca19186016105a9565b93610caf846080830161030b565b93610cbd8160a084016102ad565b93610ccb8260c0850161030b565b9360e08401359081116102a857610ce7836102959286016106fc565b9390946101000161030b565b346102a857610344610d0436610c34565b989790979691969592959493946122e9565b346102a857610d243661035f565b6103016103fb61243b565b90610d3e61039461038a845190565b9060005b818110610d4f5750505090565b909192610d656103c26001928651815260200190565b929101610d42565b906040806102ba93610d8760008201516000860190610a47565b610d9660208201516020860152565b0151910152565b9061037781606093610d6d565b90610db961039461038a845190565b9060005b818110610dca5750505090565b909192610ddd6103c26001928651610d9d565b929101610dbd565b9895610e5190610e4a610e428c610e6899986102959f9d98610e779d97610e3491610e27610e5b9b610e206101408801946000890190610a47565b6020870152565b8482036040860152610d2f565b916060818403910152610daa565b9660808d0152565b60a08b0152565b60ff1660c0890152565b86820360e0880152610987565b90848203610100860152610987565b91610120818403910152610987565b346102a857610301610e9f610e9a36610318565b6127c4565b96610eb59a989a96919695929594939460405190565b9a8b9a8b610de5565b346102a857610344610ecf366102bc565b6129bc565b346102a857610ee23661035f565b6103016103fb612a24565b9060049060c0828403126102a857610f0583836102ad565b92610f1381602085016102ad565b92610f2182604083016102ad565b92610295610f3284606085016102ad565b9360a06104d282608087016102ad565b346102a857610344610f5336610eed565b94939093929192612fd1565b9890610fef61101b999f9e9c96956102ba9e99610fe26110119a6101809f988f610fde6110079c610fd7610fcc60a095610fbe610fff9f610fb0610ff79f6101a08a01908a820360008c0152610987565b9088820360208a0152610987565b908682036040880152610987565b986060850190610a47565b6080830152565b0152565b8c820360c08e0152610d2f565b9e60e08b0152565b610100890152565b610120870152565b1515610140850152565b1515610160830152565b0190610a47565b346102a85761030161103b61103636610318565b612fdf565b996110549d9b9d99919998929897939796949660405190565b9d8e9d8e610f5f565b61029560065461028c565b8015156102a1565b905051906102ba82611068565b906020828203126102a85761029591611070565b6040513d6000823e3d90fd5b60206110ce6110b26110ad61105d565b610448565b630236bb5a6110d96110c360405190565b958694859360e01b90565b835260048301610a50565b91815a930392fa90811561111b576000916110f2575090565b610295915060203d602011611114575b61110c8183610509565b81019061107d565b503d611102565b611091565b61029560075461028c565b6111366110ad611120565b630a713d6890803b156102a85761115e9161116c61115360405190565b948594859360e01b90565b835260048301526024820190565b600094858094825a940393f1801561111b57611186575050565b816102ba92903d106111a5575b61119d8183610509565b81019061036c565b503d611193565b61029560035461028c565b6111366110ad6111ac565b6001600160401b03811161052a5760208091020190565b905051906102ba82610305565b929190926111f661058a856111c2565b938085526020928380870192028301928184116102a857915b83831061121d575050505050565b84809161122a84866111d9565b81520192019161120f565b9080601f830112156102a8578151610295926020016111e6565b906020828203126102a85781516001600160401b0381116102a8576102959201611235565b61129c60006112846110ad611120565b6319e2ba7c9061129360405190565b93849260e01b90565b8252816004810191815a930392fa90811561111b576000916112bc575090565b61029591503d806000833e6112d18183610509565b81019061124f565b6102959060081c610280565b6102956002546112d9565b9081526040810192916102ba9160209061101b565b9061133e602091611314600090565b506113206110ad6112e5565b906110d9631dc626b19161133360405190565b968795869460e01b90565b8452600484016112f0565b90815260406020820181905261029592910190610987565b9061136d6110ad6112e5565b63317d609b813b156102a85761116c6113949361138960405190565b958695869460e01b90565b845260048401611349565b91906109b1816113b6816103779560209181520190565b809561056e565b99979592906102959b9995611412956113f76114049460408f610fde6114209e996113f060e08401996000850190610a47565b6020830152565b8c830360608e015261139f565b9189830360808b015261139f565b9186830360a088015261139f565b9260c081850391015261139f565b9892979196909394956114426110ad6112e5565b9663f982c36296883b156102a8578b9a61146e9a61147a9861146360405190565b9d8e9d8e9c60e01b90565b8c523360048d016113bd565b600094858094825a940393f1801561111b576114fd575b5060206114bf6114a26110ad6111ac565b63d9cbe53c846114cc6114b460405190565b978895869460e01b90565b84523390600485016112f0565b92825a940393f190811561111b57506114e25750565b6114fa9060203d6020116111145761110c8183610509565b50565b61151390823d84116111a55761119d8183610509565b38611491565b9037565b8183529091602001916001600160fb1b0381116102a857829160206103779202938491611519565b969593946102ba9561157b6080956115746109dd9661156a8d97600060a08a01990152565b60208d0190610a47565b60408b0152565b88830360608a015261151d565b94919293906115986110ad6111ac565b92633ab2648a92843b156102a8576000966115c5966115d0946115ba60405190565b9a8b998a9860e01b90565b885260048801611545565b815a9103923491f1801561111b576115e55750565b6102ba90600061119d8183610509565b156115fc57565b60405162461bcd60e51b815260206004820152601b60248201527a15985b1d59481b5d5cdd08195c5d585b081c1c9a5e99481c1bdbdb602a1b604482015280606481015b0390fd5b6102956102956102959290565b9998969195610e4a6116ad8c6109dd989761169f6102ba9d986116916116b59860e09e6116846101008801926000890152565b8682036020880152610987565b908482036040860152610987565b916060818403910152610987565b9560808d0152565b88830360c08a015261151d565b6104146102956102959290565b610295906116c2565b96949290979593916116f16116ea8590565b34146115f5565b6116fc6110ad611120565b63427b88ee60009a61170d8c611644565b90833b156102a8578a8a8a8f988f9a8c9161173a9a6117459761172f60405190565b9e8f9d8e9c60e01b90565b8c5260048c01611651565b92825a940393f1801561111b57611822575b506117636110ad6111ac565b90633ab2648a90611773886116cf565b95833b156102a8578895611799956117a59361178e60405190565b998a98899760e01b90565b87528b60048801611545565b815a9103923491f1801561111b57611806575b506117c46110ad6111ac565b630a713d68813b156102a85783916117e391836117f161133360405190565b845260048401526024830190565b92825a940393f1801561111b57611186575050565b61181c90833d85116111a55761119d8183610509565b386117b8565b61183890873d89116111a55761119d8183610509565b38611757565b61184b61058a6026610552565b9060268252565b61185f61058a602b610552565b90602b8252565b61187361058a602d610552565b90602d8252565b61188761058a602f610552565b90602f8252565b61189b61058a602c610552565b90602c8252565b6118aa61183e565b7f43726f7373776f7264426f6172643a2063616c6c6572206973206e6f7420616e6020820152651030b236b4b760d11b604082015290565b6102956118a2565b6102956118e2565b602080825261029592910190610987565b1561190b5750565b6116409061191860405190565b62461bcd60e51b8152918291600483016118f2565b61029560045461028c565b61029560055461028c565b61194e6110ad61105d565b630236bb5a61196661195f60405190565b9160e01b90565b81526020816004938161197b33878301610a50565b91815a930392fa801561111b576119a391600091611b98575b5061199d6118ea565b90611903565b6119ae6110ad6112e5565b90638456cb5991803b156102a8576119d2926119c960405190565b93849160e01b90565b8082529181848101600096878094825a940393f1801561111b57611b7c575b506119fd6110ad6111ac565b803b156102a85783611a0e60405190565b838152918290818387820192825a940393f1801561111b57611b60575b50611a376110ad61192d565b803b156102a85783611a4860405190565b838152918290818387820192825a940393f1801561111b57611b44575b50611a716110ad611938565b803b156102a85783611a8260405190565b838152918290818387820192825a940393f1801561111b57611b28575b50611aab6110ad61105d565b803b156102a85783611abc60405190565b838152918290818387820192825a940393f1801561111b57611b0c575b50611ae56110ad611120565b91823b156102a8576117f192849283611afd60405190565b95869485938452830160000190565b611b2290843d86116111a55761119d8183610509565b38611ad9565b611b3e90843d86116111a55761119d8183610509565b38611a9f565b611b5a90843d86116111a55761119d8183610509565b38611a65565b611b7690843d86116111a55761119d8183610509565b38611a2b565b611b9290843d86116111a55761119d8183610509565b386119f1565b611bb1915060203d6020116111145761110c8183610509565b38611994565b610295905b60ff1690565b610295600254611bb7565b610295611bc2565b611be06110ad6112e5565b636c19e78390803b156102a8576110ce9161116c61115360405190565b611c05613082565b6102ba6102ba611c1560006116cf565b6130dd565b6102ba611bfd565b9261169161169f92610295969461168460808801926000890152565b90611c4b61058a836111c2565b918252565b369037565b906102ba611c6b611c6584611c3e565b936111c2565b601f190160208401611c50565b6102d290611644565b6102ba94611cb882989795611cae608096611ca4611cc597600060a08901980152565b60208c0190610a47565b60408a0190611c78565b8782036060890152610d2f565b940190611c78565b929091611cdb6110ad611120565b9063d25e3fc690823b156102a857611d0593611d1191611cfa60405190565b968796879560e01b90565b85528860048601611c22565b916000948593815a9103923491f1801561111b57611e0f575b50611d366110ad6111ac565b63f39130e5611d44836116cf565b91611d56611d5185611644565b611c55565b90803b156102a857849283611d7f81611d73958161178e60405190565b87528c60048801611c81565b92825a940393f19081611df3575b50611d96575050565b611da16110ad6111ac565b630a713d68813b156102a85782916117e39183611dc06114b460405190565b92825a940393f19182611dd6575b50506102ba57565b81611dec92903d106111a55761119d8183610509565b3880611dce565b611e0990833d85116111a55761119d8183610509565b38611d8d565b611e2590823d84116111a55761119d8183610509565b38611d2a565b90929192611e3b61058a82610552565b93818552818301116102a8576102ba916020850190610964565b9080601f830112156102a857815161029592602001611e2b565b90916060828403126102a857611e8583836111d9565b602083015190936001600160401b0382116102a8576040611eab82610295948701611e55565b94016111d9565b611eda90611ec16110ad6112e5565b90637849dbaa91611ed160405190565b93849360e01b90565b835282600481016000958693815a930392fa91821561111b578390848094611f04575b5050929190565b9150919350611f2592503d8091833e611f1d8183610509565b810190611e6f565b913880949294611efd565b6102ba90611f3c613082565b6102ba90611f48613132565b611f536110ad6111ac565b63e7b09cea813b156102a85760009161115e916115d06110c360405190565b6102ba90611f30565b611f866110ad6112e5565b63842a42e3813b156102a857611fa891611f9f60405190565b92839260e01b90565b8252816004810161116c565b611fbf6110ad61105d565b630236bb5a611fd061195f60405190565b815260208160049381611fe533878301610a50565b91815a930392fa801561111b5761200691600091611b98575061199d6118ea565b6120116110ad6112e5565b90633f4ba83a91803b156102a8576119d2926119c960405190565b61029560005461028c565b61029561202c565b906020828203126102a857610295916111d9565b9061133e602091612062600090565b5061206e6110ad6111ac565b90612081639745808a9161133360405190565b91815a930392fa90811561111b5760009161209a575090565b610295915060203d6020116120bc575b6120b48183610509565b81019061203f565b503d6120aa565b9061133e6020916120d2600090565b506120de6110ad6111ac565b906110d9639cc19f5b9161133360405190565b61211060206121016110ad611938565b636bc122c99061129360405190565b8252604060048301526013604483015272686f6d655f627574746f6e5f76697369626c6560681b60648301526001602483015281608481016110d9565b98969491612196936102959b999561217a8c612188946121a49b9660a0830192600081850391015261139f565b8c810360208e01529161139f565b9189830360408b015261139f565b91868303606088015261139f565b92608081850391015261139f565b9893969197929590946121c66110ad61192d565b9763b043e03297893b156102a8576121e59a61116c9861146360405190565b8c5260048c0161214d565b6121fb6110ad6111ac565b63b0fc944090803b156102a85761115e9161116c61115360405190565b6102ba90612224613082565b6102ba90612230613132565b61223b6110ad6111ac565b631c294efd90803b156102a8576110ce9161116c61115360405190565b6102ba90612218565b9a9997926109dd966122cb8d9760806122c66102ba9e996122b88c6101009f99986122aa6122d59a6122dc9d61229d6101208601926000870152565b8482036020860152610987565b916040818403910152610987565b8c810360608e015290610987565b990152565b60a08d0190610a47565b60c08b0152565b88830360e08a015261151d565b9896949795939290919860805260c0526123046110ad611120565b97883b156102a857848489612341958a958a9561232060405190565b60a0526330df0a5760e21b60a0515260c05191608051600460a05101612261565b9560009687915a8360a0519360a05190039260a05192f1801561111b5761240a575b61236e6110ad6111ac565b9163f39130e591833b156102a857879561239195879361239f936115ba60405190565b885260805160048901611545565b92825a940393f1801561111b576123ee575b506123bd6110ad6111ac565b630a713d6890803b156102a8576123d991839161129360405190565b825260805160048301528183602482016117f1565b61240490823d84116111a55761119d8183610509565b386123b1565b853d8711612434575b8061242361242f9260a051610509565b60a0510160a05161036c565b612363565b503d612413565b61129c600061244b6110ad611120565b63321c7dc49061129360405190565b905051906102ba82610298565b9291909261247761058a856111c2565b938085526020928380870192028301928184116102a857915b83831061249e575050505050565b8480916124ab84866111d9565b815201920191612490565b9080601f830112156102a857815161029592602001612467565b916101a0838303126102a85782516001600160401b0392908381116102a857816124fb918601611e55565b9360208101518481116102a85782612514918301611e55565b9360408201518181116102a8578361252d918401611e55565b9361253b846060850161245a565b9361254981608086016111d9565b936125578260a083016111d9565b9360c08201519081116102a857826125709183016124b6565b9261257e8360e084016111d9565b9261258d8161010085016111d9565b9261259c8261012083016111d9565b926102956125ae846101408501611070565b936125bd816101608601611070565b936101800161245a565b929190926125d761058a856111c2565b938085526020928380870192028301928184116102a857915b8383106125fe575050505050565b84809161260b848661245a565b8152019201916125f0565b9080601f830112156102a8578151610295926020016125c7565b60ff81166102a1565b905051906102ba82612630565b9190610100838203126102a85761265d818461245a565b9261266b82602083016111d9565b604082015190936001600160401b039390918481116102a857816126909185016124b6565b9360608401519081116102a857816126a9918501612616565b926126b782608083016111d9565b926102956126c88460a085016111d9565b9360e06126d88260c08701612639565b9401611070565b611bbc6102956102959290565b91906060838203126102a85761272b90604061270661052f565b94612711838261245a565b865261272083602083016111d9565b6020870152016111d9565b6040830152565b92919261274161058a836111c2565b93828552602090602086019060608095028401938185116102a857915b84831061276d57505050505050565b83869161277a84866126ec565b81520192019161275e565b9080601f830112156102a857815161029592602001612732565b906020828203126102a85781516001600160401b0381116102a8576102959201612785565b6060906127e5906127d66110ad611120565b63ec03a37a91611ed160405190565b808452600484018290529183602481016000968793815a930392fa91821561111b57849085948694612935575b508561281f6110ad6111ac565b9161282960405190565b928391825281612840876004830190815260200190565b91815a930392fa86908792889389938a938b9381612904575b506128ef5750505050505061286d856116cf565b9261287786611644565b9485988695612885896126df565b955b8961115e6128966110ad6112e5565b63a090a3566128a76110c360405190565b91815a930392fa998a1561111b57809a6128ca575b505099989796959493929190565b6128e7929a503d8091833e6128df8183610509565b81019061279f565b9738806128bc565b909197949b9298939a50909a99979695612887565b9450955050505061292791503d8089833e61291f8183610509565b810190612646565b509396909492959195612859565b915093506129569192503d8086833e61294e8183610509565b8101906124d0565b505050505050505050949093929194612812565b6102ba90612976613082565b6000612981816116cf565b61298a8161028c565b6129938461028c565b146129a35750506102ba906130dd565b631e4fbdf760e01b825281906116409060048301610a50565b6102ba9061296a565b634e487b7160e01b600052603260045260246000fd5b906129e4825190565b8110156129f5576020809102010190565b6129c5565b634e487b7160e01b600052601160045260246000fd5b6000198114612a1f5760010190565b6129fa565b612a33906112846110ad611120565b8252600490828281016000968793815a930392fa91821561111b578492612bbc575b50612a61611d51835190565b90612a6b85611644565b94855b612a79610295865190565b811015612b7057612a8b6110ad6111ac565b82612ab363ec03a37a92612aa6612aa2868b6129db565b5190565b93612ac16110c360405190565b835289830190815260200190565b91815a930392fa908184918593612b4c575b50612ae7575050600101612a6e565b612a6e565b612afb612af460026126df565b9160ff1690565b14908115612b44575b50612b12575b600101612a6e565b95612b3c612ae291612b37612b2a612aa28b8a6129db565b612b3483896129db565b52565b612a10565b969050612b0a565b905038612b04565b909250612b6391503d8086833e61291f8183610509565b9795509550505050612ad3565b509391925050612b88612b8285611c55565b93611644565b845b811015612bb557612bae81612ba8612b2a612aa2612b8a95886129db565b60010190565b9050612b88565b5092505090565b612bd19192503d8086833e6112d18183610509565b9038612a55565b906102ba9594939291612be9613082565b612ec3565b612bf6611852565b7f43726f7373776f7264426f6172643a20636f726520616464726573732063616e60208201526a6e6f74206265207a65726f60a81b604082015290565b610295612bee565b610295612c33565b612c4b611866565b7f43726f7373776f7264426f6172643a207072697a65732061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612c43565b610295612c8a565b612ca261187a565b7f43726f7373776f7264426f6172643a2070726f66696c6573206164647265737360208201526e2063616e6e6f74206265207a65726f60881b604082015290565b610295612c9a565b610295612ce3565b612cfb611866565b7f43726f7373776f7264426f6172643a20636f6e6669672061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612cf3565b610295612d3a565b612d5261188e565b7f43726f7373776f7264426f6172643a2061646d696e206164647265737320636160208201526b6e6e6f74206265207a65726f60a01b604082015290565b610295612d4a565b610295612d90565b90610100600160a81b039060081b5b9181191691161790565b612dc8610295612dd092610448565b600254612da0565b600255565b906001600160a01b0390612daf565b612df3610295612dfb92610448565b600354612dd5565b600355565b612e0f610295612e1792610448565b600454612dd5565b600455565b612e2b610295612e3392610448565b600554612dd5565b600555565b612e47610295612e4f92610448565b600654612dd5565b600655565b612e63610295612e6b92610448565b600754612dd5565b600755565b9194612eb961101b92989795612eaf60a096612ea56102ba9a612e9b60c08a019e60008b0190610a47565b6020890190610a47565b6040870190610a47565b6060850190610a47565b6080830190610a47565b9293612fcc92959194612edd612ed7612c3b565b86613152565b612eee612ee8612c92565b87613152565b612eff612ef9612ceb565b88613152565b612f10612f0a612d42565b82613152565b612f21612f1b612d98565b83613152565b612f32612f2c612d98565b84613152565b612f43612f3e86610448565b612db9565b612f54612f4f87610448565b612de4565b612f65612f6088610448565b612e00565b612f76612f7182610448565b612e1c565b612f87612f8283610448565b612e38565b612f98612f9384610448565b612e54565b7f49e1de879727329b7d4d720127457a2857bcb190b237b00840edb50feb9361e096612fc360405190565b96879687612e70565b0390a1565b906102ba9594939291612bd8565b9061115e90612fef6110ad611120565b63ec03a37a61300b61300060405190565b958695869360e01b90565b6000958693815a930392fa91821561111b57839084809481948294839484809481948294839484809461304a575b50509c9b9a99989796959493929190565b9b509b50509b50505050505050505061306d92503d8091833e61294e8183610509565b91939597999b38809e929496989a9c9e613039565b61308a612037565b339061309e6130988361028c565b9161028c565b036130a65750565b63118cdaa760e01b6000908152908190611640906004610a50565b6130d06102956130d892610448565b600054612dd5565b600055565b6130e561202c565b906130ef816130c1565b61312261311c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610448565b91610448565b9161312c60405190565b600090a3565b61313a611bcd565b61314057565b63d93c066560e01b6000908152600490fd5b906102ba9161316c61309861316760006116cf565b61028c565b141561190356fea2646970667358221220fd154c64e78673eaafb57cf38dbfc977a11789040b454dd4a275e539bea7842a64736f6c634300081c00330000000000000000000000007b79e1cb9a344cf8856b4db1131bf65fb6a6fba2000000000000000000000000754b33d8aded1c6bf4821ea68158c42b434d781f0000000000000000000000004019cd85790a2706b0fc3bd9845c2c16742af0e5000000000000000000000000321dcef35e3da483304226ac679b8898c4ee08070000000000000000000000008944ffc503388174aff351cb1c6f87958d6e5bb3000000000000000000000000dc2b0c154f48c7e235872208a6f3093647a236a7
Deployed Bytecode
0x60e0604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630236bb5a1461027b57806303ff1a96146102765780630a713d68146102715780630f9969481461026c578063182296c3146102675780631a831f16146102625780631dc626b11461025d578063317d609b1461025857806339a84e5a146102535780633ab2648a1461024e57806340553dcd1461024957806347ce16f614610244578063595c6a671461023f5780635c975abb1461023a5780636c19e78314610235578063715018a6146102305780637807bd3c1461022b5780637849dbaa146102265780637e82686314610221578063842a42e31461021c5780638a2ddd03146102175780638da5cb5b146102125780639745808a1461020d5780639cc19f5b14610208578063a210b6a414610203578063a5f00e7d146101fe578063b043e032146101f9578063b0fc9440146101f4578063b55c3f97146101ef578063c4dc53d3146101ea578063ca0ab075146101e5578063cd10f4c6146101e0578063d9e268f7146101db578063ec03a37a146101d6578063f2fde38b146101d1578063f4b53f71146101cc578063f6ebc190146101c75763f8e5cbdb0361000e57611022565b610f42565b610ed4565b610ebe565b610e86565b610d16565b610cf3565b610c1b565b610bf9565b610be0565b610bbe565b610b9b565b610aee565b610ad5565b610aaf565b610a85565b610a60565b610a31565b610a1b565b610a0a565b6109e2565b61094f565b6108d1565b6108bb565b6108a2565b61088c565b610871565b6107b1565b61078d565b6106d9565b6105f9565b6104d9565b61049b565b61046a565b6103e2565b610349565b61032e565b6102d6565b6001600160a01b031690565b61029590610280565b90565b6102a18161028c565b036102a857565b600080fd5b905035906102ba82610298565b565b602060048203126102a8576102959060046102ad565b9052565b346102a8576103016102ef6102ea366102bc565b61109d565b60405191829182901515815260200190565b0390f35b806102a1565b905035906102ba82610305565b602060048203126102a85761029590600461030b565b346102a85761034461033f36610318565b61112b565b604051005b346102a85761034461035a36610318565b6111b7565b600460009103126102a857565b60009103126102a857565b0190565b9061039b61039461038a845190565b8084529260200190565b9260200190565b9060005b8181106103ac5750505090565b9091926103c96103c26001928651815260200190565b9460200190565b92910161039f565b60208082526102959291019061037b565b346102a8576103f03661035f565b6103016103fb611274565b604051918291826103d1565b610295916008021c610280565b610280565b906102959154610407565b61029560006007610419565b61041461029561029592610280565b61029590610430565b6102959061043f565b6102d290610448565b6020810192916102ba9190610451565b346102a8576104783661035f565b610301610483610424565b6040519182918261045a565b61029560016002610419565b346102a8576104a93661035f565b61030161048361048f565b906004916040838203126102a8576102959060206104d2828661030b565b94016102ad565b346102a8576103016102ef6104ed366104b4565b90611305565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761052a57604052565b6104f3565b604051906102ba606083610509565b906102ba61054b60405190565b9283610509565b6001600160401b03811161052a57602090601f01601f19160190565b90826000939282370152565b9092919261058f61058a82610552565b61053e565b93818552818301116102a8576102ba91602085019061056e565b9080601f830112156102a8578160206102959335910161057a565b9060046040818403126102a8576105db838261030b565b9260208201356001600160401b0381116102a85761029592016105a9565b346102a85761034461060a366105c4565b90611361565b909182601f830112156102a8578135916001600160401b0383116102a85760200192600183028401116102a857565b60049060c0828203126102a857610656818361030b565b92610664826020850161030b565b926001600160401b039160408201358381116102a85784610686918401610610565b93909460608401358281116102a857816106a1918601610610565b93909460808101358481116102a857836106bc918301610610565b93909460a08301359081116102a8576106d59201610610565b9091565b346102a8576103446106ea3661063f565b9897909796919695929594939461142e565b909182601f830112156102a8578135916001600160401b0383116102a85760200192602083028401116102a857565b60049160a0838303126102a857610742828461030b565b9261075083602083016102ad565b9261075e816040840161030b565b9260608301356001600160401b0381116102a857826107846080946102959387016106fc565b9490950161030b565b6103446107993661072b565b94939093929192611588565b61029560006003610419565b346102a8576107bf3661035f565b6103016104836107a5565b906004610100818403126102a8576107e2838261030b565b926001600160401b039260208301358481116102a857826108049185016105a9565b9360408401358181116102a8578361081d9186016105a9565b9360608101358281116102a857846108369183016105a9565b93610844816080840161030b565b936108528260a0850161030b565b9360c08401359081116102a8578261078460e0946102959387016106fc565b61034461087d366107ca565b979690969591959492946116d8565b346102a85761089a3661035f565b610344611943565b346102a8576108b03661035f565b6103016102ef611bcd565b346102a8576103446108cc366102bc565b611bd5565b346102a8576108df3661035f565b610344611c1a565b60046080818303126102a8576108fd828261030b565b926001600160401b039160208101358381116102a8578461091f9183016105a9565b9360408201358481116102a857816109389184016105a9565b9360608301359081116102a85761029592016105a9565b61034461095b366108e7565b92919091611ccd565b60005b8381106109775750506000910152565b8181015183820152602001610967565b6109a86109b16020936103779361099c815190565b80835293849260200190565b95869101610964565b601f01601f191690565b90815292916102ba916040906109dd9060608701908782036020890152610987565b940152565b346102a8576109f03661035f565b6103016109fb611eb2565b604051919391938493846109bb565b610344610a1636610318565b611f72565b346102a857610a293661035f565b610344611f7b565b346102a857610a3f3661035f565b610344611fb4565b6102d29061028c565b6020810192916102ba9190610a47565b346102a857610a6e3661035f565b610301610a79612037565b60405191829182610a50565b346102a857610301610a9f610a99366104b4565b90612053565b6040519182918290815260200190565b346102a8576103016102ef610ac3366104b4565b906120c3565b61029560006006610419565b346102a857610ae33661035f565b610301610483610ac9565b346102a857610afc3661035f565b6103016102ef6120f1565b60049060a0828203126102a8576001600160401b0382358181116102a85782610b31918501610610565b93909460208201358381116102a85784610b4c918401610610565b93909460408401358281116102a85781610b67918601610610565b93909460608101358481116102a85783610b82918301610610565b93909460808301359081116102a8576106d59201610610565b346102a857610344610bac36610b07565b989790979691969592959493946121b2565b346102a857610344610bcf36610318565b6121f0565b61029560006004610419565b346102a857610bee3661035f565b610301610483610bd4565b346102a857610344610c0a366102bc565b612258565b61029560006005610419565b346102a857610c293661035f565b610301610483610c0f565b90600491610120838203126102a857610c4d818461030b565b926001600160401b039160208201358381116102a85781610c6f9184016105a9565b9360408301358481116102a85782610c889185016105a9565b9360608401358181116102a85783610ca19186016105a9565b93610caf846080830161030b565b93610cbd8160a084016102ad565b93610ccb8260c0850161030b565b9360e08401359081116102a857610ce7836102959286016106fc565b9390946101000161030b565b346102a857610344610d0436610c34565b989790979691969592959493946122e9565b346102a857610d243661035f565b6103016103fb61243b565b90610d3e61039461038a845190565b9060005b818110610d4f5750505090565b909192610d656103c26001928651815260200190565b929101610d42565b906040806102ba93610d8760008201516000860190610a47565b610d9660208201516020860152565b0151910152565b9061037781606093610d6d565b90610db961039461038a845190565b9060005b818110610dca5750505090565b909192610ddd6103c26001928651610d9d565b929101610dbd565b9895610e5190610e4a610e428c610e6899986102959f9d98610e779d97610e3491610e27610e5b9b610e206101408801946000890190610a47565b6020870152565b8482036040860152610d2f565b916060818403910152610daa565b9660808d0152565b60a08b0152565b60ff1660c0890152565b86820360e0880152610987565b90848203610100860152610987565b91610120818403910152610987565b346102a857610301610e9f610e9a36610318565b6127c4565b96610eb59a989a96919695929594939460405190565b9a8b9a8b610de5565b346102a857610344610ecf366102bc565b6129bc565b346102a857610ee23661035f565b6103016103fb612a24565b9060049060c0828403126102a857610f0583836102ad565b92610f1381602085016102ad565b92610f2182604083016102ad565b92610295610f3284606085016102ad565b9360a06104d282608087016102ad565b346102a857610344610f5336610eed565b94939093929192612fd1565b9890610fef61101b999f9e9c96956102ba9e99610fe26110119a6101809f988f610fde6110079c610fd7610fcc60a095610fbe610fff9f610fb0610ff79f6101a08a01908a820360008c0152610987565b9088820360208a0152610987565b908682036040880152610987565b986060850190610a47565b6080830152565b0152565b8c820360c08e0152610d2f565b9e60e08b0152565b610100890152565b610120870152565b1515610140850152565b1515610160830152565b0190610a47565b346102a85761030161103b61103636610318565b612fdf565b996110549d9b9d99919998929897939796949660405190565b9d8e9d8e610f5f565b61029560065461028c565b8015156102a1565b905051906102ba82611068565b906020828203126102a85761029591611070565b6040513d6000823e3d90fd5b60206110ce6110b26110ad61105d565b610448565b630236bb5a6110d96110c360405190565b958694859360e01b90565b835260048301610a50565b91815a930392fa90811561111b576000916110f2575090565b610295915060203d602011611114575b61110c8183610509565b81019061107d565b503d611102565b611091565b61029560075461028c565b6111366110ad611120565b630a713d6890803b156102a85761115e9161116c61115360405190565b948594859360e01b90565b835260048301526024820190565b600094858094825a940393f1801561111b57611186575050565b816102ba92903d106111a5575b61119d8183610509565b81019061036c565b503d611193565b61029560035461028c565b6111366110ad6111ac565b6001600160401b03811161052a5760208091020190565b905051906102ba82610305565b929190926111f661058a856111c2565b938085526020928380870192028301928184116102a857915b83831061121d575050505050565b84809161122a84866111d9565b81520192019161120f565b9080601f830112156102a8578151610295926020016111e6565b906020828203126102a85781516001600160401b0381116102a8576102959201611235565b61129c60006112846110ad611120565b6319e2ba7c9061129360405190565b93849260e01b90565b8252816004810191815a930392fa90811561111b576000916112bc575090565b61029591503d806000833e6112d18183610509565b81019061124f565b6102959060081c610280565b6102956002546112d9565b9081526040810192916102ba9160209061101b565b9061133e602091611314600090565b506113206110ad6112e5565b906110d9631dc626b19161133360405190565b968795869460e01b90565b8452600484016112f0565b90815260406020820181905261029592910190610987565b9061136d6110ad6112e5565b63317d609b813b156102a85761116c6113949361138960405190565b958695869460e01b90565b845260048401611349565b91906109b1816113b6816103779560209181520190565b809561056e565b99979592906102959b9995611412956113f76114049460408f610fde6114209e996113f060e08401996000850190610a47565b6020830152565b8c830360608e015261139f565b9189830360808b015261139f565b9186830360a088015261139f565b9260c081850391015261139f565b9892979196909394956114426110ad6112e5565b9663f982c36296883b156102a8578b9a61146e9a61147a9861146360405190565b9d8e9d8e9c60e01b90565b8c523360048d016113bd565b600094858094825a940393f1801561111b576114fd575b5060206114bf6114a26110ad6111ac565b63d9cbe53c846114cc6114b460405190565b978895869460e01b90565b84523390600485016112f0565b92825a940393f190811561111b57506114e25750565b6114fa9060203d6020116111145761110c8183610509565b50565b61151390823d84116111a55761119d8183610509565b38611491565b9037565b8183529091602001916001600160fb1b0381116102a857829160206103779202938491611519565b969593946102ba9561157b6080956115746109dd9661156a8d97600060a08a01990152565b60208d0190610a47565b60408b0152565b88830360608a015261151d565b94919293906115986110ad6111ac565b92633ab2648a92843b156102a8576000966115c5966115d0946115ba60405190565b9a8b998a9860e01b90565b885260048801611545565b815a9103923491f1801561111b576115e55750565b6102ba90600061119d8183610509565b156115fc57565b60405162461bcd60e51b815260206004820152601b60248201527a15985b1d59481b5d5cdd08195c5d585b081c1c9a5e99481c1bdbdb602a1b604482015280606481015b0390fd5b6102956102956102959290565b9998969195610e4a6116ad8c6109dd989761169f6102ba9d986116916116b59860e09e6116846101008801926000890152565b8682036020880152610987565b908482036040860152610987565b916060818403910152610987565b9560808d0152565b88830360c08a015261151d565b6104146102956102959290565b610295906116c2565b96949290979593916116f16116ea8590565b34146115f5565b6116fc6110ad611120565b63427b88ee60009a61170d8c611644565b90833b156102a8578a8a8a8f988f9a8c9161173a9a6117459761172f60405190565b9e8f9d8e9c60e01b90565b8c5260048c01611651565b92825a940393f1801561111b57611822575b506117636110ad6111ac565b90633ab2648a90611773886116cf565b95833b156102a8578895611799956117a59361178e60405190565b998a98899760e01b90565b87528b60048801611545565b815a9103923491f1801561111b57611806575b506117c46110ad6111ac565b630a713d68813b156102a85783916117e391836117f161133360405190565b845260048401526024830190565b92825a940393f1801561111b57611186575050565b61181c90833d85116111a55761119d8183610509565b386117b8565b61183890873d89116111a55761119d8183610509565b38611757565b61184b61058a6026610552565b9060268252565b61185f61058a602b610552565b90602b8252565b61187361058a602d610552565b90602d8252565b61188761058a602f610552565b90602f8252565b61189b61058a602c610552565b90602c8252565b6118aa61183e565b7f43726f7373776f7264426f6172643a2063616c6c6572206973206e6f7420616e6020820152651030b236b4b760d11b604082015290565b6102956118a2565b6102956118e2565b602080825261029592910190610987565b1561190b5750565b6116409061191860405190565b62461bcd60e51b8152918291600483016118f2565b61029560045461028c565b61029560055461028c565b61194e6110ad61105d565b630236bb5a61196661195f60405190565b9160e01b90565b81526020816004938161197b33878301610a50565b91815a930392fa801561111b576119a391600091611b98575b5061199d6118ea565b90611903565b6119ae6110ad6112e5565b90638456cb5991803b156102a8576119d2926119c960405190565b93849160e01b90565b8082529181848101600096878094825a940393f1801561111b57611b7c575b506119fd6110ad6111ac565b803b156102a85783611a0e60405190565b838152918290818387820192825a940393f1801561111b57611b60575b50611a376110ad61192d565b803b156102a85783611a4860405190565b838152918290818387820192825a940393f1801561111b57611b44575b50611a716110ad611938565b803b156102a85783611a8260405190565b838152918290818387820192825a940393f1801561111b57611b28575b50611aab6110ad61105d565b803b156102a85783611abc60405190565b838152918290818387820192825a940393f1801561111b57611b0c575b50611ae56110ad611120565b91823b156102a8576117f192849283611afd60405190565b95869485938452830160000190565b611b2290843d86116111a55761119d8183610509565b38611ad9565b611b3e90843d86116111a55761119d8183610509565b38611a9f565b611b5a90843d86116111a55761119d8183610509565b38611a65565b611b7690843d86116111a55761119d8183610509565b38611a2b565b611b9290843d86116111a55761119d8183610509565b386119f1565b611bb1915060203d6020116111145761110c8183610509565b38611994565b610295905b60ff1690565b610295600254611bb7565b610295611bc2565b611be06110ad6112e5565b636c19e78390803b156102a8576110ce9161116c61115360405190565b611c05613082565b6102ba6102ba611c1560006116cf565b6130dd565b6102ba611bfd565b9261169161169f92610295969461168460808801926000890152565b90611c4b61058a836111c2565b918252565b369037565b906102ba611c6b611c6584611c3e565b936111c2565b601f190160208401611c50565b6102d290611644565b6102ba94611cb882989795611cae608096611ca4611cc597600060a08901980152565b60208c0190610a47565b60408a0190611c78565b8782036060890152610d2f565b940190611c78565b929091611cdb6110ad611120565b9063d25e3fc690823b156102a857611d0593611d1191611cfa60405190565b968796879560e01b90565b85528860048601611c22565b916000948593815a9103923491f1801561111b57611e0f575b50611d366110ad6111ac565b63f39130e5611d44836116cf565b91611d56611d5185611644565b611c55565b90803b156102a857849283611d7f81611d73958161178e60405190565b87528c60048801611c81565b92825a940393f19081611df3575b50611d96575050565b611da16110ad6111ac565b630a713d68813b156102a85782916117e39183611dc06114b460405190565b92825a940393f19182611dd6575b50506102ba57565b81611dec92903d106111a55761119d8183610509565b3880611dce565b611e0990833d85116111a55761119d8183610509565b38611d8d565b611e2590823d84116111a55761119d8183610509565b38611d2a565b90929192611e3b61058a82610552565b93818552818301116102a8576102ba916020850190610964565b9080601f830112156102a857815161029592602001611e2b565b90916060828403126102a857611e8583836111d9565b602083015190936001600160401b0382116102a8576040611eab82610295948701611e55565b94016111d9565b611eda90611ec16110ad6112e5565b90637849dbaa91611ed160405190565b93849360e01b90565b835282600481016000958693815a930392fa91821561111b578390848094611f04575b5050929190565b9150919350611f2592503d8091833e611f1d8183610509565b810190611e6f565b913880949294611efd565b6102ba90611f3c613082565b6102ba90611f48613132565b611f536110ad6111ac565b63e7b09cea813b156102a85760009161115e916115d06110c360405190565b6102ba90611f30565b611f866110ad6112e5565b63842a42e3813b156102a857611fa891611f9f60405190565b92839260e01b90565b8252816004810161116c565b611fbf6110ad61105d565b630236bb5a611fd061195f60405190565b815260208160049381611fe533878301610a50565b91815a930392fa801561111b5761200691600091611b98575061199d6118ea565b6120116110ad6112e5565b90633f4ba83a91803b156102a8576119d2926119c960405190565b61029560005461028c565b61029561202c565b906020828203126102a857610295916111d9565b9061133e602091612062600090565b5061206e6110ad6111ac565b90612081639745808a9161133360405190565b91815a930392fa90811561111b5760009161209a575090565b610295915060203d6020116120bc575b6120b48183610509565b81019061203f565b503d6120aa565b9061133e6020916120d2600090565b506120de6110ad6111ac565b906110d9639cc19f5b9161133360405190565b61211060206121016110ad611938565b636bc122c99061129360405190565b8252604060048301526013604483015272686f6d655f627574746f6e5f76697369626c6560681b60648301526001602483015281608481016110d9565b98969491612196936102959b999561217a8c612188946121a49b9660a0830192600081850391015261139f565b8c810360208e01529161139f565b9189830360408b015261139f565b91868303606088015261139f565b92608081850391015261139f565b9893969197929590946121c66110ad61192d565b9763b043e03297893b156102a8576121e59a61116c9861146360405190565b8c5260048c0161214d565b6121fb6110ad6111ac565b63b0fc944090803b156102a85761115e9161116c61115360405190565b6102ba90612224613082565b6102ba90612230613132565b61223b6110ad6111ac565b631c294efd90803b156102a8576110ce9161116c61115360405190565b6102ba90612218565b9a9997926109dd966122cb8d9760806122c66102ba9e996122b88c6101009f99986122aa6122d59a6122dc9d61229d6101208601926000870152565b8482036020860152610987565b916040818403910152610987565b8c810360608e015290610987565b990152565b60a08d0190610a47565b60c08b0152565b88830360e08a015261151d565b9896949795939290919860805260c0526123046110ad611120565b97883b156102a857848489612341958a958a9561232060405190565b60a0526330df0a5760e21b60a0515260c05191608051600460a05101612261565b9560009687915a8360a0519360a05190039260a05192f1801561111b5761240a575b61236e6110ad6111ac565b9163f39130e591833b156102a857879561239195879361239f936115ba60405190565b885260805160048901611545565b92825a940393f1801561111b576123ee575b506123bd6110ad6111ac565b630a713d6890803b156102a8576123d991839161129360405190565b825260805160048301528183602482016117f1565b61240490823d84116111a55761119d8183610509565b386123b1565b853d8711612434575b8061242361242f9260a051610509565b60a0510160a05161036c565b612363565b503d612413565b61129c600061244b6110ad611120565b63321c7dc49061129360405190565b905051906102ba82610298565b9291909261247761058a856111c2565b938085526020928380870192028301928184116102a857915b83831061249e575050505050565b8480916124ab84866111d9565b815201920191612490565b9080601f830112156102a857815161029592602001612467565b916101a0838303126102a85782516001600160401b0392908381116102a857816124fb918601611e55565b9360208101518481116102a85782612514918301611e55565b9360408201518181116102a8578361252d918401611e55565b9361253b846060850161245a565b9361254981608086016111d9565b936125578260a083016111d9565b9360c08201519081116102a857826125709183016124b6565b9261257e8360e084016111d9565b9261258d8161010085016111d9565b9261259c8261012083016111d9565b926102956125ae846101408501611070565b936125bd816101608601611070565b936101800161245a565b929190926125d761058a856111c2565b938085526020928380870192028301928184116102a857915b8383106125fe575050505050565b84809161260b848661245a565b8152019201916125f0565b9080601f830112156102a8578151610295926020016125c7565b60ff81166102a1565b905051906102ba82612630565b9190610100838203126102a85761265d818461245a565b9261266b82602083016111d9565b604082015190936001600160401b039390918481116102a857816126909185016124b6565b9360608401519081116102a857816126a9918501612616565b926126b782608083016111d9565b926102956126c88460a085016111d9565b9360e06126d88260c08701612639565b9401611070565b611bbc6102956102959290565b91906060838203126102a85761272b90604061270661052f565b94612711838261245a565b865261272083602083016111d9565b6020870152016111d9565b6040830152565b92919261274161058a836111c2565b93828552602090602086019060608095028401938185116102a857915b84831061276d57505050505050565b83869161277a84866126ec565b81520192019161275e565b9080601f830112156102a857815161029592602001612732565b906020828203126102a85781516001600160401b0381116102a8576102959201612785565b6060906127e5906127d66110ad611120565b63ec03a37a91611ed160405190565b808452600484018290529183602481016000968793815a930392fa91821561111b57849085948694612935575b508561281f6110ad6111ac565b9161282960405190565b928391825281612840876004830190815260200190565b91815a930392fa86908792889389938a938b9381612904575b506128ef5750505050505061286d856116cf565b9261287786611644565b9485988695612885896126df565b955b8961115e6128966110ad6112e5565b63a090a3566128a76110c360405190565b91815a930392fa998a1561111b57809a6128ca575b505099989796959493929190565b6128e7929a503d8091833e6128df8183610509565b81019061279f565b9738806128bc565b909197949b9298939a50909a99979695612887565b9450955050505061292791503d8089833e61291f8183610509565b810190612646565b509396909492959195612859565b915093506129569192503d8086833e61294e8183610509565b8101906124d0565b505050505050505050949093929194612812565b6102ba90612976613082565b6000612981816116cf565b61298a8161028c565b6129938461028c565b146129a35750506102ba906130dd565b631e4fbdf760e01b825281906116409060048301610a50565b6102ba9061296a565b634e487b7160e01b600052603260045260246000fd5b906129e4825190565b8110156129f5576020809102010190565b6129c5565b634e487b7160e01b600052601160045260246000fd5b6000198114612a1f5760010190565b6129fa565b612a33906112846110ad611120565b8252600490828281016000968793815a930392fa91821561111b578492612bbc575b50612a61611d51835190565b90612a6b85611644565b94855b612a79610295865190565b811015612b7057612a8b6110ad6111ac565b82612ab363ec03a37a92612aa6612aa2868b6129db565b5190565b93612ac16110c360405190565b835289830190815260200190565b91815a930392fa908184918593612b4c575b50612ae7575050600101612a6e565b612a6e565b612afb612af460026126df565b9160ff1690565b14908115612b44575b50612b12575b600101612a6e565b95612b3c612ae291612b37612b2a612aa28b8a6129db565b612b3483896129db565b52565b612a10565b969050612b0a565b905038612b04565b909250612b6391503d8086833e61291f8183610509565b9795509550505050612ad3565b509391925050612b88612b8285611c55565b93611644565b845b811015612bb557612bae81612ba8612b2a612aa2612b8a95886129db565b60010190565b9050612b88565b5092505090565b612bd19192503d8086833e6112d18183610509565b9038612a55565b906102ba9594939291612be9613082565b612ec3565b612bf6611852565b7f43726f7373776f7264426f6172643a20636f726520616464726573732063616e60208201526a6e6f74206265207a65726f60a81b604082015290565b610295612bee565b610295612c33565b612c4b611866565b7f43726f7373776f7264426f6172643a207072697a65732061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612c43565b610295612c8a565b612ca261187a565b7f43726f7373776f7264426f6172643a2070726f66696c6573206164647265737360208201526e2063616e6e6f74206265207a65726f60881b604082015290565b610295612c9a565b610295612ce3565b612cfb611866565b7f43726f7373776f7264426f6172643a20636f6e6669672061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612cf3565b610295612d3a565b612d5261188e565b7f43726f7373776f7264426f6172643a2061646d696e206164647265737320636160208201526b6e6e6f74206265207a65726f60a01b604082015290565b610295612d4a565b610295612d90565b90610100600160a81b039060081b5b9181191691161790565b612dc8610295612dd092610448565b600254612da0565b600255565b906001600160a01b0390612daf565b612df3610295612dfb92610448565b600354612dd5565b600355565b612e0f610295612e1792610448565b600454612dd5565b600455565b612e2b610295612e3392610448565b600554612dd5565b600555565b612e47610295612e4f92610448565b600654612dd5565b600655565b612e63610295612e6b92610448565b600754612dd5565b600755565b9194612eb961101b92989795612eaf60a096612ea56102ba9a612e9b60c08a019e60008b0190610a47565b6020890190610a47565b6040870190610a47565b6060850190610a47565b6080830190610a47565b9293612fcc92959194612edd612ed7612c3b565b86613152565b612eee612ee8612c92565b87613152565b612eff612ef9612ceb565b88613152565b612f10612f0a612d42565b82613152565b612f21612f1b612d98565b83613152565b612f32612f2c612d98565b84613152565b612f43612f3e86610448565b612db9565b612f54612f4f87610448565b612de4565b612f65612f6088610448565b612e00565b612f76612f7182610448565b612e1c565b612f87612f8283610448565b612e38565b612f98612f9384610448565b612e54565b7f49e1de879727329b7d4d720127457a2857bcb190b237b00840edb50feb9361e096612fc360405190565b96879687612e70565b0390a1565b906102ba9594939291612bd8565b9061115e90612fef6110ad611120565b63ec03a37a61300b61300060405190565b958695869360e01b90565b6000958693815a930392fa91821561111b57839084809481948294839484809481948294839484809461304a575b50509c9b9a99989796959493929190565b9b509b50509b50505050505050505061306d92503d8091833e61294e8183610509565b91939597999b38809e929496989a9c9e613039565b61308a612037565b339061309e6130988361028c565b9161028c565b036130a65750565b63118cdaa760e01b6000908152908190611640906004610a50565b6130d06102956130d892610448565b600054612dd5565b600055565b6130e561202c565b906130ef816130c1565b61312261311c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610448565b91610448565b9161312c60405190565b600090a3565b61313a611bcd565b61314057565b63d93c066560e01b6000908152600490fd5b906102ba9161316c61309861316760006116cf565b61028c565b141561190356fea2646970667358221220fd154c64e78673eaafb57cf38dbfc977a11789040b454dd4a275e539bea7842a64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007b79e1cb9a344cf8856b4db1131bf65fb6a6fba2000000000000000000000000754b33d8aded1c6bf4821ea68158c42b434d781f0000000000000000000000004019cd85790a2706b0fc3bd9845c2c16742af0e5000000000000000000000000321dcef35e3da483304226ac679b8898c4ee08070000000000000000000000008944ffc503388174aff351cb1c6f87958d6e5bb3000000000000000000000000dc2b0c154f48c7e235872208a6f3093647a236a7
-----Decoded View---------------
Arg [0] : _crosswordCore (address): 0x7B79e1Cb9a344cf8856B4Db1131bF65fB6A6fBA2
Arg [1] : _crosswordPrizes (address): 0x754b33D8AdEd1c6bF4821Ea68158C42B434d781f
Arg [2] : _userProfiles (address): 0x4019Cd85790A2706b0fc3BD9845C2c16742Af0e5
Arg [3] : _configManager (address): 0x321dcEF35e3DA483304226AC679B8898C4eE0807
Arg [4] : _adminManager (address): 0x8944ffC503388174AfF351cb1C6F87958D6E5Bb3
Arg [5] : _publicCrosswordManager (address): 0xDC2b0C154f48c7e235872208A6F3093647A236A7
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000007b79e1cb9a344cf8856b4db1131bf65fb6a6fba2
Arg [1] : 000000000000000000000000754b33d8aded1c6bf4821ea68158c42b434d781f
Arg [2] : 0000000000000000000000004019cd85790a2706b0fc3bd9845c2c16742af0e5
Arg [3] : 000000000000000000000000321dcef35e3da483304226ac679b8898c4ee0807
Arg [4] : 0000000000000000000000008944ffc503388174aff351cb1c6f87958d6e5bb3
Arg [5] : 000000000000000000000000dc2b0c154f48c7e235872208a6f3093647a236a7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.