Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 16 from a total of 16 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 9767422 | 2184 days ago | IN | 0 ETH | 0.00008808 | ||||
| Resolve Claim | 9767226 | 2184 days ago | IN | 0 ETH | 0.00004873 | ||||
| Approve | 8636790 | 2367 days ago | IN | 0 ETH | 0.00068092 | ||||
| Approve | 8636675 | 2367 days ago | IN | 0 ETH | 0.00076156 | ||||
| Mint Numbered | 8636671 | 2367 days ago | IN | 0 ETH | 0.00091326 | ||||
| Declare Lost | 8618996 | 2370 days ago | IN | 0 ETH | 0.00246392 | ||||
| Prepare Claim | 8612581 | 2371 days ago | IN | 0 ETH | 0.00090998 | ||||
| Declare Lost | 8612515 | 2371 days ago | IN | 0 ETH | 0.00077421 | ||||
| Approve | 8606100 | 2372 days ago | IN | 0 ETH | 0.0009079 | ||||
| Prepare Claim | 8606052 | 2372 days ago | IN | 0 ETH | 0.00129998 | ||||
| Mint Numbered | 8604442 | 2372 days ago | IN | 0 ETH | 0.00108594 | ||||
| Mint Numbered | 8579064 | 2376 days ago | IN | 0 ETH | 0.00159627 | ||||
| Approve | 8578770 | 2376 days ago | IN | 0 ETH | 0.00136185 | ||||
| Mint Numbered | 8578750 | 2376 days ago | IN | 0 ETH | 0.00208083 | ||||
| Set Total Shares | 8578742 | 2376 days ago | IN | 0 ETH | 0.00082833 | ||||
| Transfer Ownersh... | 8561335 | 2379 days ago | IN | 0 ETH | 0.00033113 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ServiceHunterShares
Compiler Version
v0.5.10+commit.5a6ea5b1
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-09-14
*/
// File: contracts/SafeMath.sol
/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
// File: contracts/IERC20.sol
/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see `ERC20Detailed`.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a `Transfer` event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through `transferFrom`. This is
* zero by default.
*
* This value changes when `approve` or `transferFrom` are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* > Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an `Approval` event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a `Transfer` event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to `approve`. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/ERC20.sol
/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;
/**
* @dev Implementation of the `IERC20` interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using `_mint`.
* For a generic mechanism see `ERC20Mintable`.
*
* *For a detailed writeup see our guide [How to implement supply
* mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an `Approval` event is emitted on calls to `transferFrom`.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
* functions have been added to mitigate the well-known issues around setting
* allowances. See `IERC20.approve`.
*/
contract ERC20 is IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
/**
* @dev See `IERC20.totalSupply`.
*/
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
/**
* @dev See `IERC20.balanceOf`.
*/
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
/**
* @dev See `IERC20.transfer`.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
/**
* @dev See `IERC20.allowance`.
*/
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See `IERC20.approve`.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
/**
* @dev See `IERC20.transferFrom`.
*
* Emits an `Approval` event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of `ERC20`;
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `value`.
* - the caller must have allowance for `sender`'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to `approve` that can be used as a mitigation for
* problems described in `IERC20.approve`.
*
* Emits an `Approval` event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to `approve` that can be used as a mitigation for
* problems described in `IERC20.approve`.
*
* Emits an `Approval` event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to `transfer`, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a `Transfer` event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(amount);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a `Transfer` event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a `Transfer` event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 value) internal {
require(account != address(0), "ERC20: burn from the zero address");
_totalSupply = _totalSupply.sub(value);
_balances[account] = _balances[account].sub(value);
emit Transfer(account, address(0), value);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
*
* This is internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an `Approval` event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 value) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = value;
emit Approval(owner, spender, value);
}
/**
* @dev Destoys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See `_burn` and `_approve`.
*/
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
}
}
// File: contracts/ERC20Claimable.sol
/**
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2019 Equility AG (alethena.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
* are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;
/**
* @title Claimable
* In case of tokens that represent real-world assets such as shares of a company, one needs a way
* to handle lost private keys. With physical certificates, courts can declare share certificates as
* invalid so the company can issue replacements. Here, we want a solution that does not depend on
* third parties to resolve such cases. Instead, when someone has lost a private key, he can use the
* declareLost function to post a deposit and claim that the shares assigned to a specific address are
* lost. To prevent front running, a commit reveal scheme is used. If he actually is the owner of the shares,
* he needs to wait for a certain period and can then reclaim the lost shares as well as the deposit.
* If he is an attacker trying to claim shares belonging to someone else, he risks losing the deposit
* as it can be claimed at anytime by the rightful owner.
* Furthermore, if "getClaimDeleter" is defined in the subclass, the returned address is allowed to
* delete claims, returning the collateral. This can help to prevent obvious cases of abuse of the claim
* function.
*/
contract ERC20Claimable is ERC20 {
using SafeMath for uint256;
using SafeMath for uint32;
// A struct that represents a claim made
struct Claim {
address claimant; // the person who created the claim
uint256 collateral; // the amount of collateral deposited
uint32 timestamp; // the timestamp of the block in which the claim was made
address currencyUsed; // The currency (XCHF) can be updated, we record the currency used for every request
}
// Every claim must be preceded by an obscured preclaim in order to prevent front-running
struct PreClaim {
bytes32 msghash; // the hash of nonce + address to be claimed
uint256 timestamp; // the timestamp of the block in which the preclaim was made
}
uint256 public claimPeriod = 180 days; // Default of 180 days;
uint256 public preClaimPeriod = 1 days; // One day. Minimum waiting period between preClaim and Claim;
uint256 public preClaimPeriodEnd = 2 days; // Two days. Maximum waiting period between preClaim and Claim;
mapping(address => Claim) public claims; // there can be at most one claim per address, here address is claimed address
mapping(address => PreClaim) public preClaims; // there can be at most one preclaim per address, here address is claimer
mapping(address => bool) public claimingDisabled; // disable claimability (e.g. for long term storage)
// ERC-20 token that can be used as collateral or 0x0 if disabled
address public customCollateralAddress;
uint256 public customCollateralRate;
/**
* Returns the collateral rate for the given collateral type and 0 if that type
* of collateral is not accepted. By default, only the token itself is accepted at
* a rate of 1:1.
*
* Subclasses should override this method if they want to add additional types of
* collateral.
*/
function getCollateralRate(address collateralType) public view returns (uint256) {
if (collateralType == address(this)) {
return 1;
} else if (collateralType == customCollateralAddress) {
return customCollateralRate;
} else {
return 0;
}
}
/**
* Allows subclasses to set a custom collateral besides the token itself.
* The collateral must be an ERC-20 token that returns true on successful transfers and
* throws an exception or returns false on failure.
* Also, do not forget to multiply the rate in accordance with the number of decimals of the collateral.
* For example, rate should be 7*10**18 for 7 units of a collateral with 18 decimals.
*/
function _setCustomClaimCollateral(address collateral, uint256 rate) internal {
customCollateralAddress = collateral;
if (customCollateralAddress == address(0)) {
customCollateralRate = 0; // disabled
} else {
require(rate > 0, "Collateral rate can't be zero");
customCollateralRate = rate;
}
emit CustomClaimCollateralChanged(collateral, rate);
}
function getClaimDeleter() public returns (address);
/**
* Allows subclasses to change the claim period, but not to fewer than 90 days.
*/
function _setClaimPeriod(uint256 claimPeriodInDays) internal {
require(claimPeriodInDays > 90, "Claim period must be at least 90 days"); // must be at least 90 days
uint256 claimPeriodInSeconds = claimPeriodInDays.mul(1 days);
claimPeriod = claimPeriodInSeconds;
emit ClaimPeriodChanged(claimPeriod);
}
function setClaimable(bool enabled) public {
claimingDisabled[msg.sender] = !enabled;
}
/**
* Some users might want to disable claims for their address completely.
* For example if they use a deep cold storage solution or paper wallet.
*/
function isClaimsEnabled(address target) public view returns (bool) {
return !claimingDisabled[target];
}
event ClaimMade(address indexed lostAddress, address indexed claimant, uint256 balance);
event ClaimPrepared(address indexed claimer);
event ClaimCleared(address indexed lostAddress, uint256 collateral);
event ClaimDeleted(address indexed lostAddress, address indexed claimant, uint256 collateral);
event ClaimResolved(address indexed lostAddress, address indexed claimant, uint256 collateral);
event ClaimPeriodChanged(uint256 newClaimPeriodInDays);
event CustomClaimCollateralChanged(address newCustomCollateralAddress, uint256 newCustomCollareralRate);
/** Anyone can declare that the private key to a certain address was lost by calling declareLost
* providing a deposit/collateral. There are three possibilities of what can happen with the claim:
* 1) The claim period expires and the claimant can get the deposit and the shares back by calling resolveClaim
* 2) The "lost" private key is used at any time to call clearClaim. In that case, the claim is deleted and
* the deposit sent to the shareholder (the owner of the private key). It is recommended to call resolveClaim
* whenever someone transfers funds to let claims be resolved automatically when the "lost" private key is
* used again.
* 3) The owner deletes the claim and assigns the deposit to the claimant. This is intended to be used to resolve
* disputes. Generally, using this function implies that you have to trust the issuer of the tokens to handle
* the situation well. As a rule of thumb, the contract owner should assume the owner of the lost address to be the
* rightful owner of the deposit.
* It is highly recommended that the owner observes the claims made and informs the owners of the claimed addresses
* whenever a claim is made for their address (this of course is only possible if they are known to the owner, e.g.
* through a shareholder register).
* To prevent frontrunning attacks, a claim can only be made if the information revealed when calling "declareLost"
* was previously commited using the "prepareClaim" function.
*/
function prepareClaim(bytes32 hashedpackage) public {
preClaims[msg.sender] = PreClaim({
msghash: hashedpackage,
timestamp: block.timestamp
});
emit ClaimPrepared(msg.sender);
}
function validateClaim(address lostAddress, bytes32 nonce) private view {
PreClaim memory preClaim = preClaims[msg.sender];
require(preClaim.msghash != 0, "Message hash can't be zero");
require(preClaim.timestamp.add(preClaimPeriod) <= block.timestamp, "Preclaim period violated. Claimed too early");
require(preClaim.timestamp.add(preClaimPeriodEnd) >= block.timestamp, "Preclaim period end. Claimed too late");
require(preClaim.msghash == keccak256(abi.encodePacked(nonce, msg.sender, lostAddress)),"Package could not be validated");
}
function declareLost(address collateralType, address lostAddress, bytes32 nonce) public {
require(lostAddress != address(0), "Can't claim zero address");
require(isClaimsEnabled(lostAddress), "Claims disabled for this address");
uint256 collateralRate = getCollateralRate(collateralType);
require(collateralRate > 0, "Unsupported collateral type");
address claimant = msg.sender;
uint256 balance = balanceOf(lostAddress);
uint256 collateral = balance.mul(collateralRate);
IERC20 currency = IERC20(collateralType);
require(balance > 0, "Claimed address holds no shares");
require(currency.allowance(claimant, address(this)) >= collateral, "Currency allowance insufficient");
require(currency.balanceOf(claimant) >= collateral, "Currency balance insufficient");
require(claims[lostAddress].collateral == 0, "Address already claimed");
validateClaim(lostAddress, nonce);
require(currency.transferFrom(claimant, address(this), collateral), "Collateral transfer failed");
claims[lostAddress] = Claim({
claimant: claimant,
collateral: collateral,
timestamp: uint32(block.timestamp), // block timestamp is in seconds --> Should not overflow
currencyUsed: collateralType
});
delete preClaims[claimant];
emit ClaimMade(lostAddress, claimant, balance);
}
function getClaimant(address lostAddress) public view returns (address) {
return claims[lostAddress].claimant;
}
function getCollateral(address lostAddress) public view returns (uint256) {
return claims[lostAddress].collateral;
}
function getCollateralType(address lostAddress) public view returns (address) {
return claims[lostAddress].currencyUsed;
}
function getTimeStamp(address lostAddress) public view returns (uint256) {
return claims[lostAddress].timestamp;
}
function getPreClaimTimeStamp(address claimerAddress) public view returns (uint256) {
return preClaims[claimerAddress].timestamp;
}
function getMsgHash(address claimerAddress) public view returns (bytes32) {
return preClaims[claimerAddress].msghash;
}
function transfer(address recipient, uint256 amount) public returns (bool) {
require(super.transfer(recipient, amount), "Transfer failed");
clearClaim();
return true;
}
/**
* Clears a claim after the key has been found again and assigns the collateral to the "lost" address.
* This is the price an adverse claimer pays for filing a false claim and makes it risky to do so.
*/
function clearClaim() public {
if (claims[msg.sender].collateral != 0) {
uint256 collateral = claims[msg.sender].collateral;
IERC20 currency = IERC20(claims[msg.sender].currencyUsed);
delete claims[msg.sender];
require(currency.transfer(msg.sender, collateral), "Collateral transfer failed");
emit ClaimCleared(msg.sender, collateral);
}
}
/**
* After the claim period has passed, the claimant can call this function to send the
* tokens on the lost address as well as the collateral to himself.
*/
function resolveClaim(address lostAddress) public {
Claim memory claim = claims[lostAddress];
uint256 collateral = claim.collateral;
IERC20 currency = IERC20(claim.currencyUsed);
require(collateral != 0, "No claim found");
require(claim.claimant == msg.sender, "Only claimant can resolve claim");
require(claim.timestamp.add(uint32(claimPeriod)) <= block.timestamp, "Claim period not over yet");
address claimant = claim.claimant;
delete claims[lostAddress];
require(currency.transfer(claimant, collateral), "Collateral transfer failed");
_transfer(lostAddress, claimant, balanceOf(lostAddress));
emit ClaimResolved(lostAddress, claimant, collateral);
}
/**
* This function is to be executed by the owner only in case a dispute needs to be resolved manually.
*/
function deleteClaim(address lostAddress) public {
require(msg.sender == getClaimDeleter(), "You cannot delete claims");
Claim memory claim = claims[lostAddress];
IERC20 currency = IERC20(claim.currencyUsed);
require(claim.collateral != 0, "No claim found");
delete claims[lostAddress];
require(currency.transfer(claim.claimant, claim.collateral), "Collateral transfer failed");
emit ClaimDeleted(lostAddress, claim.claimant, claim.collateral);
}
}
// File: contracts/Ownable.sol
/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
* A special address 'master' can transfer ownership.
*/
contract Ownable {
address public owner;
address constant master = 0x1B5aeD8cC7B7b8f02De451f7Cda5292D629C045F;
event OwnershipRenounced(address indexed previousOwner);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original 'owner' of the contract to the sender
* account.
*/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner of this contract");
_;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(owner);
owner = address(0);
}
/**
* @dev Allows the master to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(address _newOwner) public {
require(msg.sender == master, "You are not the master of this contract");
_transferOwnership(_newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function _transferOwnership(address _newOwner) internal {
require(_newOwner != address(0), "Zero address can't own the contract");
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
// File: contracts/Pausable.sol
/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;
contract Pausable is Ownable {
/** This contract is pausable. */
bool public paused = false;
/** @dev Function to set pause.
* This could for example be used in case of a fork of the network, in which case all
* "wrong" forked contracts should be paused in their respective fork. Deciding which
* fork is the "right" one is up to the owner of the contract.
*/
function pause(bool _pause, string calldata _message, address _newAddress, uint256 _fromBlock) external onlyOwner() {
paused = _pause;
emit Pause(_pause, _message, _newAddress, _fromBlock);
}
event Pause(bool paused, string message, address newAddress, uint256 fromBlock);
}
// File: contracts/ServiceHunterShares.sol
/**
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2019 Equility AG (alethena.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
* are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;
/**
* @title ServiceHunter AG Shares
* @author Benjamin Rickenbacher, benjamin@alethena.com
* @author Luzius Meisser, luzius@meissereconomics.com
* @dev These tokens are based on the ERC20 standard and the open-zeppelin library.
*
* These tokens are uncertified shares (Wertrechte according to the Swiss code of obligations),
* with this smart contract serving as onwership registry (Wertrechtebuch), but not as shareholder
* registry, which is kept separate and run by the company. This is equivalent to the traditional system
* of having physical share certificates kept at home by the shareholders and a shareholder registry run by
* the company. Just like with physical certificates, the owners of the tokens are the owners of the shares.
* However, in order to exercise their rights (for example receive a dividend), shareholders must register
* with the company. For example, in case the company pays out a dividend to a previous shareholder because
* the current shareholder did not register, the company cannot be held liable for paying the dividend to
* the "wrong" shareholder. In relation to the company, only the registered shareholders count as such.
* Registration requires setting up an account with ledgy.com providing your name and address and proving
* ownership over your addresses.
* @notice The main addition is a functionality that allows the user to claim that the key for a certain address is lost.
* @notice In order to prevent malicious attempts, a collateral needs to be posted.
* @notice The contract owner can delete claims in case of disputes.
*
* https://github.com/ethereum/EIPs/issues/20
* Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
*/
contract ServiceHunterShares is ERC20Claimable, Pausable {
using SafeMath for uint256;
string public constant symbol = "SHS";
string public constant name = "ServiceHunter AG Shares";
string public constant terms = "quitt.ch/investoren";
uint8 public constant decimals = 0; // legally, shares are not divisible
uint256 public totalShares = 15647; // total number of shares, maybe not all tokenized
uint256 public invalidTokens = 0;
address[] public subregisters;
event Announcement(string message);
event TokensDeclaredInvalid(address holder, uint256 amount, string message);
event ShareNumberingEvent(address holder, uint256 firstInclusive, uint256 lastInclusive);
event SubRegisterAdded(address contractAddress);
event SubRegisterRemoved(address contractAddress);
/**
* Declares the number of total shares, including those that have not been tokenized and those
* that are held by the company itself. This number can be substiantially higher than totalSupply()
* in case not all shares have been tokenized. Also, it can be lower than totalSupply() in case some
* tokens have become invalid.
*/
function setTotalShares(uint256 _newTotalShares) public onlyOwner() {
require(_newTotalShares >= totalValidSupply(), "There can't be fewer tokens than shares");
totalShares = _newTotalShares;
}
/**
* Under some use-cases, tokens are held by smart contracts that are ERC20 contracts themselves.
* A popular example are Uniswap contracts that hold traded coins and that are owned by various
* liquidity providers. For such cases, having a list of recognized such subregisters might
* be helpful with the automated registration and tracking of shareholders.
* We assume that the number of sub registers stays limited, such that they are safe to iterate.
* Subregisters should always have the same number of decimals as the main register.
* To add subregisters with a different number of decimals, adapter contracts are needed.
*/
function recognizeSubRegister(address contractAddress) public onlyOwner () {
subregisters.push(contractAddress);
emit SubRegisterAdded(contractAddress);
}
function removeSubRegister(address contractAddress) public onlyOwner() {
for (uint256 i = 0; i<subregisters.length; i++) {
if (subregisters[i] == contractAddress) {
subregisters[i] = subregisters[subregisters.length - 1];
subregisters.pop();
emit SubRegisterRemoved(contractAddress);
}
}
}
/**
* A deep balanceOf operator that also considers indirectly held tokens in
* recognized sub registers.
*/
function balanceOfDeep(address holder) public view returns (uint256) {
uint256 balance = balanceOf(holder);
for (uint256 i = 0; i<subregisters.length; i++) {
IERC20 subERC = IERC20(subregisters[i]);
balance = balance.add(subERC.balanceOf(holder));
}
return balance;
}
/**
* Allows the issuer to make public announcements that are visible on the blockchain.
*/
function announcement(string calldata message) external onlyOwner() {
emit Announcement(message);
}
function setClaimPeriod(uint256 claimPeriodInDays) public onlyOwner() {
super._setClaimPeriod(claimPeriodInDays);
}
/**
* See parent method for collateral requirements.
*/
function setCustomClaimCollateral(address collateral, uint256 rate) public onlyOwner() {
super._setCustomClaimCollateral(collateral, rate);
}
function getClaimDeleter() public returns (address) {
return owner;
}
/**
* Signals that the indicated tokens have been declared invalid (e.g. by a court ruling in accordance
* with article 973g of the planned adjustments to the Swiss Code of Obligations) and got detached from
* the underlying shares. Invalid tokens do not carry any shareholder rights any more.
*/
function declareInvalid(address holder, uint256 amount, string calldata message) external onlyOwner() {
uint256 holderBalance = balanceOf(holder);
require(amount <= holderBalance, "Cannot invalidate more tokens than held by address");
invalidTokens = invalidTokens.add(amount);
emit TokensDeclaredInvalid(holder, amount, message);
}
/**
* The total number of valid tokens in circulation. In case some tokens have been declared invalid, this
* number might be lower than totalSupply(). Also, it will always be lower than or equal to totalShares().
*/
function totalValidSupply() public view returns (uint256) {
return totalSupply().sub(invalidTokens);
}
/**
* Allows the company to tokenize shares. If these shares are newly created, setTotalShares must be
* called first in order to adjust the total number of shares.
*/
function mint(address shareholder, uint256 _amount) public onlyOwner() {
require(totalValidSupply().add(_amount) <= totalShares, "There can't be fewer shares than valid tokens");
_mint(shareholder, _amount);
}
/**
* Some companies like to number their shares so they can refer to them more explicitely in legal contracts.
* A minority of Swiss lawyers even believes that numbering shares is compulsory (which is not true).
* Nonetheless, this function allows to signal the numbers of freshly tokenized shares.
* In case the shares ever get de-tokenized again, this information might help in deducing their
* numbers again - although there might be some room for interpretation of what went where.
* By convention, transfers should be considered FIFO (first in, first out) and transactions in
* recognized subregisters be taken into account.
*/
function mintNumbered(address shareholder, uint256 firstShareNumber, uint256 lastShareNumber) public onlyOwner() {
mint(shareholder, lastShareNumber.sub(firstShareNumber).add(1));
emit ShareNumberingEvent(shareholder, firstShareNumber, lastShareNumber);
}
/**
* Transfers _amount tokens to the company and burns them.
* The meaning of this operation depends on the circumstances and the fate of the shares does
* not necessarily follow the fate of the tokens. For example, the company itself might call
* this function to implement a formal decision to destroy some of the outstanding shares.
* Also, this function might be called by an owner to return the shares to the company and
* get them back in another form under an according agreement (e.g. printed certificates or
* tokens on a different blockchain). It is not recommended to call this function without
* having agreed with the company on the further fate of the shares in question.
*/
function burn(uint256 _amount) public {
require(_amount <= balanceOf(msg.sender), "Not enough shares available");
_transfer(msg.sender, address(this), _amount);
_burn(address(this), _amount);
}
function _transfer(address from, address _to, uint256 _value) internal {
require(!paused, "Contract is paused");
super._transfer(from, _to, _value);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"customCollateralAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contractAddress","type":"address"}],"name":"removeSubRegister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getClaimant","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"message","type":"string"}],"name":"announcement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"claimerAddress","type":"address"}],"name":"getMsgHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getClaimDeleter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"enabled","type":"bool"}],"name":"setClaimable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"invalidTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"collateral","type":"address"},{"name":"rate","type":"uint256"}],"name":"setCustomClaimCollateral","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getCollateralType","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"shareholder","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"preClaims","outputs":[{"name":"msghash","type":"bytes32"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"subregisters","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"hashedpackage","type":"bytes32"}],"name":"prepareClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"amount","type":"uint256"},{"name":"message","type":"string"}],"name":"declareInvalid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"customCollateralRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"shareholder","type":"address"},{"name":"firstShareNumber","type":"uint256"},{"name":"lastShareNumber","type":"uint256"}],"name":"mintNumbered","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"clearClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"claimerAddress","type":"address"}],"name":"getPreClaimTimeStamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"claimPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"preClaimPeriodEnd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"claimingDisabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"lostAddress","type":"address"}],"name":"resolveClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pause","type":"bool"},{"name":"_message","type":"string"},{"name":"_newAddress","type":"address"},{"name":"_fromBlock","type":"uint256"}],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"balanceOfDeep","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newTotalShares","type":"uint256"}],"name":"setTotalShares","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalValidSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"claims","outputs":[{"name":"claimant","type":"address"},{"name":"collateral","type":"uint256"},{"name":"timestamp","type":"uint32"},{"name":"currencyUsed","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contractAddress","type":"address"}],"name":"recognizeSubRegister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"claimPeriodInDays","type":"uint256"}],"name":"setClaimPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"terms","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"collateralType","type":"address"},{"name":"lostAddress","type":"address"},{"name":"nonce","type":"bytes32"}],"name":"declareLost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getTimeStamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"preClaimPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"}],"name":"isClaimsEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"message","type":"string"}],"name":"Announcement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"holder","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"message","type":"string"}],"name":"TokensDeclaredInvalid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"holder","type":"address"},{"indexed":false,"name":"firstInclusive","type":"uint256"},{"indexed":false,"name":"lastInclusive","type":"uint256"}],"name":"ShareNumberingEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contractAddress","type":"address"}],"name":"SubRegisterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contractAddress","type":"address"}],"name":"SubRegisterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"paused","type":"bool"},{"indexed":false,"name":"message","type":"string"},{"indexed":false,"name":"newAddress","type":"address"},{"indexed":false,"name":"fromBlock","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":true,"name":"claimant","type":"address"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"ClaimMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"claimer","type":"address"}],"name":"ClaimPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":false,"name":"collateral","type":"uint256"}],"name":"ClaimCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":true,"name":"claimant","type":"address"},{"indexed":false,"name":"collateral","type":"uint256"}],"name":"ClaimDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":true,"name":"claimant","type":"address"},{"indexed":false,"name":"collateral","type":"uint256"}],"name":"ClaimResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newClaimPeriodInDays","type":"uint256"}],"name":"ClaimPeriodChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newCustomCollateralAddress","type":"address"},{"indexed":false,"name":"newCustomCollareralRate","type":"uint256"}],"name":"CustomClaimCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]Contract Creation Code
608060405262ed4e00600355620151806004556202a300600555600b8054613d1f600c556000600d556001600160a81b0319163317905561317e806100456000396000f3fe608060405234801561001057600080fd5b506004361061035d5760003560e01c80636b03ed5f116101d3578063a457c2d711610104578063d5025625116100a2578063eb470ebf1161007c578063eb470ebf14610b40578063ee18d99e14610b66578063f2fde38b14610b6e578063f66f145a14610b945761035d565b8063d502562514610ad4578063dd62ed3e14610adc578063e5a8765a14610b0a5761035d565b8063b0d04c7a116100de578063b0d04c7a14610a2a578063c6788bdd14610a32578063cc51e14314610a91578063d2c04f4314610ab75761035d565b8063a457c2d7146109b5578063a77384c1146109e1578063a9059cbb146109fe5761035d565b80638da5cb5b1161017157806395d89b411161014b57806395d89b41146108db578063980591f4146108e35780639b56d6c914610969578063a26cf59f1461098f5761035d565b80638da5cb5b146108875780638e0597c11461088f57806394d645a8146108b55761035d565b806375a88bcf116101ad57806375a88bcf1461082b57806377e071ad146108515780637dc2cd98146108775780637dde2a021461087f5761035d565b80636b03ed5f146107f557806370a08231146107fd578063715018a6146108235761035d565b806337a8129c116102ad578063493c160f1161024b5780635c975abb116102255780635c975abb146107305780635d6624b71461073857806360918117146107bb57806369f721e2146107c35761035d565b8063493c160f146106b75780634ae5e630146106f65780635b1c1625146107135761035d565b80633a98ef39116102875780633a98ef39146106405780633bcc45ba1461064857806340c10f191461066e57806342966c681461069a5761035d565b806337a8129c146105e057806339509351146105e85780633a1cdf32146106145761035d565b80631f0f06aa1161031a5780632a0a4ed5116102f45780632a0a4ed514610575578063313ce5671461057d57806332a7ae951461059b578063378c93ad146105c15761035d565b80631f0f06aa146104ab57806323b872dd1461051957806324b50e431461054f5761035d565b806306fdde0314610362578063095ea7b3146103df5780630c6f0e5d1461041f57806318160ddd146104435780631993982d1461045d5780631e3b9de514610485575b600080fd5b61036a610bba565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a457818101518382015260200161038c565b50505050905090810190601f1680156103d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61040b600480360360408110156103f557600080fd5b506001600160a01b038135169060200135610bf3565b604080519115158252519081900360200190f35b610427610c0a565b604080516001600160a01b039092168252519081900360200190f35b61044b610c19565b60408051918252519081900360200190f35b6104836004803603602081101561047357600080fd5b50356001600160a01b0316610c1f565b005b6104276004803603602081101561049b57600080fd5b50356001600160a01b0316610d89565b610483600480360360208110156104c157600080fd5b810190602081018135600160201b8111156104db57600080fd5b8201836020820111156104ed57600080fd5b803590602001918460018302840111600160201b8311171561050e57600080fd5b509092509050610daa565b61040b6004803603606081101561052f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e57565b61044b6004803603602081101561056557600080fd5b50356001600160a01b0316610eae565b610427610ec9565b610585610ed8565b6040805160ff9092168252519081900360200190f35b610483600480360360208110156105b157600080fd5b50356001600160a01b0316610edd565b610483600480360360208110156105d757600080fd5b50351515611143565b61044b611162565b61040b600480360360408110156105fe57600080fd5b506001600160a01b038135169060200135611168565b6104836004803603604081101561062a57600080fd5b506001600160a01b0381351690602001356111a4565b61044b6111f7565b6104276004803603602081101561065e57600080fd5b50356001600160a01b03166111fd565b6104836004803603604081101561068457600080fd5b506001600160a01b038135169060200135611225565b610483600480360360208110156106b057600080fd5b50356112d0565b6106dd600480360360208110156106cd57600080fd5b50356001600160a01b0316611345565b6040805192835260208301919091528051918290030190f35b6104276004803603602081101561070c57600080fd5b503561135e565b6104836004803603602081101561072957600080fd5b5035611385565b61040b6113e0565b6104836004803603606081101561074e57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561077d57600080fd5b82018360208201111561078f57600080fd5b803590602001918460018302840111600160201b831117156107b057600080fd5b5090925090506113f0565b61044b61151e565b610483600480360360608110156107d957600080fd5b506001600160a01b038135169060208101359060400135611524565b6104836115d9565b61044b6004803603602081101561081357600080fd5b50356001600160a01b031661173e565b610483611759565b61044b6004803603602081101561084157600080fd5b50356001600160a01b03166117ec565b61044b6004803603602081101561086757600080fd5b50356001600160a01b031661180a565b61044b61184c565b61044b611852565b610427611858565b61040b600480360360208110156108a557600080fd5b50356001600160a01b0316611867565b610483600480360360208110156108cb57600080fd5b50356001600160a01b031661187c565b61036a611b65565b610483600480360360808110156108f957600080fd5b813515159190810190604081016020820135600160201b81111561091c57600080fd5b82018360208201111561092e57600080fd5b803590602001918460018302840111600160201b8311171561094f57600080fd5b91935091506001600160a01b038135169060200135611b84565b61044b6004803603602081101561097f57600080fd5b50356001600160a01b0316611c76565b61044b600480360360208110156109a557600080fd5b50356001600160a01b0316611c94565b61040b600480360360408110156109cb57600080fd5b506001600160a01b038135169060200135611d63565b610483600480360360208110156109f757600080fd5b5035611d9f565b61040b60048036036040811015610a1457600080fd5b506001600160a01b038135169060200135611e33565b61044b611e8a565b610a5860048036036020811015610a4857600080fd5b50356001600160a01b0316611eab565b604080516001600160a01b039586168152602081019490945263ffffffff90921683830152909216606082015290519081900360800190f35b61048360048036036020811015610aa757600080fd5b50356001600160a01b0316611ee6565b61048360048036036020811015610acd57600080fd5b5035611fb3565b61036a612005565b61044b60048036036040811015610af257600080fd5b506001600160a01b0381358116916020013516612034565b61048360048036036060811015610b2057600080fd5b506001600160a01b0381358116916020810135909116906040013561205f565b61044b60048036036020811015610b5657600080fd5b50356001600160a01b03166125cc565b61044b6125f0565b61048360048036036020811015610b8457600080fd5b50356001600160a01b03166125f6565b61040b60048036036020811015610baa57600080fd5b50356001600160a01b0316612651565b6040518060400160405280601781526020017f5365727669636548756e7465722041472053686172657300000000000000000081525081565b6000610c00338484612670565b5060015b92915050565b6009546001600160a01b031681565b60025490565b600b546001600160a01b03163314610c685760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b60005b600e54811015610d8557816001600160a01b0316600e8281548110610c8c57fe5b6000918252602090912001546001600160a01b03161415610d7d57600e80546000198101908110610cb957fe5b600091825260209091200154600e80546001600160a01b039092169183908110610cdf57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600e805480610d1857fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b038516815290517fc3f6f866f10921ec4857ee8fe667183cd1751e53ed509c992689bece36ca1898929181900390910190a15b600101610c6b565b5050565b6001600160a01b03808216600090815260066020526040902054165b919050565b600b546001600160a01b03163314610df35760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b7f07ce702fc13ca0620c174dab22996a6d5fd9e7accb663555a4e85323692706ba828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6000610e6484848461275c565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610ea4918691610e9f908663ffffffff6127c016565b612670565b5060019392505050565b6001600160a01b031660009081526007602052604090205490565b600b546001600160a01b031690565b600081565b610ee5610ec9565b6001600160a01b0316336001600160a01b031614610f4a576040805162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604482015290519081900360640190fd5b610f52612ef1565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff811693820193909352600160201b909204909216606082018190529091610ff3576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b6001600160a01b03808416600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055855186830151825163a9059cbb60e01b81529186166004830152602482015290519385169363a9059cbb93604480840194938390030190829087803b15801561107d57600080fd5b505af1158015611091573d6000803e3d6000fd5b505050506040513d60208110156110a757600080fd5b50516110f7576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b815160208084015160408051918252516001600160a01b03938416938716927fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d5928290030190a3505050565b336000908152600860205260409020805460ff19169115919091179055565b600d5481565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c00918590610e9f908663ffffffff6127d216565b600b546001600160a01b031633146111ed5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b610d8582826127df565b600c5481565b6001600160a01b03908116600090815260066020526040902060020154600160201b90041690565b600b546001600160a01b0316331461126e5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600c546112898261127d611e8a565b9063ffffffff6127d216565b11156112c65760405162461bcd60e51b815260040180806020018281038252602d81526020018061311d602d913960400191505060405180910390fd5b610d8582826128b2565b6112d93361173e565b81111561132d576040805162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682073686172657320617661696c61626c650000000000604482015290519081900360640190fd5b61133833308361275c565b61134230826129a2565b50565b6007602052600090815260409020805460019091015482565b600e818154811061136b57fe5b6000918252602090912001546001600160a01b0316905081565b604080518082018252828152426020808301918252336000818152600790925284822093518455915160019093019290925591517f4c767b7b6b4e5b19edbb3ce0f841c467aa366beda334c58254bb264371819a119190a250565b600b54600160a01b900460ff1681565b600b546001600160a01b031633146114395760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b60006114448561173e565b9050808411156114855760405162461bcd60e51b8152600401808060200182810382526032815260200180612f9a6032913960400191505060405180910390fd5b600d54611498908563ffffffff6127d216565b600d55604080516001600160a01b03871681526020810186905260609181018281529181018490527f0a605cd1294f60fa3b73548ac68428f33300a051f225afcdcc75e56083c96ee791879187918791879160808201848480828437600083820152604051601f909101601f191690920182900397509095505050505050a15050505050565b600a5481565b600b546001600160a01b0316331461156d5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b61158b83611586600161127d858763ffffffff6127c016565b611225565b604080516001600160a01b03851681526020810184905280820183905290517f7b37b2b4bba7b5ea40a69f93db727c289fbbaa632be8186cfa85e0297e0013199181900360600190a1505050565b336000908152600660205260409020600101541561173c5733600081815260066020908152604080832060018101805460028301805484546001600160a01b031916909455918690556001600160c01b03198316909155825163a9059cbb60e01b815260048101969096526024860181905291519194600160201b9091046001600160a01b031693849363a9059cbb93604480850194929391928390030190829087803b15801561168957600080fd5b505af115801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b5051611703576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b60408051838152905133917f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd919081900360200190a250505b565b6001600160a01b031660009081526020819052604090205490565b600b546001600160a01b031633146117a25760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600b546040516001600160a01b03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600b80546001600160a01b0319169055565b6001600160a01b031660009081526007602052604090206001015490565b60006001600160a01b03821630141561182557506001610da5565b6009546001600160a01b03838116911614156118445750600a54610da5565b506000610da5565b60035481565b60055481565b600b546001600160a01b031681565b60086020526000908152604090205460ff1681565b611884612ef1565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff811693820193909352600160201b9092049092166060820181905290919081611927576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b82516001600160a01b03163314611985576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604482015290519081900360640190fd5b426119ab60035463ffffffff16856040015163ffffffff166127d290919063ffffffff16565b11156119fe576040805162461bcd60e51b815260206004820152601960248201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604482015290519081900360640190fd5b82516001600160a01b03808616600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055805163a9059cbb60e01b815284861660048201526024810188905290519386169363a9059cbb93604480840194938390030190829087803b158015611a8657600080fd5b505af1158015611a9a573d6000803e3d6000fd5b505050506040513d6020811015611ab057600080fd5b5051611b00576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b611b138582611b0e8861173e565b61275c565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040518082815260200191505060405180910390a35050505050565b6040518060400160405280600381526020016253485360e81b81525081565b600b546001600160a01b03163314611bcd5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600b805460ff60a01b1916600160a01b87151590810291909117909155604080519182526001600160a01b03841690820152606081018290526080602082018181529082018590527f016e2c313f98497b8330a5114aff9a72424bdf37c47e7cba23fc54dd480bc6dd918791879187918791879160a08201868680828437600083820152604051601f909101601f19169092018290039850909650505050505050a15050505050565b6001600160a01b031660009081526006602052604090206001015490565b600080611ca08361173e565b905060005b600e54811015611d5c576000600e8281548110611cbe57fe5b60009182526020918290200154604080516370a0823160e01b81526001600160a01b0389811660048301529151919092169350611d519284926370a082319260248083019392829003018186803b158015611d1857600080fd5b505afa158015611d2c573d6000803e3d6000fd5b505050506040513d6020811015611d4257600080fd5b5051849063ffffffff6127d216565b925050600101611ca5565b5092915050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c00918590610e9f908663ffffffff6127c016565b600b546001600160a01b03163314611de85760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b611df0611e8a565b811015611e2e5760405162461bcd60e51b8152600401808060200182810382526027815260200180612fef6027913960400191505060405180910390fd5b600c55565b6000611e3f8383612a7b565b611e82576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b610c006115d9565b6000611ea6600d54611e9a610c19565b9063ffffffff6127c016565b905090565b6006602052600090815260409020805460018201546002909201546001600160a01b03918216929163ffffffff821691600160201b90041684565b600b546001600160a01b03163314611f2f5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f7417b75095e577f15d994b058af7a3a71f67be4ae2f288725d1b922f6bb67a679181900360200190a150565b600b546001600160a01b03163314611ffc5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b61134281612a88565b6040518060400160405280601381526020017238bab4ba3a1731b417b4b73b32b9ba37b932b760691b81525081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0382166120ba576040805162461bcd60e51b815260206004820152601860248201527f43616e277420636c61696d207a65726f20616464726573730000000000000000604482015290519081900360640190fd5b6120c382612651565b612114576040805162461bcd60e51b815260206004820181905260248201527f436c61696d732064697361626c656420666f7220746869732061646472657373604482015290519081900360640190fd5b600061211f8461180a565b905060008111612176576040805162461bcd60e51b815260206004820152601b60248201527f556e737570706f7274656420636f6c6c61746572616c20747970650000000000604482015290519081900360640190fd5b3360006121828561173e565b90506000612196828563ffffffff612b1c16565b905086826121eb576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604482015290519081900360640190fd5b60408051636eb1769f60e11b81526001600160a01b0386811660048301523060248301529151849284169163dd62ed3e916044808301926020929190829003018186803b15801561223b57600080fd5b505afa15801561224f573d6000803e3d6000fd5b505050506040513d602081101561226557600080fd5b505110156122ba576040805162461bcd60e51b815260206004820152601f60248201527f43757272656e637920616c6c6f77616e636520696e73756666696369656e7400604482015290519081900360640190fd5b81816001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561231157600080fd5b505afa158015612325573d6000803e3d6000fd5b505050506040513d602081101561233b57600080fd5b50511015612390576040805162461bcd60e51b815260206004820152601d60248201527f43757272656e63792062616c616e636520696e73756666696369656e74000000604482015290519081900360640190fd5b6001600160a01b038716600090815260066020526040902060010154156123fe576040805162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d6564000000000000000000604482015290519081900360640190fd5b6124088787612b41565b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918316916323b872dd916064808201926020929091908290030181600087803b15801561246157600080fd5b505af1158015612475573d6000803e3d6000fd5b505050506040513d602081101561248b57600080fd5b50516124db576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b604080516080810182526001600160a01b0386811680835260208084018781524263ffffffff9081168688019081528f8616606088019081528f87166000818152600687528a812099518a546001600160a01b031916908a16178a5594516001808b0191909155925160029099018054925163ffffffff199093169990941698909817640100000000600160c01b031916600160201b919097160295909517905582815260078252858120818155909301929092558351878152935190937f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535992908290030190a35050505050505050565b6001600160a01b031660009081526006602052604090206002015463ffffffff1690565b60045481565b33731b5aed8cc7b7b8f02de451f7cda5292d629c045f146126485760405162461bcd60e51b815260040180806020018281038252602781526020018061303c6027913960400191505060405180910390fd5b61134281612d0e565b6001600160a01b031660009081526008602052604090205460ff161590565b6001600160a01b0383166126b55760405162461bcd60e51b81526004018080602001828103825260248152602001806130d46024913960400191505060405180910390fd5b6001600160a01b0382166126fa5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f536022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600b54600160a01b900460ff16156127b0576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604482015290519081900360640190fd5b6127bb838383612daf565b505050565b6000828211156127cc57fe5b50900390565b81810182811015610c0457fe5b600980546001600160a01b0319166001600160a01b0384811691909117918290551661280f576000600a5561286a565b60008111612864576040805162461bcd60e51b815260206004820152601d60248201527f436f6c6c61746572616c20726174652063616e2774206265207a65726f000000604482015290519081900360640190fd5b600a8190555b604080516001600160a01b03841681526020810183905281517f94238858463adf0fecc0e064844831a54bccf8467c86f0b93d2a9508e0596853929181900390910190a15050565b6001600160a01b03821661290d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612920908263ffffffff6127d216565b6002556001600160a01b03821660009081526020819052604090205461294c908263ffffffff6127d216565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166129e75760405162461bcd60e51b81526004018080602001828103825260218152602001806130636021913960400191505060405180910390fd5b6002546129fa908263ffffffff6127c016565b6002556001600160a01b038216600090815260208190526040902054612a26908263ffffffff6127c016565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6000610c0033848461275c565b605a8111612ac75760405162461bcd60e51b81526004018080602001828103825260258152602001806130f86025913960400191505060405180910390fd5b6000612adc826201518063ffffffff612b1c16565b60038190556040805182815290519192507ffde5ae686f4fb7b301820b66139fa5cbed90c4b91428ce2fe961558fcac47ba6919081900360200190a15050565b600082612b2b57506000610c04565b5081810281838281612b3957fe5b0414610c0457fe5b612b49612f18565b50336000908152600760209081526040918290208251808401909352805480845260019091015491830191909152612bc8576040805162461bcd60e51b815260206004820152601a60248201527f4d65737361676520686173682063616e2774206265207a65726f000000000000604482015290519081900360640190fd5b42612be260045483602001516127d290919063ffffffff16565b1115612c1f5760405162461bcd60e51b815260040180806020018281038252602b8152602001806130a9602b913960400191505060405180910390fd5b42612c3960055483602001516127d290919063ffffffff16565b1015612c765760405162461bcd60e51b8152600401808060200182810382526025815260200180612f756025913960400191505060405180910390fd5b60408051602080820185905233606090811b8385015286901b6bffffffffffffffffffffffff1916605483015282518083036048018152606890920190925280519101208151146127bb576040805162461bcd60e51b815260206004820152601e60248201527f5061636b61676520636f756c64206e6f742062652076616c6964617465640000604482015290519081900360640190fd5b6001600160a01b038116612d535760405162461bcd60e51b8152600401808060200182810382526023815260200180612fcc6023913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316612df45760405162461bcd60e51b81526004018080602001828103825260258152602001806130846025913960400191505060405180910390fd5b6001600160a01b038216612e395760405162461bcd60e51b8152600401808060200182810382526023815260200180612f306023913960400191505060405180910390fd5b6001600160a01b038316600090815260208190526040902054612e62908263ffffffff6127c016565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612e97908263ffffffff6127d216565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b60408051808201909152600080825260208201529056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373507265636c61696d20706572696f6420656e642e20436c61696d656420746f6f206c61746543616e6e6f7420696e76616c6964617465206d6f726520746f6b656e73207468616e2068656c6420627920616464726573735a65726f20616464726573732063616e2774206f776e2074686520636f6e747261637454686572652063616e277420626520666577657220746f6b656e73207468616e20736861726573596f7520617265206e6f7420746865206f776e6572206f66207468697320636f6e7472616374596f7520617265206e6f7420746865206d6173746572206f66207468697320636f6e747261637445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373507265636c61696d20706572696f642076696f6c617465642e20436c61696d656420746f6f206561726c7945524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436c61696d20706572696f64206d757374206265206174206c65617374203930206461797354686572652063616e277420626520666577657220736861726573207468616e2076616c696420746f6b656e73a265627a7a72305820fe518375150ed8aac66e2c7f5cf1e9ac74d9c7429fc8a12ed33458b056671b5864736f6c634300050a0032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061035d5760003560e01c80636b03ed5f116101d3578063a457c2d711610104578063d5025625116100a2578063eb470ebf1161007c578063eb470ebf14610b40578063ee18d99e14610b66578063f2fde38b14610b6e578063f66f145a14610b945761035d565b8063d502562514610ad4578063dd62ed3e14610adc578063e5a8765a14610b0a5761035d565b8063b0d04c7a116100de578063b0d04c7a14610a2a578063c6788bdd14610a32578063cc51e14314610a91578063d2c04f4314610ab75761035d565b8063a457c2d7146109b5578063a77384c1146109e1578063a9059cbb146109fe5761035d565b80638da5cb5b1161017157806395d89b411161014b57806395d89b41146108db578063980591f4146108e35780639b56d6c914610969578063a26cf59f1461098f5761035d565b80638da5cb5b146108875780638e0597c11461088f57806394d645a8146108b55761035d565b806375a88bcf116101ad57806375a88bcf1461082b57806377e071ad146108515780637dc2cd98146108775780637dde2a021461087f5761035d565b80636b03ed5f146107f557806370a08231146107fd578063715018a6146108235761035d565b806337a8129c116102ad578063493c160f1161024b5780635c975abb116102255780635c975abb146107305780635d6624b71461073857806360918117146107bb57806369f721e2146107c35761035d565b8063493c160f146106b75780634ae5e630146106f65780635b1c1625146107135761035d565b80633a98ef39116102875780633a98ef39146106405780633bcc45ba1461064857806340c10f191461066e57806342966c681461069a5761035d565b806337a8129c146105e057806339509351146105e85780633a1cdf32146106145761035d565b80631f0f06aa1161031a5780632a0a4ed5116102f45780632a0a4ed514610575578063313ce5671461057d57806332a7ae951461059b578063378c93ad146105c15761035d565b80631f0f06aa146104ab57806323b872dd1461051957806324b50e431461054f5761035d565b806306fdde0314610362578063095ea7b3146103df5780630c6f0e5d1461041f57806318160ddd146104435780631993982d1461045d5780631e3b9de514610485575b600080fd5b61036a610bba565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103a457818101518382015260200161038c565b50505050905090810190601f1680156103d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61040b600480360360408110156103f557600080fd5b506001600160a01b038135169060200135610bf3565b604080519115158252519081900360200190f35b610427610c0a565b604080516001600160a01b039092168252519081900360200190f35b61044b610c19565b60408051918252519081900360200190f35b6104836004803603602081101561047357600080fd5b50356001600160a01b0316610c1f565b005b6104276004803603602081101561049b57600080fd5b50356001600160a01b0316610d89565b610483600480360360208110156104c157600080fd5b810190602081018135600160201b8111156104db57600080fd5b8201836020820111156104ed57600080fd5b803590602001918460018302840111600160201b8311171561050e57600080fd5b509092509050610daa565b61040b6004803603606081101561052f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e57565b61044b6004803603602081101561056557600080fd5b50356001600160a01b0316610eae565b610427610ec9565b610585610ed8565b6040805160ff9092168252519081900360200190f35b610483600480360360208110156105b157600080fd5b50356001600160a01b0316610edd565b610483600480360360208110156105d757600080fd5b50351515611143565b61044b611162565b61040b600480360360408110156105fe57600080fd5b506001600160a01b038135169060200135611168565b6104836004803603604081101561062a57600080fd5b506001600160a01b0381351690602001356111a4565b61044b6111f7565b6104276004803603602081101561065e57600080fd5b50356001600160a01b03166111fd565b6104836004803603604081101561068457600080fd5b506001600160a01b038135169060200135611225565b610483600480360360208110156106b057600080fd5b50356112d0565b6106dd600480360360208110156106cd57600080fd5b50356001600160a01b0316611345565b6040805192835260208301919091528051918290030190f35b6104276004803603602081101561070c57600080fd5b503561135e565b6104836004803603602081101561072957600080fd5b5035611385565b61040b6113e0565b6104836004803603606081101561074e57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561077d57600080fd5b82018360208201111561078f57600080fd5b803590602001918460018302840111600160201b831117156107b057600080fd5b5090925090506113f0565b61044b61151e565b610483600480360360608110156107d957600080fd5b506001600160a01b038135169060208101359060400135611524565b6104836115d9565b61044b6004803603602081101561081357600080fd5b50356001600160a01b031661173e565b610483611759565b61044b6004803603602081101561084157600080fd5b50356001600160a01b03166117ec565b61044b6004803603602081101561086757600080fd5b50356001600160a01b031661180a565b61044b61184c565b61044b611852565b610427611858565b61040b600480360360208110156108a557600080fd5b50356001600160a01b0316611867565b610483600480360360208110156108cb57600080fd5b50356001600160a01b031661187c565b61036a611b65565b610483600480360360808110156108f957600080fd5b813515159190810190604081016020820135600160201b81111561091c57600080fd5b82018360208201111561092e57600080fd5b803590602001918460018302840111600160201b8311171561094f57600080fd5b91935091506001600160a01b038135169060200135611b84565b61044b6004803603602081101561097f57600080fd5b50356001600160a01b0316611c76565b61044b600480360360208110156109a557600080fd5b50356001600160a01b0316611c94565b61040b600480360360408110156109cb57600080fd5b506001600160a01b038135169060200135611d63565b610483600480360360208110156109f757600080fd5b5035611d9f565b61040b60048036036040811015610a1457600080fd5b506001600160a01b038135169060200135611e33565b61044b611e8a565b610a5860048036036020811015610a4857600080fd5b50356001600160a01b0316611eab565b604080516001600160a01b039586168152602081019490945263ffffffff90921683830152909216606082015290519081900360800190f35b61048360048036036020811015610aa757600080fd5b50356001600160a01b0316611ee6565b61048360048036036020811015610acd57600080fd5b5035611fb3565b61036a612005565b61044b60048036036040811015610af257600080fd5b506001600160a01b0381358116916020013516612034565b61048360048036036060811015610b2057600080fd5b506001600160a01b0381358116916020810135909116906040013561205f565b61044b60048036036020811015610b5657600080fd5b50356001600160a01b03166125cc565b61044b6125f0565b61048360048036036020811015610b8457600080fd5b50356001600160a01b03166125f6565b61040b60048036036020811015610baa57600080fd5b50356001600160a01b0316612651565b6040518060400160405280601781526020017f5365727669636548756e7465722041472053686172657300000000000000000081525081565b6000610c00338484612670565b5060015b92915050565b6009546001600160a01b031681565b60025490565b600b546001600160a01b03163314610c685760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b60005b600e54811015610d8557816001600160a01b0316600e8281548110610c8c57fe5b6000918252602090912001546001600160a01b03161415610d7d57600e80546000198101908110610cb957fe5b600091825260209091200154600e80546001600160a01b039092169183908110610cdf57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600e805480610d1857fe5b6000828152602090819020820160001990810180546001600160a01b0319169055909101909155604080516001600160a01b038516815290517fc3f6f866f10921ec4857ee8fe667183cd1751e53ed509c992689bece36ca1898929181900390910190a15b600101610c6b565b5050565b6001600160a01b03808216600090815260066020526040902054165b919050565b600b546001600160a01b03163314610df35760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b7f07ce702fc13ca0620c174dab22996a6d5fd9e7accb663555a4e85323692706ba828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6000610e6484848461275c565b6001600160a01b038416600090815260016020908152604080832033808552925290912054610ea4918691610e9f908663ffffffff6127c016565b612670565b5060019392505050565b6001600160a01b031660009081526007602052604090205490565b600b546001600160a01b031690565b600081565b610ee5610ec9565b6001600160a01b0316336001600160a01b031614610f4a576040805162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604482015290519081900360640190fd5b610f52612ef1565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff811693820193909352600160201b909204909216606082018190529091610ff3576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b6001600160a01b03808416600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055855186830151825163a9059cbb60e01b81529186166004830152602482015290519385169363a9059cbb93604480840194938390030190829087803b15801561107d57600080fd5b505af1158015611091573d6000803e3d6000fd5b505050506040513d60208110156110a757600080fd5b50516110f7576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b815160208084015160408051918252516001600160a01b03938416938716927fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d5928290030190a3505050565b336000908152600860205260409020805460ff19169115919091179055565b600d5481565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c00918590610e9f908663ffffffff6127d216565b600b546001600160a01b031633146111ed5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b610d8582826127df565b600c5481565b6001600160a01b03908116600090815260066020526040902060020154600160201b90041690565b600b546001600160a01b0316331461126e5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600c546112898261127d611e8a565b9063ffffffff6127d216565b11156112c65760405162461bcd60e51b815260040180806020018281038252602d81526020018061311d602d913960400191505060405180910390fd5b610d8582826128b2565b6112d93361173e565b81111561132d576040805162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682073686172657320617661696c61626c650000000000604482015290519081900360640190fd5b61133833308361275c565b61134230826129a2565b50565b6007602052600090815260409020805460019091015482565b600e818154811061136b57fe5b6000918252602090912001546001600160a01b0316905081565b604080518082018252828152426020808301918252336000818152600790925284822093518455915160019093019290925591517f4c767b7b6b4e5b19edbb3ce0f841c467aa366beda334c58254bb264371819a119190a250565b600b54600160a01b900460ff1681565b600b546001600160a01b031633146114395760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b60006114448561173e565b9050808411156114855760405162461bcd60e51b8152600401808060200182810382526032815260200180612f9a6032913960400191505060405180910390fd5b600d54611498908563ffffffff6127d216565b600d55604080516001600160a01b03871681526020810186905260609181018281529181018490527f0a605cd1294f60fa3b73548ac68428f33300a051f225afcdcc75e56083c96ee791879187918791879160808201848480828437600083820152604051601f909101601f191690920182900397509095505050505050a15050505050565b600a5481565b600b546001600160a01b0316331461156d5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b61158b83611586600161127d858763ffffffff6127c016565b611225565b604080516001600160a01b03851681526020810184905280820183905290517f7b37b2b4bba7b5ea40a69f93db727c289fbbaa632be8186cfa85e0297e0013199181900360600190a1505050565b336000908152600660205260409020600101541561173c5733600081815260066020908152604080832060018101805460028301805484546001600160a01b031916909455918690556001600160c01b03198316909155825163a9059cbb60e01b815260048101969096526024860181905291519194600160201b9091046001600160a01b031693849363a9059cbb93604480850194929391928390030190829087803b15801561168957600080fd5b505af115801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b5051611703576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b60408051838152905133917f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd919081900360200190a250505b565b6001600160a01b031660009081526020819052604090205490565b600b546001600160a01b031633146117a25760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600b546040516001600160a01b03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600b80546001600160a01b0319169055565b6001600160a01b031660009081526007602052604090206001015490565b60006001600160a01b03821630141561182557506001610da5565b6009546001600160a01b03838116911614156118445750600a54610da5565b506000610da5565b60035481565b60055481565b600b546001600160a01b031681565b60086020526000908152604090205460ff1681565b611884612ef1565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff811693820193909352600160201b9092049092166060820181905290919081611927576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b82516001600160a01b03163314611985576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604482015290519081900360640190fd5b426119ab60035463ffffffff16856040015163ffffffff166127d290919063ffffffff16565b11156119fe576040805162461bcd60e51b815260206004820152601960248201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604482015290519081900360640190fd5b82516001600160a01b03808616600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055805163a9059cbb60e01b815284861660048201526024810188905290519386169363a9059cbb93604480840194938390030190829087803b158015611a8657600080fd5b505af1158015611a9a573d6000803e3d6000fd5b505050506040513d6020811015611ab057600080fd5b5051611b00576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b611b138582611b0e8861173e565b61275c565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040518082815260200191505060405180910390a35050505050565b6040518060400160405280600381526020016253485360e81b81525081565b600b546001600160a01b03163314611bcd5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600b805460ff60a01b1916600160a01b87151590810291909117909155604080519182526001600160a01b03841690820152606081018290526080602082018181529082018590527f016e2c313f98497b8330a5114aff9a72424bdf37c47e7cba23fc54dd480bc6dd918791879187918791879160a08201868680828437600083820152604051601f909101601f19169092018290039850909650505050505050a15050505050565b6001600160a01b031660009081526006602052604090206001015490565b600080611ca08361173e565b905060005b600e54811015611d5c576000600e8281548110611cbe57fe5b60009182526020918290200154604080516370a0823160e01b81526001600160a01b0389811660048301529151919092169350611d519284926370a082319260248083019392829003018186803b158015611d1857600080fd5b505afa158015611d2c573d6000803e3d6000fd5b505050506040513d6020811015611d4257600080fd5b5051849063ffffffff6127d216565b925050600101611ca5565b5092915050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c00918590610e9f908663ffffffff6127c016565b600b546001600160a01b03163314611de85760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b611df0611e8a565b811015611e2e5760405162461bcd60e51b8152600401808060200182810382526027815260200180612fef6027913960400191505060405180910390fd5b600c55565b6000611e3f8383612a7b565b611e82576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b610c006115d9565b6000611ea6600d54611e9a610c19565b9063ffffffff6127c016565b905090565b6006602052600090815260409020805460018201546002909201546001600160a01b03918216929163ffffffff821691600160201b90041684565b600b546001600160a01b03163314611f2f5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f7417b75095e577f15d994b058af7a3a71f67be4ae2f288725d1b922f6bb67a679181900360200190a150565b600b546001600160a01b03163314611ffc5760405162461bcd60e51b81526004018080602001828103825260268152602001806130166026913960400191505060405180910390fd5b61134281612a88565b6040518060400160405280601381526020017238bab4ba3a1731b417b4b73b32b9ba37b932b760691b81525081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0382166120ba576040805162461bcd60e51b815260206004820152601860248201527f43616e277420636c61696d207a65726f20616464726573730000000000000000604482015290519081900360640190fd5b6120c382612651565b612114576040805162461bcd60e51b815260206004820181905260248201527f436c61696d732064697361626c656420666f7220746869732061646472657373604482015290519081900360640190fd5b600061211f8461180a565b905060008111612176576040805162461bcd60e51b815260206004820152601b60248201527f556e737570706f7274656420636f6c6c61746572616c20747970650000000000604482015290519081900360640190fd5b3360006121828561173e565b90506000612196828563ffffffff612b1c16565b905086826121eb576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604482015290519081900360640190fd5b60408051636eb1769f60e11b81526001600160a01b0386811660048301523060248301529151849284169163dd62ed3e916044808301926020929190829003018186803b15801561223b57600080fd5b505afa15801561224f573d6000803e3d6000fd5b505050506040513d602081101561226557600080fd5b505110156122ba576040805162461bcd60e51b815260206004820152601f60248201527f43757272656e637920616c6c6f77616e636520696e73756666696369656e7400604482015290519081900360640190fd5b81816001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561231157600080fd5b505afa158015612325573d6000803e3d6000fd5b505050506040513d602081101561233b57600080fd5b50511015612390576040805162461bcd60e51b815260206004820152601d60248201527f43757272656e63792062616c616e636520696e73756666696369656e74000000604482015290519081900360640190fd5b6001600160a01b038716600090815260066020526040902060010154156123fe576040805162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d6564000000000000000000604482015290519081900360640190fd5b6124088787612b41565b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918316916323b872dd916064808201926020929091908290030181600087803b15801561246157600080fd5b505af1158015612475573d6000803e3d6000fd5b505050506040513d602081101561248b57600080fd5b50516124db576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b604080516080810182526001600160a01b0386811680835260208084018781524263ffffffff9081168688019081528f8616606088019081528f87166000818152600687528a812099518a546001600160a01b031916908a16178a5594516001808b0191909155925160029099018054925163ffffffff199093169990941698909817640100000000600160c01b031916600160201b919097160295909517905582815260078252858120818155909301929092558351878152935190937f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535992908290030190a35050505050505050565b6001600160a01b031660009081526006602052604090206002015463ffffffff1690565b60045481565b33731b5aed8cc7b7b8f02de451f7cda5292d629c045f146126485760405162461bcd60e51b815260040180806020018281038252602781526020018061303c6027913960400191505060405180910390fd5b61134281612d0e565b6001600160a01b031660009081526008602052604090205460ff161590565b6001600160a01b0383166126b55760405162461bcd60e51b81526004018080602001828103825260248152602001806130d46024913960400191505060405180910390fd5b6001600160a01b0382166126fa5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f536022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600b54600160a01b900460ff16156127b0576040805162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604482015290519081900360640190fd5b6127bb838383612daf565b505050565b6000828211156127cc57fe5b50900390565b81810182811015610c0457fe5b600980546001600160a01b0319166001600160a01b0384811691909117918290551661280f576000600a5561286a565b60008111612864576040805162461bcd60e51b815260206004820152601d60248201527f436f6c6c61746572616c20726174652063616e2774206265207a65726f000000604482015290519081900360640190fd5b600a8190555b604080516001600160a01b03841681526020810183905281517f94238858463adf0fecc0e064844831a54bccf8467c86f0b93d2a9508e0596853929181900390910190a15050565b6001600160a01b03821661290d576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612920908263ffffffff6127d216565b6002556001600160a01b03821660009081526020819052604090205461294c908263ffffffff6127d216565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166129e75760405162461bcd60e51b81526004018080602001828103825260218152602001806130636021913960400191505060405180910390fd5b6002546129fa908263ffffffff6127c016565b6002556001600160a01b038216600090815260208190526040902054612a26908263ffffffff6127c016565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6000610c0033848461275c565b605a8111612ac75760405162461bcd60e51b81526004018080602001828103825260258152602001806130f86025913960400191505060405180910390fd5b6000612adc826201518063ffffffff612b1c16565b60038190556040805182815290519192507ffde5ae686f4fb7b301820b66139fa5cbed90c4b91428ce2fe961558fcac47ba6919081900360200190a15050565b600082612b2b57506000610c04565b5081810281838281612b3957fe5b0414610c0457fe5b612b49612f18565b50336000908152600760209081526040918290208251808401909352805480845260019091015491830191909152612bc8576040805162461bcd60e51b815260206004820152601a60248201527f4d65737361676520686173682063616e2774206265207a65726f000000000000604482015290519081900360640190fd5b42612be260045483602001516127d290919063ffffffff16565b1115612c1f5760405162461bcd60e51b815260040180806020018281038252602b8152602001806130a9602b913960400191505060405180910390fd5b42612c3960055483602001516127d290919063ffffffff16565b1015612c765760405162461bcd60e51b8152600401808060200182810382526025815260200180612f756025913960400191505060405180910390fd5b60408051602080820185905233606090811b8385015286901b6bffffffffffffffffffffffff1916605483015282518083036048018152606890920190925280519101208151146127bb576040805162461bcd60e51b815260206004820152601e60248201527f5061636b61676520636f756c64206e6f742062652076616c6964617465640000604482015290519081900360640190fd5b6001600160a01b038116612d535760405162461bcd60e51b8152600401808060200182810382526023815260200180612fcc6023913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316612df45760405162461bcd60e51b81526004018080602001828103825260258152602001806130846025913960400191505060405180910390fd5b6001600160a01b038216612e395760405162461bcd60e51b8152600401808060200182810382526023815260200180612f306023913960400191505060405180910390fd5b6001600160a01b038316600090815260208190526040902054612e62908263ffffffff6127c016565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612e97908263ffffffff6127d216565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b60408051808201909152600080825260208201529056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373507265636c61696d20706572696f6420656e642e20436c61696d656420746f6f206c61746543616e6e6f7420696e76616c6964617465206d6f726520746f6b656e73207468616e2068656c6420627920616464726573735a65726f20616464726573732063616e2774206f776e2074686520636f6e747261637454686572652063616e277420626520666577657220746f6b656e73207468616e20736861726573596f7520617265206e6f7420746865206f776e6572206f66207468697320636f6e7472616374596f7520617265206e6f7420746865206d6173746572206f66207468697320636f6e747261637445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373507265636c61696d20706572696f642076696f6c617465642e20436c61696d656420746f6f206561726c7945524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436c61696d20706572696f64206d757374206265206174206c65617374203930206461797354686572652063616e277420626520666577657220736861726573207468616e2076616c696420746f6b656e73a265627a7a72305820fe518375150ed8aac66e2c7f5cf1e9ac74d9c7429fc8a12ed33458b056671b5864736f6c634300050a0032
Deployed Bytecode Sourcemap
38356:7509:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38356:7509:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38501:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38501:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10317:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10317:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19842:38;;;:::i;:::-;;;;-1:-1:-1;;;;;19842:38:0;;;;;;;;;;;;;;9340:91;;;:::i;:::-;;;;;;;;;;;;;;;;40665:389;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40665:389:0;-1:-1:-1;;;;;40665:389:0;;:::i;:::-;;26867:126;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26867:126:0;-1:-1:-1;;;;;26867:126:0;;:::i;41645:113::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41645:113:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41645:113:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41645:113:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;41645:113:0;;-1:-1:-1;41645:113:0;-1:-1:-1;41645:113:0;:::i;10936:256::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10936:256:0;;;;;;;;;;;;;;;;;:::i;27572:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27572:133:0;-1:-1:-1;;;;;27572:133:0;;:::i;42139:83::-;;;:::i;38624:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29654:514;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29654:514:0;-1:-1:-1;;;;;29654:514:0;;:::i;21993:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21993:101:0;;;;:::i;38796:32::-;;;:::i;11601:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11601:206:0;;;;;;;;:::i;41976:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41976:155:0;;;;;;;;:::i;38704:34::-;;;:::i;27139:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27139:136:0;-1:-1:-1;;;;;27139:136:0;;:::i;43492:232::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43492:232:0;;;;;;;;:::i;45454:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45454:225:0;;:::i;19535:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19535:45:0;-1:-1:-1;;;;;19535:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38837:29;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38837:29:0;;:::i;24554:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24554:235:0;;:::i;34572:26::-;;;:::i;42556:373::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;42556:373:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42556:373:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42556:373:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;42556:373:0;;-1:-1:-1;42556:373:0;-1:-1:-1;42556:373:0;:::i;19887:35::-;;;:::i;44419:278::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;44419:278:0;;;;;;;;;;;;;:::i;28151:427::-;;;:::i;9494:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9494:110:0;-1:-1:-1;;;;;9494:110:0;;:::i;32433:124::-;;;:::i;27419:145::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27419:145:0;-1:-1:-1;;;;;27419:145:0;;:::i;20260:319::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20260:319:0;-1:-1:-1;;;;;20260:319:0;;:::i;19120:37::-;;;:::i;19296:41::-;;;:::i;31664:20::-;;;:::i;19661:48::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19661:48:0;-1:-1:-1;;;;;19661:48:0;;:::i;28764:757::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28764:757:0;-1:-1:-1;;;;;28764:757:0;;:::i;38457:37::-;;;:::i;34903:214::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;34903:214:0;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;34903:214:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;34903:214:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;34903:214:0;;-1:-1:-1;34903:214:0;-1:-1:-1;;;;;;34903:214:0;;;;;;;;:::i;27001:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27001:130:0;-1:-1:-1;;;;;27001:130:0;;:::i;41194:334::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41194:334:0;-1:-1:-1;;;;;41194:334:0;;:::i;12310:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12310:216:0;;;;;;;;:::i;39570:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39570:216:0;;:::i;27713:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27713:200:0;;;;;;;;:::i;43177:116::-;;;:::i;19410:39::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19410:39:0;-1:-1:-1;;;;;19410:39:0;;:::i;:::-;;;;-1:-1:-1;;;;;19410:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40480:177;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40480:177:0;-1:-1:-1;;;;;40480:177:0;;:::i;41766:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41766:129:0;;:::i;38563:52::-;;;:::i;10036:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10036:134:0;;;;;;;;;;:::i;25392:1467::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25392:1467:0;;;;;;;;;;;;;;;;;:::i;27283:128::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27283:128:0;-1:-1:-1;;;;;27283:128:0;;:::i;19188:38::-;;;:::i;32720:184::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32720:184:0;-1:-1:-1;;;;;32720:184:0;;:::i;22276:119::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22276:119:0;-1:-1:-1;;;;;22276:119:0;;:::i;38501:55::-;;;;;;;;;;;;;;;;;;;:::o;10317:148::-;10382:4;10399:36;10408:10;10420:7;10429:5;10399:8;:36::i;:::-;-1:-1:-1;10453:4:0;10317:148;;;;;:::o;19842:38::-;;;-1:-1:-1;;;;;19842:38:0;;:::o;9340:91::-;9411:12;;9340:91;:::o;40665:389::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40752:9;40747:300;40769:12;:19;40767:21;;40747:300;;;40833:15;-1:-1:-1;;;;;40814:34:0;:12;40827:1;40814:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40814:15:0;:34;40810:226;;;40887:12;40900:19;;-1:-1:-1;;40900:23:0;;;40887:37;;;;;;;;;;;;;;;;40869:12;:15;;-1:-1:-1;;;;;40887:37:0;;;;40882:1;;40869:15;;;;;;;;;;;;;;:55;;;;;-1:-1:-1;;;;;40869:55:0;;;;;-1:-1:-1;;;;;40869:55:0;;;;;;40943:12;:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;40943:18:0;;;;;-1:-1:-1;;;;;;40943:18:0;;;;;;;;;40985:35;;;-1:-1:-1;;;;;40985:35:0;;;;;;;;;;;;;;;;;40810:226;40790:3;;40747:300;;;;40665:389;:::o;26867:126::-;-1:-1:-1;;;;;26957:19:0;;;26930:7;26957:19;;;:6;:19;;;;;:28;;26867:126;;;;:::o;41645:113::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41729:21;41742:7;;41729:21;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;41729:21:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;41729:21:0;;;;-1:-1:-1;41729:21:0;;-1:-1:-1;;;;41729:21:0;41645:113;;:::o;10936:256::-;11025:4;11042:36;11052:6;11060:9;11071:6;11042:9;:36::i;:::-;-1:-1:-1;;;;;11118:19:0;;;;;;:11;:19;;;;;;;;11106:10;11118:31;;;;;;;;;11089:73;;11098:6;;11118:43;;11154:6;11118:43;:35;:43;:::i;:::-;11089:8;:73::i;:::-;-1:-1:-1;11180:4:0;10936:256;;;;;:::o;27572:133::-;-1:-1:-1;;;;;27664:25:0;27637:7;27664:25;;;:9;:25;;;;;:33;;27572:133::o;42139:83::-;42209:5;;-1:-1:-1;;;;;42209:5:0;42139:83;:::o;38624:34::-;38657:1;38624:34;:::o;29654:514::-;29736:17;:15;:17::i;:::-;-1:-1:-1;;;;;29722:31:0;:10;-1:-1:-1;;;;;29722:31:0;;29714:68;;;;;-1:-1:-1;;;29714:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29793:18;;:::i;:::-;-1:-1:-1;;;;;;29814:19:0;;;;;;;:6;:19;;;;;;;;;29793:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29793:40:0;;;;;;;;;;;;;;29899:48;;;;;-1:-1:-1;;;29899:48:0;;;;;;;;;;;;-1:-1:-1;;;29899:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29965:19:0;;;;;;;:6;:19;;;;;;;;29958:26;;-1:-1:-1;;;;;;29958:26:0;;;;;;;;;;;;;-1:-1:-1;;;;;;29958:26:0;;;30021:14;;30037:16;;;;30003:51;;-1:-1:-1;;;30003:51:0;;;;;29958:26;30003:51;;;;;;;;;:17;;;;;;:51;;;;;29965:19;30003:51;;;;;;;:17;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;30003:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30003:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30003:51:0;29995:90;;;;;-1:-1:-1;;;29995:90:0;;;;;;;;;;;;-1:-1:-1;;;29995:90:0;;;;;;;;;;;;;;;30127:14;;30143:16;;;;;30101:59;;;;;;;-1:-1:-1;;;;;30101:59:0;;;;;;;;;;;;;;;29654:514;;;:::o;21993:101::-;22064:10;22047:28;;;;:16;:28;;;;;:39;;-1:-1:-1;;22047:39:0;22078:8;;22047:39;;;;;;21993:101::o;38796:32::-;;;;:::o;11601:206::-;11707:10;11681:4;11728:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;11728:32:0;;;;;;;;;;11681:4;;11698:79;;11719:7;;11728:48;;11765:10;11728:48;:36;:48;:::i;41976:155::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42074:49;42106:10;42118:4;42074:31;:49::i;38704:34::-;;;;:::o;27139:136::-;-1:-1:-1;;;;;27235:19:0;;;27208:7;27235:19;;;:6;:19;;;;;:32;;;-1:-1:-1;;;27235:32:0;;;;27139:136::o;43492:232::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43617:11;;43582:31;43605:7;43582:18;:16;:18::i;:::-;:22;:31;:22;:31;:::i;:::-;:46;;43574:104;;;;-1:-1:-1;;;43574:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43689:27;43695:11;43708:7;43689:5;:27::i;45454:225::-;45522:21;45532:10;45522:9;:21::i;:::-;45511:7;:32;;45503:72;;;;;-1:-1:-1;;;45503:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45586:45;45596:10;45616:4;45623:7;45586:9;:45::i;:::-;45642:29;45656:4;45663:7;45642:5;:29::i;:::-;45454:225;:::o;19535:45::-;;;;;;;;;;;;;;;;;;;:::o;38837:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38837:29:0;;-1:-1:-1;38837:29:0;:::o;24554:235::-;24641:99;;;;;;;;;;;24713:15;24641:99;;;;;;;24627:10;-1:-1:-1;24617:21:0;;;:9;:21;;;;;;:123;;;;;;;;;;;;;;24756:25;;;;-1:-1:-1;24756:25:0;24554:235;:::o;34572:26::-;;;-1:-1:-1;;;34572:26:0;;;;;:::o;42556:373::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42669:21;42693:17;42703:6;42693:9;:17::i;:::-;42669:41;;42739:13;42729:6;:23;;42721:86;;;;-1:-1:-1;;;42721:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42834:13;;:25;;42852:6;42834:25;:17;:25;:::i;:::-;42818:13;:41;42875:46;;;-1:-1:-1;;;;;42875:46:0;;;;;;;;;;;;;;;;;;;;;;;;;42897:6;;42905;;42913:7;;;;42875:46;;;42913:7;;;;42875:46;1:33:-1;99:1;81:16;;;74:27;42875:46:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;42875:46:0;;;;-1:-1:-1;42875:46:0;;-1:-1:-1;;;;;;42875:46:0;32327:1;42556:373;;;;:::o;19887:35::-;;;;:::o;44419:278::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44543:63;44548:11;44561:44;44603:1;44561:37;:15;44581:16;44561:37;:19;:37;:::i;:44::-;44543:4;:63::i;:::-;44622:67;;;-1:-1:-1;;;;;44622:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44419:278;;;:::o;28151:427::-;28202:10;28195:18;;;;:6;:18;;;;;:29;;;:34;28191:380;;28274:10;28246:18;28267;;;:6;:18;;;;;;;;:29;;;;;28336:31;;;;;28383:25;;-1:-1:-1;;;;;;28383:25:0;;;;;;;;-1:-1:-1;;;;;;28383:25:0;;;;;28431:41;;-1:-1:-1;;;28431:41:0;;28336:31;28431:41;;;;;;;;;;;;;;28267:29;;-1:-1:-1;;;28336:31:0;;;-1:-1:-1;;;;;28336:31:0;;;;28431:17;;:41;;;;;28267:18;;28431:41;;;;;;;;;28336:31;28431:41;;;5:2:-1;;;;30:1;27;20:12;5:2;28431:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28431:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28431:41:0;28423:80;;;;;-1:-1:-1;;;28423:80:0;;;;;;;;;;;;-1:-1:-1;;;28423:80:0;;;;;;;;;;;;;;;28523:36;;;;;;;;28536:10;;28523:36;;;;;;;;;;28191:380;;;28151:427::o;9494:110::-;-1:-1:-1;;;;;9578:18:0;9551:7;9578:18;;;;;;;;;;;;9494:110::o;32433:124::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32514:5;;32495:25;;-1:-1:-1;;;;;32514:5:0;;;;32495:25;;32514:5;;32495:25;32531:5;:18;;-1:-1:-1;;;;;;32531:18:0;;;32433:124::o;27419:145::-;-1:-1:-1;;;;;27521:25:0;27494:7;27521:25;;;:9;:25;;;;;:35;;;;27419:145::o;20260:319::-;20332:7;-1:-1:-1;;;;;20356:31:0;;20382:4;20356:31;20352:220;;;-1:-1:-1;20411:1:0;20404:8;;20352:220;20452:23;;-1:-1:-1;;;;;20434:41:0;;;20452:23;;20434:41;20430:142;;;-1:-1:-1;20499:20:0;;20492:27;;20430:142;-1:-1:-1;20559:1:0;20552:8;;19120:37;;;;:::o;19296:41::-;;;;:::o;31664:20::-;;;-1:-1:-1;;;;;31664:20:0;;:::o;19661:48::-;;;;;;;;;;;;;;;:::o;28764:757::-;28825:18;;:::i;:::-;-1:-1:-1;;;;;;28846:19:0;;;;;;;:6;:19;;;;;;;;;28825:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28825:40:0;;;;;;;;;;;;;;;28987:15;28979:42;;;;;-1:-1:-1;;;28979:42:0;;;;;;;;;;;;-1:-1:-1;;;28979:42:0;;;;;;;;;;;;;;;29040:14;;-1:-1:-1;;;;;29040:28:0;29058:10;29040:28;29032:72;;;;;-1:-1:-1;;;29032:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29167:15;29123:40;29150:11;;29123:40;;:5;:15;;;:19;;;;:40;;;;:::i;:::-;:59;;29115:97;;;;;-1:-1:-1;;;29115:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29242:14;;-1:-1:-1;;;;;29274:19:0;;;29223:16;29274:19;;;:6;:19;;;;;;;;29267:26;;-1:-1:-1;;;;;;29267:26:0;;;;;;;;;;;;;-1:-1:-1;;;;;;29267:26:0;;;29312:39;;-1:-1:-1;;;29312:39:0;;;;;29267:26;29312:39;;;;;;;;;;;:17;;;;;;:39;;;;;29274:19;29312:39;;;;;;;:17;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;29312:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29312:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29312:39:0;29304:78;;;;;-1:-1:-1;;;29304:78:0;;;;;;;;;;;;-1:-1:-1;;;29304:78:0;;;;;;;;;;;;;;;29393:56;29403:11;29416:8;29426:22;29436:11;29426:9;:22::i;:::-;29393:9;:56::i;:::-;29492:8;-1:-1:-1;;;;;29465:48:0;29479:11;-1:-1:-1;;;;;29465:48:0;;29502:10;29465:48;;;;;;;;;;;;;;;;;;28764:757;;;;;:::o;38457:37::-;;;;;;;;;;;;;;-1:-1:-1;;;38457:37:0;;;;:::o;34903:214::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35030:6;:15;;-1:-1:-1;;;;35030:15:0;-1:-1:-1;;;35030:15:0;;;;;;;;;;;;;35061:48;;;;;;-1:-1:-1;;;;;35061:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35030:15;;35075:8;;35061:48;;;;;;;;;35075:8;35061:48;;35075:8;35061:48;1:33:-1;99:1;81:16;;;74:27;35061:48:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;35061:48:0;;;;-1:-1:-1;35061:48:0;;-1:-1:-1;;;;;;;35061:48:0;34903:214;;;;;:::o;27001:130::-;-1:-1:-1;;;;;27093:19:0;27066:7;27093:19;;;:6;:19;;;;;:30;;;;27001:130::o;41194:334::-;41254:7;41274:15;41292:17;41302:6;41292:9;:17::i;:::-;41274:35;-1:-1:-1;41325:9:0;41320:176;41342:12;:19;41340:21;;41320:176;;;41383:13;41406:12;41419:1;41406:15;;;;;;;;;;;;;;;;;;;41459:24;;;-1:-1:-1;;;41459:24:0;;-1:-1:-1;;;;;41459:24:0;;;;;;;;;41406:15;;;;;-1:-1:-1;41447:37:0;;41406:15;;41459:16;;:24;;;;;41406:15;41459:24;;;;;41406:15;41459:24;;;5:2:-1;;;;30:1;27;20:12;5:2;41459:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41459:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41459:24:0;41447:7;;:37;:11;:37;:::i;:::-;41437:47;-1:-1:-1;;41363:3:0;;41320:176;;;-1:-1:-1;41513:7:0;41194:334;-1:-1:-1;;41194:334:0:o;12310:216::-;12421:10;12395:4;12442:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12442:32:0;;;;;;;;;;12395:4;;12412:84;;12433:7;;12442:53;;12479:15;12442:53;:36;:53;:::i;39570:216::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39676:18;:16;:18::i;:::-;39657:15;:37;;39649:89;;;;-1:-1:-1;;;39649:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39749:11;:29;39570:216::o;27713:200::-;27782:4;27807:33;27822:9;27833:6;27807:14;:33::i;:::-;27799:61;;;;;-1:-1:-1;;;27799:61:0;;;;;;;;;;;;-1:-1:-1;;;27799:61:0;;;;;;;;;;;;;;;27871:12;:10;:12::i;43177:116::-;43226:7;43253:32;43271:13;;43253;:11;:13::i;:::-;:17;:32;:17;:32;:::i;:::-;43246:39;;43177:116;:::o;19410:39::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19410:39:0;;;;;;;;;-1:-1:-1;;;19410:39:0;;;;:::o;40480:177::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40566:12;27:10:-1;;39:1;23:18;;45:23;;-1:-1;40566:34:0;;;;;;;;-1:-1:-1;;;;;40566:34:0;;-1:-1:-1;;;;;;40566:34:0;;;;;;;;40616:33;;;;;;;;;;;;40566:34;40616:33;;;40480:177;:::o;41766:129::-;32268:5;;-1:-1:-1;;;;;32268:5:0;32254:10;:19;32246:70;;;;-1:-1:-1;;;32246:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41847:40;41869:17;41847:21;:40::i;38563:52::-;;;;;;;;;;;;;;-1:-1:-1;;;38563:52:0;;;;:::o;10036:134::-;-1:-1:-1;;;;;10135:18:0;;;10108:7;10135:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10036:134::o;25392:1467::-;-1:-1:-1;;;;;25499:25:0;;25491:62;;;;;-1:-1:-1;;;25491:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25572:28;25588:11;25572:15;:28::i;:::-;25564:73;;;;;-1:-1:-1;;;25564:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25648:22;25673:33;25691:14;25673:17;:33::i;:::-;25648:58;;25742:1;25725:14;:18;25717:58;;;;;-1:-1:-1;;;25717:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25805:10;25786:16;25844:22;25854:11;25844:9;:22::i;:::-;25826:40;-1:-1:-1;25877:18:0;25898:27;25826:40;25910:14;25898:27;:11;:27;:::i;:::-;25877:48;-1:-1:-1;25961:14:0;25995:11;25987:55;;;;;-1:-1:-1;;;25987:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26061:43;;;-1:-1:-1;;;26061:43:0;;-1:-1:-1;;;;;26061:43:0;;;;;;;26098:4;26061:43;;;;;;26108:10;;26061:18;;;;;:43;;;;;;;;;;;;;;:18;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;26061:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26061:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26061:43:0;:57;;26053:101;;;;;-1:-1:-1;;;26053:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:10;26173:8;-1:-1:-1;;;;;26173:18:0;;26192:8;26173:28;;;;;;;;;;;;;-1:-1:-1;;;;;26173:28:0;-1:-1:-1;;;;;26173:28:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26173:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26173:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26173:28:0;:42;;26165:84;;;;;-1:-1:-1;;;26165:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26268:19:0;;;;;;:6;:19;;;;;:30;;;:35;26260:71;;;;;-1:-1:-1;;;26260:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26342:33;26356:11;26369:5;26342:13;:33::i;:::-;26394:58;;;-1:-1:-1;;;26394:58:0;;-1:-1:-1;;;;;26394:58:0;;;;;;;26434:4;26394:58;;;;;;;;;;;;:21;;;;;;:58;;;;;;;;;;;;;;;-1:-1:-1;26394:21:0;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;26394:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26394:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26394:58:0;26386:97;;;;;-1:-1:-1;;;26386:97:0;;;;;;;;;;;;-1:-1:-1;;;26386:97:0;;;;;;;;;;;;;;;26518:237;;;;;;;;-1:-1:-1;;;;;26518:237:0;;;;;;;;;;;;;26627:15;26518:237;;;;;;;;;;;;;;;;;;;26496:19;;;-1:-1:-1;26496:19:0;;;:6;:19;;;;;:259;;;;-1:-1:-1;;;;;;26496:259:0;;;;;;;;;-1:-1:-1;26496:259:0;;;;;;;;;;;;;;;;;-1:-1:-1;;26496:259:0;;;;;;;;;;;-1:-1:-1;;;;;;26496:259:0;-1:-1:-1;;;26496:259:0;;;;;;;;;;;26775:19;;;:9;:19;;;;;26768:26;;;;;;;;;;26810:41;;;;;;;26518:237;;26810:41;;;;;;;;;25392:1467;;;;;;;;:::o;27283:128::-;-1:-1:-1;;;;;27374:19:0;27347:7;27374:19;;;:6;:19;;;;;:29;;;;;;27283:128::o;19188:38::-;;;;:::o;32720:184::-;32792:10;31717:42;32792:20;32784:72;;;;-1:-1:-1;;;32784:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32867:29;32886:9;32867:18;:29::i;22276:119::-;-1:-1:-1;;;;;22363:24:0;22338:4;22363:24;;;:16;:24;;;;;;;;22362:25;;22276:119::o;15113:335::-;-1:-1:-1;;;;;15206:19:0;;15198:68;;;;-1:-1:-1;;;15198:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15285:21:0;;15277:68;;;;-1:-1:-1;;;15277:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15358:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;15409:31;;;;;;;;;;;;;;;;;15113:335;;;:::o;45687:173::-;45778:6;;-1:-1:-1;;;45778:6:0;;;;45777:7;45769:38;;;;;-1:-1:-1;;;45769:38:0;;;;;;;;;;;;-1:-1:-1;;;45769:38:0;;;;;;;;;;;;;;;45818:34;45834:4;45840:3;45845:6;45818:15;:34::i;:::-;45687:173;;;:::o;2326:123::-;2384:7;2416:1;2411;:6;;2404:14;;;;-1:-1:-1;2436:5:0;;;2326:123::o;2518:141::-;2602:5;;;2625:6;;;;2618:14;;;21035:436;21124:23;:36;;-1:-1:-1;;;;;;21124:36:0;-1:-1:-1;;;;;21124:36:0;;;;;;;;;;;21175:23;21171:231;;21252:1;21229:20;:24;21171:231;;;21313:1;21306:4;:8;21298:50;;;;;-1:-1:-1;;;21298:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21363:20;:27;;;21171:231;21417:46;;;-1:-1:-1;;;;;21417:46:0;;;;;;;;;;;;;;;;;;;;;;;21035:436;;:::o;13726:308::-;-1:-1:-1;;;;;13802:21:0;;13794:65;;;;;-1:-1:-1;;;13794:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13887:12;;:24;;13904:6;13887:24;:16;:24;:::i;:::-;13872:12;:39;-1:-1:-1;;;;;13943:18:0;;:9;:18;;;;;;;;;;;:30;;13966:6;13943:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;13922:18:0;;:9;:18;;;;;;;;;;;:51;;;;13989:37;;;;;;;13922:18;;:9;;13989:37;;;;;;;;;;13726:308;;:::o;14367:306::-;-1:-1:-1;;;;;14442:21:0;;14434:67;;;;-1:-1:-1;;;14434:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14529:12;;:23;;14546:5;14529:23;:16;:23;:::i;:::-;14514:12;:38;-1:-1:-1;;;;;14584:18:0;;:9;:18;;;;;;;;;;;:29;;14607:5;14584:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;14563:18:0;;:9;:18;;;;;;;;;;;:50;;;;14629:36;;;;;;;14563:9;;14629:36;;;;;;;;;;;14367:306;;:::o;9817:156::-;9886:4;9903:40;9913:10;9925:9;9936:6;9903:9;:40::i;21642:343::-;21742:2;21722:17;:22;21714:72;;;;-1:-1:-1;;;21714:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21825:28;21856:29;:17;21878:6;21856:29;:21;:29;:::i;:::-;21896:11;:34;;;21946:31;;;;;;;;21825:60;;-1:-1:-1;21946:31:0;;;;;;;;;;21642:343;;:::o;1399:424::-;1457:9;1703:6;1699:47;;-1:-1:-1;1733:1:0;1726:8;;1699:47;-1:-1:-1;1762:5:0;;;1766:1;1762;:5;:1;1785:5;;;;;:10;1778:18;;;24797:587;24880:24;;:::i;:::-;-1:-1:-1;24917:10:0;24907:21;;;;:9;:21;;;;;;;;;24880:48;;;;;;;;;;;;;;;;;;;;;;;;;24939:60;;;;;-1:-1:-1;;;24939:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25060:15;25018:38;25041:14;;25018:8;:18;;;:22;;:38;;;;:::i;:::-;:57;;25010:113;;;;-1:-1:-1;;;25010:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25187:15;25142:41;25165:17;;25142:8;:18;;;:22;;:41;;;;:::i;:::-;:60;;25134:110;;;;-1:-1:-1;;;25134:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25293:48;;;;;;;;;;25317:10;25293:48;;;;;;;;;;;-1:-1:-1;;25293:48:0;;;;;;;26:21:-1;;;22:32;;6:49;;25293:48:0;;;;;;;25283:59;;;;;25263:16;;:79;25255:121;;;;;-1:-1:-1;;;25255:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33047:228;-1:-1:-1;;;;;33122:23:0;;33114:71;;;;-1:-1:-1;;;33114:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33222:5;;33201:38;;-1:-1:-1;;;;;33201:38:0;;;;33222:5;;33201:38;;33222:5;;33201:38;33250:5;:17;;-1:-1:-1;;;;;;33250:17:0;-1:-1:-1;;;;;33250:17:0;;;;;;;;;;33047:228::o;13016:429::-;-1:-1:-1;;;;;13114:20:0;;13106:70;;;;-1:-1:-1;;;13106:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13195:23:0;;13187:71;;;;-1:-1:-1;;;13187:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13291:17:0;;:9;:17;;;;;;;;;;;:29;;13313:6;13291:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;13271:17:0;;;:9;:17;;;;;;;;;;;:49;;;;13354:20;;;;;;;:32;;13379:6;13354:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;13331:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;13402:35;;;;;;;13331:20;;13402:35;;;;;;;;;;;;;13016:429;;;:::o;38356:7509::-;;;;;;;;;-1:-1:-1;38356:7509:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;38356:7509:0;;;;;;;;:::o
Swarm Source
bzzr://fe518375150ed8aac66e2c7f5cf1e9ac74d9c7429fc8a12ed33458b056671b58
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.