ETH Price: $2,050.37 (-1.95%)

Contract

0xBc41F5259E10E36341ff0DA77A5870abc698de56
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve97674222020-03-29 15:51:402184 days ago1585497100IN
0xBc41F525...bc698de56
0 ETH0.000088082
Resolve Claim97672262020-03-29 15:07:292184 days ago1585494449IN
0xBc41F525...bc698de56
0 ETH0.000048731.1
Approve86367902019-09-28 10:29:522367 days ago1569666592IN
0xBc41F525...bc698de56
0 ETH0.0006809215
Approve86366752019-09-28 10:03:062367 days ago1569664986IN
0xBc41F525...bc698de56
0 ETH0.0007615616.8
Mint Numbered86366712019-09-28 10:02:382367 days ago1569664958IN
0xBc41F525...bc698de56
0 ETH0.0009132616.8
Declare Lost86189962019-09-25 15:52:192370 days ago1569426739IN
0xBc41F525...bc698de56
0 ETH0.0024639225
Prepare Claim86125812019-09-24 15:35:012371 days ago1569339301IN
0xBc41F525...bc698de56
0 ETH0.0009099814
Declare Lost86125152019-09-24 15:21:062371 days ago1569338466IN
0xBc41F525...bc698de56
0 ETH0.0007742124
Approve86061002019-09-23 14:58:242372 days ago1569250704IN
0xBc41F525...bc698de56
0 ETH0.000907920
Prepare Claim86060522019-09-23 14:47:222372 days ago1569250042IN
0xBc41F525...bc698de56
0 ETH0.0012999820
Mint Numbered86044422019-09-23 8:45:032372 days ago1569228303IN
0xBc41F525...bc698de56
0 ETH0.0010859420
Mint Numbered85790642019-09-19 9:41:122376 days ago1568886072IN
0xBc41F525...bc698de56
0 ETH0.0015962730
Approve85787702019-09-19 8:36:482376 days ago1568882208IN
0xBc41F525...bc698de56
0 ETH0.0013618530
Mint Numbered85787502019-09-19 8:31:252376 days ago1568881885IN
0xBc41F525...bc698de56
0 ETH0.0020808330
Set Total Shares85787422019-09-19 8:28:512376 days ago1568881731IN
0xBc41F525...bc698de56
0 ETH0.0008283330
Transfer Ownersh...85613352019-09-16 15:36:142379 days ago1568648174IN
0xBc41F525...bc698de56
0 ETH0.0003311311

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ServiceHunterShares

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, MIT license
/**
 *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

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

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.