ETH Price: $2,703.71 (+8.76%)
 

Overview

Max Total Supply

1,000,000,000 PRIMARY

Holders

3,398

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 10 Decimals)

Balance
3,750 PRIMARY

Value
$0.00
0x8cee98f3791fd253a5048a222cdfb8cada0a9a39
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PrimaryCoin

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 5: PrimaryCoin.sol
pragma solidity  ^0.5.7;

import "./Primary_Libs.sol";
import "./Primary_General.sol";
import "./Primary_IERC20.sol";
import "./Primary_ERC20.sol";

contract PrimaryCoin is Identity, ERC20, ERC20Pausable, ERC20Burnable, ERC20Detailed, UniformTokenGrantor 
{
    uint32 public constant VERSION = 3;
    uint8 private constant DECIMALS = 10;
//    uint256 private constant TOKEN_WEI = 10 ** uint256(DECIMALS);
//    uint256 private constant INITIAL_WHOLE_TOKENS = uint256(1 * (10 ** 8));
//    uint256 private constant INITIAL_SUPPLY = uint256(INITIAL_WHOLE_TOKENS) * uint256(TOKEN_WEI);
 	  uint256 private constant INITIAL_SUPPLY = 10000000000000000000;

    constructor () ERC20Detailed("Primary", "PRIMARY", DECIMALS) public {
        // This is the only place where we ever mint tokens.
        _mint(msg.sender, INITIAL_SUPPLY);
    }

    event DepositReceived(address indexed from, uint256 value);

    function() payable external {
        emit DepositReceived(msg.sender, msg.value);
    }

    function burn(uint256 value) onlyIfFundsAvailableNow(msg.sender, value) public {
        _burn(msg.sender, value);
    }

    function kill() whenPaused onlyPauser public returns (bool itsDeadJim) {
        require(isPauser(msg.sender), "onlyPauser");
        address payable payableOwner = address(uint160(owner()));
        selfdestruct(payableOwner);
        return true;
    }
}

File 2 of 5: Primary_ERC20.sol
pragma solidity ^0.5.0;

import "./Primary_Libs.sol";
import "./Primary_General.sol";
import "./Primary_IERC20.sol";

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

     function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    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, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    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);
    }

    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }


    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract ERC20Burnable is Context, ERC20 {

    function burn(uint256 amount) public {
        _burn(_msgSender(), amount);
    }

    function burnFrom(address account, uint256 amount) public {
        _burnFrom(account, amount);
    }
}

contract ERC20Pausable is ERC20, Pausable {
    function transfer(address to, uint256 value) public whenNotPaused returns (bool) {
        return super.transfer(to, value);
    }

    function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) {
        return super.transferFrom(from, to, value);
    }

    function approve(address spender, uint256 value) public whenNotPaused returns (bool) {
        return super.approve(spender, value);
    }

    function increaseAllowance(address spender, uint256 addedValue) public whenNotPaused returns (bool) {
        return super.increaseAllowance(spender, addedValue);
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public whenNotPaused returns (bool) {
        return super.decreaseAllowance(spender, subtractedValue);
    }
}

contract VerifiedAccount is ERC20, Ownable {

    mapping(address => bool) private _isRegistered;

    constructor () internal {
        registerAccount();
    }

    event AccountRegistered(address indexed account);

    function registerAccount() public returns (bool ok) {
        _isRegistered[msg.sender] = true;
        emit AccountRegistered(msg.sender);
        return true;
    }

    function isRegistered(address account) public view returns (bool ok) {
        return _isRegistered[account];
    }

    function _accountExists(address account) internal view returns (bool exists) {
        return account == msg.sender || _isRegistered[account];
    }

    modifier onlyExistingAccount(address account) {
        require(_accountExists(account), "account not registered");
        _;
    }

    function safeTransfer(address to, uint256 value) public onlyExistingAccount(to) returns (bool ok) {
        transfer(to, value);
        return true;
    }

    function safeApprove(address spender, uint256 value) public onlyExistingAccount(spender) returns (bool ok) {
        approve(spender, value);
        return true;
    }

    function safeTransferFrom(address from, address to, uint256 value) public onlyExistingAccount(to) returns (bool ok) {
        transferFrom(from, to, value);
        return true;
    }

    function transferOwnership(address newOwner) public onlyExistingAccount(newOwner) onlyOwner {
        super.transferOwnership(newOwner);
    }
}


contract ERC20Vestable is ERC20, VerifiedAccount, GrantorRole, IERC20Vestable {
    using SafeMath for uint256;

    uint32 private constant THOUSAND_YEARS_DAYS = 365243;                   /* See https://www.timeanddate.com/date/durationresult.html?m1=1&d1=1&y1=2000&m2=1&d2=1&y2=3000 */
    uint32 private constant TEN_YEARS_DAYS = THOUSAND_YEARS_DAYS / 100;     /* Includes leap years (though it doesn't really matter) */
    uint32 private constant SECONDS_PER_DAY = 24 * 60 * 60;                 /* 86400 seconds in a day */
    uint32 private constant JAN_1_2000_SECONDS = 946684800;                 /* Saturday, January 1, 2000 0:00:00 (GMT) (see https://www.epochconverter.com/) */
    uint32 private constant JAN_1_2000_DAYS = JAN_1_2000_SECONDS / SECONDS_PER_DAY;
    uint32 private constant JAN_1_3000_DAYS = JAN_1_2000_DAYS + THOUSAND_YEARS_DAYS;

    struct vestingSchedule {
        bool isValid;               /* true if an entry exists and is valid */
        bool isRevocable;           /* true if the vesting option is revocable (a gift), false if irrevocable (purchased) */
        uint32 cliffDuration;       /* Duration of the cliff, with respect to the grant start day, in days. */
        uint32 duration;            /* Duration of the vesting schedule, with respect to the grant start day, in days. */
        uint32 interval;            /* Duration in days of the vesting interval. */
    }

    struct tokenGrant {
        bool isActive;              /* true if this vesting entry is active and in-effect entry. */
        bool wasRevoked;            /* true if this vesting schedule was revoked. */
        uint32 startDay;            /* Start day of the grant, in days since the UNIX epoch (start of day). */
        uint256 amount;             /* Total number of tokens that vest. */
        address vestingLocation;    /* Address of wallet that is holding the vesting schedule. */
        address grantor;            /* Grantor that made the grant */
    }

    mapping(address => vestingSchedule) private _vestingSchedules;
    mapping(address => tokenGrant) private _tokenGrants;



    function _setVestingSchedule(
        address vestingLocation,
        uint32 cliffDuration, uint32 duration, uint32 interval,
        bool isRevocable) internal returns (bool ok) {

        require(
            duration > 0 && duration <= TEN_YEARS_DAYS
            && cliffDuration < duration
            && interval >= 1,
            "invalid vesting schedule"
        );

        require(
            duration % interval == 0 && cliffDuration % interval == 0,
            "invalid cliff/duration for interval"
        );

        _vestingSchedules[vestingLocation] = vestingSchedule(
            true/*isValid*/,
            isRevocable,
            cliffDuration, duration, interval
        );

        emit VestingScheduleCreated(
            vestingLocation,
            cliffDuration, duration, interval,
            isRevocable);
        return true;
    }

    function _hasVestingSchedule(address account) internal view returns (bool ok) {
        return _vestingSchedules[account].isValid;
    }

    function getIntrinsicVestingSchedule(address grantHolder)
    public
    view
    onlyGrantorOrSelf(grantHolder)
    returns (
        uint32 vestDuration,
        uint32 cliffDuration,
        uint32 vestIntervalDays
    )
    {
        return (
        _vestingSchedules[grantHolder].duration,
        _vestingSchedules[grantHolder].cliffDuration,
        _vestingSchedules[grantHolder].interval
        );
    }

    function _grantVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay,
        address vestingLocation,
        address grantor
    )
    internal returns (bool ok)
    {
        require(!_tokenGrants[beneficiary].isActive, "grant already exists");

        require(
            vestingAmount <= totalAmount && vestingAmount > 0
            && startDay >= JAN_1_2000_DAYS && startDay < JAN_1_3000_DAYS,
            "invalid vesting params");

        require(_hasVestingSchedule(vestingLocation), "no such vesting schedule");

        _transfer(grantor, beneficiary, totalAmount);

        _tokenGrants[beneficiary] = tokenGrant(
            true/*isActive*/,
            false/*wasRevoked*/,
            startDay,
            vestingAmount,
            vestingLocation, /* The wallet address where the vesting schedule is kept. */
            grantor             /* The account that performed the grant (where revoked funds would be sent) */
        );

        emit VestingTokensGranted(beneficiary, vestingAmount, startDay, vestingLocation, grantor);
        return true;
    }


    function grantVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay,
        uint32 duration,
        uint32 cliffDuration,
        uint32 interval,
        bool isRevocable
    ) public onlyGrantor returns (bool ok) {
        require(!_tokenGrants[beneficiary].isActive, "grant already exists");

        _setVestingSchedule(beneficiary, cliffDuration, duration, interval, isRevocable);

        _grantVestingTokens(beneficiary, totalAmount, vestingAmount, startDay, beneficiary, msg.sender);

        return true;
    }

    function safeGrantVestingTokens(
        address beneficiary, uint256 totalAmount, uint256 vestingAmount,
        uint32 startDay, uint32 duration, uint32 cliffDuration, uint32 interval,
        bool isRevocable) public onlyGrantor onlyExistingAccount(beneficiary) returns (bool ok) {

        return grantVestingTokens(
            beneficiary, totalAmount, vestingAmount,
            startDay, duration, cliffDuration, interval,
            isRevocable);
    }

    function today() public view returns (uint32 dayNumber) {
        return uint32(block.timestamp / SECONDS_PER_DAY);
    }

    function _effectiveDay(uint32 onDayOrToday) internal view returns (uint32 dayNumber) {
        return onDayOrToday == 0 ? today() : onDayOrToday;
    }

    function _getNotVestedAmount(address grantHolder, uint32 onDayOrToday) internal view returns (uint256 amountNotVested) {
        tokenGrant storage grant = _tokenGrants[grantHolder];
        vestingSchedule storage vesting = _vestingSchedules[grant.vestingLocation];
        uint32 onDay = _effectiveDay(onDayOrToday);

        if (!grant.isActive || onDay < grant.startDay + vesting.cliffDuration)
        {
            return grant.amount;
        }
        else if (onDay >= grant.startDay + vesting.duration)
        {
            return uint256(0);
        }
        else
        {
            uint32 daysVested = onDay - grant.startDay;
            uint32 effectiveDaysVested = (daysVested / vesting.interval) * vesting.interval;
            uint256 vested = grant.amount.mul(effectiveDaysVested).div(vesting.duration);
            return grant.amount.sub(vested);
        }
    }

    function _getAvailableAmount(address grantHolder, uint32 onDay) internal view returns (uint256 amountAvailable) {
        uint256 totalTokens = balanceOf(grantHolder);
        uint256 vested = totalTokens.sub(_getNotVestedAmount(grantHolder, onDay));
        return vested;
    }

    function vestingForAccountAsOf(
        address grantHolder,
        uint32 onDayOrToday
    )
    public
    view
    onlyGrantorOrSelf(grantHolder)
    returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 vestDuration,
        uint32 cliffDuration,
        uint32 vestIntervalDays,
        bool isActive,
        bool wasRevoked
    )
    {
        tokenGrant storage grant = _tokenGrants[grantHolder];
        vestingSchedule storage vesting = _vestingSchedules[grant.vestingLocation];
        uint256 notVestedAmount = _getNotVestedAmount(grantHolder, onDayOrToday);
        uint256 grantAmount = grant.amount;

        return (
        grantAmount.sub(notVestedAmount),
        notVestedAmount,
        grantAmount,
        grant.startDay,
        vesting.duration,
        vesting.cliffDuration,
        vesting.interval,
        grant.isActive,
        grant.wasRevoked
        );
    }

    function vestingAsOf(uint32 onDayOrToday) public view returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 vestDuration,
        uint32 cliffDuration,
        uint32 vestIntervalDays,
        bool isActive,
        bool wasRevoked
    )
    {
        return vestingForAccountAsOf(msg.sender, onDayOrToday);
    }

    function _fundsAreAvailableOn(address account, uint256 amount, uint32 onDay) internal view returns (bool ok) {
        return (amount <= _getAvailableAmount(account, onDay));
    }

    modifier onlyIfFundsAvailableNow(address account, uint256 amount) {
        require(_fundsAreAvailableOn(account, amount, today()),
            balanceOf(account) < amount ? "insufficient funds" : "insufficient vested funds");
        _;
    }


    function revokeGrant(address grantHolder, uint32 onDay) public onlyGrantor returns (bool ok) {
        tokenGrant storage grant = _tokenGrants[grantHolder];
        vestingSchedule storage vesting = _vestingSchedules[grant.vestingLocation];
        uint256 notVestedAmount;

        require(msg.sender == owner() || msg.sender == grant.grantor, "not allowed");
        require(grant.isActive, "no active grant");
        require(vesting.isRevocable, "irrevocable");
        require(onDay <= grant.startDay + vesting.duration, "no effect");
        require(onDay >= today(), "cannot revoke vested holdings");
        notVestedAmount = _getNotVestedAmount(grantHolder, onDay);

        _approve(grantHolder, grant.grantor, notVestedAmount);
        transferFrom(grantHolder, grant.grantor, notVestedAmount);

        _tokenGrants[grantHolder].wasRevoked = true;
        _tokenGrants[grantHolder].isActive = false;

        emit GrantRevoked(grantHolder, onDay);
        return true;
    }

    function transfer(address to, uint256 value) public onlyIfFundsAvailableNow(msg.sender, value) returns (bool ok) {
        return super.transfer(to, value);
    }

    function approve(address spender, uint256 value) public onlyIfFundsAvailableNow(msg.sender, value) returns (bool ok) {
        return super.approve(spender, value);
    }
}


contract UniformTokenGrantor is ERC20Vestable {

    struct restrictions {
        bool isValid;
        uint32 minStartDay;        /* The smallest value for startDay allowed in grant creation. */
        uint32 maxStartDay;        /* The maximum value for startDay allowed in grant creation. */
        uint32 expirationDay;       /* The last day this grantor may make grants. */
    }

    mapping(address => restrictions) private _restrictions;

    event GrantorRestrictionsSet(
        address indexed grantor,
        uint32 minStartDay,
        uint32 maxStartDay,
        uint32 expirationDay);

    function setRestrictions(
        address grantor,
        uint32 minStartDay,
        uint32 maxStartDay,
        uint32 expirationDay
    )
    public
    onlyOwner
    onlyExistingAccount(grantor)
    returns (bool ok)
    {
        require(
            isUniformGrantor(grantor)
         && maxStartDay > minStartDay
         && expirationDay > today(), "invalid params");

        _restrictions[grantor] = restrictions(
            true/*isValid*/,
            minStartDay,
            maxStartDay,
            expirationDay
        );

        emit GrantorRestrictionsSet(grantor, minStartDay, maxStartDay, expirationDay);
        return true;
    }

    function setGrantorVestingSchedule(
        address grantor,
        uint32 duration,
        uint32 cliffDuration,
        uint32 interval,
        bool isRevocable
    )
    public
    onlyOwner
    onlyExistingAccount(grantor)
    returns (bool ok)
    {
        require(isUniformGrantor(grantor), "uniform grantor only");
        require(!_hasVestingSchedule(grantor), "schedule already exists");
        _setVestingSchedule(grantor, cliffDuration, duration, interval, isRevocable);
        return true;
    }

    function isUniformGrantorWithSchedule(address account) internal view returns (bool ok) {
        return isUniformGrantor(account) && _hasVestingSchedule(account);
    }

    modifier onlyUniformGrantorWithSchedule(address account) {
        require(isUniformGrantorWithSchedule(account), "grantor account not ready");
        _;
    }

    modifier whenGrantorRestrictionsMet(uint32 startDay) {
        restrictions storage restriction = _restrictions[msg.sender];
        require(restriction.isValid, "set restrictions first");

        require(
            startDay >= restriction.minStartDay
            && startDay < restriction.maxStartDay, "startDay too early");

        require(today() < restriction.expirationDay, "grantor expired");
        _;
    }


    function grantUniformVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay
    )
    public
    onlyUniformGrantorWithSchedule(msg.sender)
    whenGrantorRestrictionsMet(startDay)
    returns (bool ok)
    {
        return _grantVestingTokens(beneficiary, totalAmount, vestingAmount, startDay, msg.sender, msg.sender);
    }

    function safeGrantUniformVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay
    )
    public
    onlyUniformGrantorWithSchedule(msg.sender)
    whenGrantorRestrictionsMet(startDay)
    onlyExistingAccount(beneficiary)
    returns (bool ok)
    {
        return _grantVestingTokens(beneficiary, totalAmount, vestingAmount, startDay, msg.sender, msg.sender);
    }
}

File 3 of 5: Primary_General.sol
pragma solidity ^0.5.0;

import "./Primary_Libs.sol";

contract Context {

    constructor () internal { }

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Identity {
    mapping(address => string) private _names;

    function iAm(string memory shortName) public {
        _names[msg.sender] = shortName;
    }

    function whereAmI() public view returns (address yourAddress) {
        address myself = msg.sender;
        return myself;
    }

    function whoAmI() public view returns (string memory yourName) {
        return (_names[msg.sender]);
    }
}

contract PauserRole is Context {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(_msgSender());
    }

    modifier onlyPauser() {
        require(isPauser(_msgSender()), "PauserRole: caller does not have the Pauser role");
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(_msgSender());
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract GrantorRole is Ownable {
    bool private constant OWNER_UNIFORM_GRANTOR_FLAG = false;

    using Roles for Roles.Role;

    event GrantorAdded(address indexed account);
    event GrantorRemoved(address indexed account);

    Roles.Role private _grantors;
    mapping(address => bool) private _isUniformGrantor;

    constructor () internal {
        _addGrantor(msg.sender, OWNER_UNIFORM_GRANTOR_FLAG);
    }

    modifier onlyGrantor() {
        require(isGrantor(msg.sender), "onlyGrantor");
        _;
    }

    modifier onlyGrantorOrSelf(address account) {
        require(isGrantor(msg.sender) || msg.sender == account, "onlyGrantorOrSelf");
        _;
    }

    function isGrantor(address account) public view returns (bool) {
        return _grantors.has(account);
    }

    function addGrantor(address account, bool isUniformGrantor) public onlyOwner {
        _addGrantor(account, isUniformGrantor);
    }

    function removeGrantor(address account) public onlyOwner {
        _removeGrantor(account);
    }

    function _addGrantor(address account, bool isUniformGrantor) private {
        require(account != address(0));
        _grantors.add(account);
        _isUniformGrantor[account] = isUniformGrantor;
        emit GrantorAdded(account);
    }

    function _removeGrantor(address account) private {
        require(account != address(0));
        _grantors.remove(account);
        emit GrantorRemoved(account);
    }

    function isUniformGrantor(address account) public view returns (bool) {
        return isGrantor(account) && _isUniformGrantor[account];
    }

    modifier onlyUniformGrantor() {
        require(isUniformGrantor(msg.sender), "onlyUniformGrantor");
        // Only grantor role can do this.
        _;
    }

    function renounceOwnership() public onlyOwner {
        require(false, "forbidden");
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _removeGrantor(msg.sender);
        super.transferOwnership(newOwner);
        _addGrantor(newOwner, OWNER_UNIFORM_GRANTOR_FLAG);
    }
}

contract Pausable is Context, PauserRole {

    event Paused(address account);

    event Unpaused(address account);

    bool private _paused;

    constructor () internal {
        _paused = false;
    }

    function paused() public view returns (bool) {
        return _paused;
    }

    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 4 of 5: Primary_IERC20.sol
pragma solidity ^0.5.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IERC20Vestable {
    function getIntrinsicVestingSchedule(address grantHolder)
    external
    view
    returns (
        uint32 cliffDuration,
        uint32 vestDuration,
        uint32 vestIntervalDays
    );

    function grantVestingTokens(
        address beneficiary,
        uint256 totalAmount,
        uint256 vestingAmount,
        uint32 startDay,
        uint32 duration,
        uint32 cliffDuration,
        uint32 interval,
        bool isRevocable
    ) external returns (bool ok);

    function today() external view returns (uint32 dayNumber);

    function vestingForAccountAsOf(
        address grantHolder,
        uint32 onDayOrToday
    )
    external
    view
    returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 cliffDuration,
        uint32 vestDuration,
        uint32 vestIntervalDays,
        bool isActive,
        bool wasRevoked
    );

    function vestingAsOf(uint32 onDayOrToday) external view returns (
        uint256 amountVested,
        uint256 amountNotVested,
        uint256 amountOfGrant,
        uint32 vestStartDay,
        uint32 cliffDuration,
        uint32 vestDuration,
        uint32 vestIntervalDays,
        bool isActive,
        bool wasRevoked
    );

    function revokeGrant(address grantHolder, uint32 onDay) external returns (bool);

    event VestingScheduleCreated(
        address indexed vestingLocation,
        uint32 cliffDuration, uint32 indexed duration, uint32 interval,
        bool indexed isRevocable);

    event VestingTokensGranted(
        address indexed beneficiary,
        uint256 indexed vestingAmount,
        uint32 startDay,
        address vestingLocation,
        address indexed grantor);

    event GrantRevoked(address indexed grantHolder, uint32 indexed onDay);
}

File 5 of 5: Primary_Libs.sol
pragma solidity ^0.5.0;

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {

        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DepositReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"grantHolder","type":"address"},{"indexed":true,"internalType":"uint32","name":"onDay","type":"uint32"}],"name":"GrantRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"GrantorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"GrantorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"grantor","type":"address"},{"indexed":false,"internalType":"uint32","name":"minStartDay","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"maxStartDay","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"expirationDay","type":"uint32"}],"name":"GrantorRestrictionsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vestingLocation","type":"address"},{"indexed":false,"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"indexed":true,"internalType":"uint32","name":"duration","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"interval","type":"uint32"},{"indexed":true,"internalType":"bool","name":"isRevocable","type":"bool"}],"name":"VestingScheduleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":true,"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"startDay","type":"uint32"},{"indexed":false,"internalType":"address","name":"vestingLocation","type":"address"},{"indexed":true,"internalType":"address","name":"grantor","type":"address"}],"name":"VestingTokensGranted","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isUniformGrantor","type":"bool"}],"name":"addGrantor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"grantHolder","type":"address"}],"name":"getIntrinsicVestingSchedule","outputs":[{"internalType":"uint32","name":"vestDuration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"vestIntervalDays","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"internalType":"uint32","name":"startDay","type":"uint32"}],"name":"grantUniformVestingTokens","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"internalType":"uint32","name":"startDay","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"interval","type":"uint32"},{"internalType":"bool","name":"isRevocable","type":"bool"}],"name":"grantVestingTokens","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"shortName","type":"string"}],"name":"iAm","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isGrantor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isUniformGrantor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[{"internalType":"bool","name":"itsDeadJim","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"registerAccount","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeGrantor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"grantHolder","type":"address"},{"internalType":"uint32","name":"onDay","type":"uint32"}],"name":"revokeGrant","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"safeApprove","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"internalType":"uint32","name":"startDay","type":"uint32"}],"name":"safeGrantUniformVestingTokens","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"vestingAmount","type":"uint256"},{"internalType":"uint32","name":"startDay","type":"uint32"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"interval","type":"uint32"},{"internalType":"bool","name":"isRevocable","type":"bool"}],"name":"safeGrantVestingTokens","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"safeTransfer","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"grantor","type":"address"},{"internalType":"uint32","name":"duration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"interval","type":"uint32"},{"internalType":"bool","name":"isRevocable","type":"bool"}],"name":"setGrantorVestingSchedule","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"grantor","type":"address"},{"internalType":"uint32","name":"minStartDay","type":"uint32"},{"internalType":"uint32","name":"maxStartDay","type":"uint32"},{"internalType":"uint32","name":"expirationDay","type":"uint32"}],"name":"setRestrictions","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"today","outputs":[{"internalType":"uint32","name":"dayNumber","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"onDayOrToday","type":"uint32"}],"name":"vestingAsOf","outputs":[{"internalType":"uint256","name":"amountVested","type":"uint256"},{"internalType":"uint256","name":"amountNotVested","type":"uint256"},{"internalType":"uint256","name":"amountOfGrant","type":"uint256"},{"internalType":"uint32","name":"vestStartDay","type":"uint32"},{"internalType":"uint32","name":"vestDuration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"vestIntervalDays","type":"uint32"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"wasRevoked","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"grantHolder","type":"address"},{"internalType":"uint32","name":"onDayOrToday","type":"uint32"}],"name":"vestingForAccountAsOf","outputs":[{"internalType":"uint256","name":"amountVested","type":"uint256"},{"internalType":"uint256","name":"amountNotVested","type":"uint256"},{"internalType":"uint256","name":"amountOfGrant","type":"uint256"},{"internalType":"uint32","name":"vestStartDay","type":"uint32"},{"internalType":"uint32","name":"vestDuration","type":"uint32"},{"internalType":"uint32","name":"cliffDuration","type":"uint32"},{"internalType":"uint32","name":"vestIntervalDays","type":"uint32"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"wasRevoked","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whereAmI","outputs":[{"internalType":"address","name":"yourAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"whoAmI","outputs":[{"internalType":"string","name":"yourName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060078152602001665072696d61727960c81b815250604051806040016040528060078152602001665052494d41525960c81b815250600a62000077620000686200017360201b60201c565b6001600160e01b036200017816565b6005805460ff19169055825162000096906006906020860190620004ee565b508151620000ac906007906020850190620004ee565b506008805460ff191660ff929092169190911790555060009050620000d062000173565b60088054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001396001600160e01b03620001ca16565b50620001503360006001600160e01b036200021416565b6200016d33678ac7230489e800006001600160e01b036200029116565b62000590565b335b90565b620001938160046200039660201b620039fe1790919060201c565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b33600081815260096020526040808220805460ff19166001179055519091907fcd822dc9688e20acea68724a2fbcfe4f3e526d20ecaa37b18fe3047ab377d6a5908390a250600190565b6001600160a01b0382166200022857600080fd5b6200024382600a6200039660201b620039fe1790919060201c565b6001600160a01b0382166000818152600b6020526040808220805460ff1916851515179055517f614c7c37719098320f845a142223983b9adcc4c3f2663971d5b0eb4c661a24e79190a25050565b6001600160a01b038216620002ed576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b62000309816003546200042360201b620039a41790919060201c565b6003556001600160a01b0382166000908152600160209081526040909120546200033e918390620039a462000423821b17901c565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b620003ab82826001600160e01b036200048516565b15620003fe576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000828201838110156200047e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006001600160a01b038216620004ce5760405162461bcd60e51b8152600401808060200182810382526022815260200180620044e66022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200053157805160ff191683800117855562000561565b8280016001018555821562000561579182015b828111156200056157825182559160200191906001019062000544565b506200056f92915062000573565b5090565b6200017591905b808211156200056f57600081556001016200057a565b613f4680620005a06000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063a9059cbb116100c1578063da91254c1161007a578063da91254c14610c75578063dd62ed3e14610c8a578063f2fde38b14610cc5578063fbc6d1cb14610cf8578063fd1154c214610d31578063ffa1ad7414610d7c57610293565b8063a9059cbb14610b2c578063acc27b9814610b65578063b74e452b14610bc0578063c3c5a54714610bee578063d56ad0ba14610c21578063d9f226e914610c6057610293565b80638456cb59116101135780638456cb5914610a4e5780638da5cb5b14610a635780638f32d59b14610a7857806395d89b4114610a8d57806399ad427b14610aa2578063a457c2d714610af357610293565b806370a0823114610879578063715018a6146108ac57806379cc6790146108c15780637af023a9146108fa57806382dc1ec4146109685780638403eeb51461099b57610293565b80633f4ba83a116101fe57806344e393cb116101b757806344e393cb1461075757806346fbf68e146107925780635c975abb146107c55780636d589d64146107da5780636d71a9c6146108315780636ef8d66d1461086457610293565b80633f4ba83a1461061957806341c0e1b51461062e57806341d5f61914610643578063423f6cef146106b157806342842e0e146106ea57806342966c681461072d57610293565b80632455a035116102505780632455a0351461047e578063313ce5671461050457806332ae38481461052f578063332cc9c61461056057806339509351146105955780633d3b993c146105ce57610293565b806306fdde03146102cb578063095ea7b31461035557806318160ddd146103a2578063190de9f7146103c95780631bd2cf38146103fc57806323b872dd1461043b575b60408051348152905133917f9936746a4565f9766fa768f88f56a7487c78780ac179562773d1c75c5269537e919081900360200190a2005b3480156102d757600080fd5b506102e0610d91565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561031a578181015183820152602001610302565b50505050905090810190601f1680156103475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036157600080fd5b5061038e6004803603604081101561037857600080fd5b506001600160a01b038135169060200135610e28565b604080519115158252519081900360200190f35b3480156103ae57600080fd5b506103b7610f4d565b60408051918252519081900360200190f35b3480156103d557600080fd5b5061038e600480360360208110156103ec57600080fd5b50356001600160a01b0316610f53565b34801561040857600080fd5b5061038e6004803603604081101561041f57600080fd5b5080356001600160a01b0316906020013563ffffffff16610f6c565b34801561044757600080fd5b5061038e6004803603606081101561045e57600080fd5b506001600160a01b0381358116916020810135909116906040013561125a565b34801561048a57600080fd5b506104ae600480360360208110156104a157600080fd5b503563ffffffff166112bb565b60408051998a5260208a01989098528888019690965263ffffffff9485166060890152928416608088015290831660a087015290911660c0850152151560e0840152151561010083015251908190036101200190f35b34801561051057600080fd5b506105196112f2565b6040805160ff9092168252519081900360200190f35b34801561053b57600080fd5b506105446112fb565b604080516001600160a01b039092168252519081900360200190f35b34801561056c57600080fd5b506105936004803603602081101561058357600080fd5b50356001600160a01b03166112ff565b005b3480156105a157600080fd5b5061038e600480360360408110156105b857600080fd5b506001600160a01b038135169060200135611352565b3480156105da57600080fd5b5061038e600480360360808110156105f157600080fd5b5080356001600160a01b0316906020810135906040810135906060013563ffffffff166113b1565b34801561062557600080fd5b506105936115a9565b34801561063a57600080fd5b5061038e611692565b34801561064f57600080fd5b5061038e600480360361010081101561066757600080fd5b506001600160a01b038135169060208101359060408101359063ffffffff6060820135811691608081013582169160a082013581169160c08101359091169060e001351515611788565b3480156106bd57600080fd5b5061038e600480360360408110156106d457600080fd5b506001600160a01b038135169060200135611839565b3480156106f657600080fd5b5061038e6004803603606081101561070d57600080fd5b506001600160a01b03813581169160208101359091169060400135611899565b34801561073957600080fd5b506105936004803603602081101561075057600080fd5b50356118fb565b34801561076357600080fd5b506105936004803603604081101561077a57600080fd5b506001600160a01b03813516906020013515156119d8565b34801561079e57600080fd5b5061038e600480360360208110156107b557600080fd5b50356001600160a01b0316611a2d565b3480156107d157600080fd5b5061038e611a40565b3480156107e657600080fd5b5061038e600480360360a08110156107fd57600080fd5b506001600160a01b038135169063ffffffff6020820135811691604081013582169160608201351690608001351515611a49565b34801561083d57600080fd5b5061038e6004803603602081101561085457600080fd5b50356001600160a01b0316611ba2565b34801561087057600080fd5b50610593611bd3565b34801561088557600080fd5b506103b76004803603602081101561089c57600080fd5b50356001600160a01b0316611be5565b3480156108b857600080fd5b50610593611c00565b3480156108cd57600080fd5b50610593600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611c80565b34801561090657600080fd5b5061038e600480360361010081101561091e57600080fd5b506001600160a01b038135169060208101359060408101359063ffffffff6060820135811691608081013582169160a082013581169160c08101359091169060e001351515611c8a565b34801561097457600080fd5b506105936004803603602081101561098b57600080fd5b50356001600160a01b0316611d65565b3480156109a757600080fd5b50610593600480360360208110156109be57600080fd5b8101906020810181356401000000008111156109d957600080fd5b8201836020820111156109eb57600080fd5b80359060200191846001830284011164010000000083111715610a0d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611db4945050505050565b348015610a5a57600080fd5b50610593611dd2565b348015610a6f57600080fd5b50610544611e99565b348015610a8457600080fd5b5061038e611ead565b348015610a9957600080fd5b506102e0611ed8565b348015610aae57600080fd5b5061038e60048036036080811015610ac557600080fd5b506001600160a01b038135169063ffffffff6020820135811691604081013582169160609091013516611f39565b348015610aff57600080fd5b5061038e60048036036040811015610b1657600080fd5b506001600160a01b0381351690602001356121bf565b348015610b3857600080fd5b5061038e60048036036040811015610b4f57600080fd5b506001600160a01b038135169060200135612217565b348015610b7157600080fd5b50610b9860048036036020811015610b8857600080fd5b50356001600160a01b03166122f1565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b348015610bcc57600080fd5b50610bd5612399565b6040805163ffffffff9092168252519081900360200190f35b348015610bfa57600080fd5b5061038e60048036036020811015610c1157600080fd5b50356001600160a01b03166123a2565b348015610c2d57600080fd5b506104ae60048036036040811015610c4457600080fd5b5080356001600160a01b0316906020013563ffffffff166123c0565b348015610c6c57600080fd5b5061038e6124d8565b348015610c8157600080fd5b506102e0612522565b348015610c9657600080fd5b506103b760048036036040811015610cad57600080fd5b506001600160a01b038135811691602001351661258b565b348015610cd157600080fd5b5061059360048036036020811015610ce857600080fd5b50356001600160a01b03166125b6565b348015610d0457600080fd5b5061038e60048036036040811015610d1b57600080fd5b506001600160a01b03813516906020013561261a565b348015610d3d57600080fd5b5061038e60048036036080811015610d5457600080fd5b5080356001600160a01b0316906020810135906040810135906060013563ffffffff1661266f565b348015610d8857600080fd5b50610bd561281d565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e1d5780601f10610df257610100808354040283529160200191610e1d565b820191906000526020600020905b815481529060010190602001808311610e0057829003601f168201915b505050505090505b90565b60003382610e3e8282610e39612399565b612822565b81610e4884611be5565b10610e845760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b815250610eb0565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b90610f395760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610efe578181015183820152602001610ee6565b50505050905090810190601f168015610f2b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610f448585612839565b95945050505050565b60035490565b6000610f66600a8363ffffffff61289116565b92915050565b6000610f7733610f53565b610fb6576040805162461bcd60e51b815260206004820152600b60248201526a37b7363ca3b930b73a37b960a91b604482015290519081900360640190fd5b6001600160a01b038084166000908152600d6020908152604080832060028101549094168352600c909152812090610fec611e99565b6001600160a01b0316336001600160a01b03161480611017575060038301546001600160a01b031633145b611056576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b825460ff1661109e576040805162461bcd60e51b815260206004820152600f60248201526e1b9bc81858dd1a5d994819dc985b9d608a1b604482015290519081900360640190fd5b8154610100900460ff166110e7576040805162461bcd60e51b815260206004820152600b60248201526a69727265766f6361626c6560a81b604482015290519081900360640190fd5b8154835462010000900463ffffffff908116600160301b9092048116919091018116908616111561114b576040805162461bcd60e51b81526020600482015260096024820152681b9bc81959999958dd60ba1b604482015290519081900360640190fd5b611153612399565b63ffffffff168563ffffffff1610156111b3576040805162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207265766f6b652076657374656420686f6c64696e6773000000604482015290519081900360640190fd5b6111bd86866128f8565b60038401549091506111da9087906001600160a01b031683612a4a565b60038301546111f49087906001600160a01b03168361125a565b506001600160a01b0386166000818152600d6020526040808220805460ff1961ff0019909116610100171690555163ffffffff881692917f906c0c4c98565a396c542d9102cae7a794e84af6763123e068a1b277333bf4a491a350600195945050505050565b60055460009060ff16156112a8576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6112b3848484612b36565b949350505050565b60008060008060008060008060006112d3338b6123c0565b9850985098509850985098509850985098509193959799909294969850565b60085460ff1690565b3390565b611307611ead565b611346576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b61134f81612bc3565b50565b60055460009060ff16156113a0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa8383612c1e565b9392505050565b6000336113bd81612c7b565b61140a576040805162461bcd60e51b81526020600482015260196024820152786772616e746f72206163636f756e74206e6f7420726561647960381b604482015290519081900360640190fd5b336000908152600e60205260409020805484919060ff1661146b576040805162461bcd60e51b81526020600482015260166024820152751cd95d081c995cdd1c9a58dd1a5bdb9cc8199a5c9cdd60521b604482015290519081900360640190fd5b805463ffffffff61010090910481169083161080159061149e5750805463ffffffff650100000000009091048116908316105b6114e4576040805162461bcd60e51b8152602060048201526012602482015271737461727444617920746f6f206561726c7960701b604482015290519081900360640190fd5b8054600160481b900463ffffffff166114fb612399565b63ffffffff1610611545576040805162461bcd60e51b815260206004820152600f60248201526e19dc985b9d1bdc88195e1c1a5c9959608a1b604482015290519081900360640190fd5b8761154f81612c96565b61158e576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61159c898989893333612cc9565b9998505050505050505050565b6115b96115b46112fb565b611a2d565b6115f45760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b60055460ff16611642576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116756112fb565b604080516001600160a01b039092168252519081900360200190a1565b60055460009060ff166116e3576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6116ee6115b46112fb565b6117295760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b61173233611a2d565b611770576040805162461bcd60e51b815260206004820152600a60248201526937b7363ca830bab9b2b960b11b604482015290519081900360640190fd5b600061177a611e99565b9050806001600160a01b0316ff5b600061179333610f53565b6117d2576040805162461bcd60e51b815260206004820152600b60248201526a37b7363ca3b930b73a37b960a91b604482015290519081900360640190fd5b886117dc81612c96565b61181b576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61182b8a8a8a8a8a8a8a8a611c8a565b9a9950505050505050505050565b60008261184581612c96565b611884576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61188e8484612217565b506001949350505050565b6000826118a581612c96565b6118e4576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b6118ef85858561125a565b50600195945050505050565b338161190a8282610e39612399565b8161191484611be5565b106119505760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b81525061197c565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b906119c85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b506119d33384612fd2565b505050565b6119e0611ead565b611a1f576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b611a2982826130ce565b5050565b6000610f6660048363ffffffff61289116565b60055460ff1690565b6000611a53611ead565b611a92576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b85611a9c81612c96565b611adb576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b611ae487611ba2565b611b2c576040805162461bcd60e51b8152602060048201526014602482015273756e69666f726d206772616e746f72206f6e6c7960601b604482015290519081900360640190fd5b611b3587613140565b15611b87576040805162461bcd60e51b815260206004820152601760248201527f7363686564756c6520616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b611b94878688878761315e565b506001979650505050505050565b6000611bad82610f53565b8015610f665750506001600160a01b03166000908152600b602052604090205460ff1690565b611be3611bde6112fb565b61340b565b565b6001600160a01b031660009081526001602052604090205490565b611c08611ead565b611c47576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b81526020600482015260096024820152683337b93134b23232b760b91b604482015290519081900360640190fd5b611a298282613453565b6000611c9533610f53565b611cd4576040805162461bcd60e51b815260206004820152600b60248201526a37b7363ca3b930b73a37b960a91b604482015290519081900360640190fd5b6001600160a01b0389166000908152600d602052604090205460ff1615611d39576040805162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b604482015290519081900360640190fd5b611d46898587868661315e565b50611d55898989898d33612cc9565b5060019998505050505050505050565b611d706115b46112fb565b611dab5760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b61134f816134a7565b336000908152602081815260409091208251611a2992840190613bf4565b611ddd6115b46112fb565b611e185760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b60055460ff1615611e63576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116756112fb565b60085461010090046001600160a01b031690565b60085460009061010090046001600160a01b0316611ec96112fb565b6001600160a01b031614905090565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e1d5780601f10610df257610100808354040283529160200191610e1d565b6000611f43611ead565b611f82576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b84611f8c81612c96565b611fcb576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b611fd486611ba2565b8015611feb57508463ffffffff168463ffffffff16115b80156120095750611ffa612399565b63ffffffff168363ffffffff16115b61204b576040805162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b604482015290519081900360640190fd5b60405180608001604052806001151581526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff16815250600e6000886001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160056101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160096101000a81548163ffffffff021916908363ffffffff160217905550905050856001600160a01b03167fd204f080300249d73110cd2c2e8d720f0362e94b8e0f1b797ac249acca176551868686604051808463ffffffff1663ffffffff1681526020018363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff168152602001935050505060405180910390a250600195945050505050565b60055460009060ff161561220d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa83836134ef565b600033826122288282610e39612399565b8161223284611be5565b1061226e5760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b81525061229a565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b906122e65760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b50610f44858561355d565b60008060008361230033610f53565b806123135750336001600160a01b038216145b612358576040805162461bcd60e51b815260206004820152601160248201527037b7363ca3b930b73a37b927b929b2b63360791b604482015290519081900360640190fd5b505050506001600160a01b03166000908152600c602052604090205463ffffffff600160301b8204811692620100008304821692600160501b900490911690565b62015180420490565b6001600160a01b031660009081526009602052604090205460ff1690565b60008060008060008060008060008a6123d833610f53565b806123eb5750336001600160a01b038216145b612430576040805162461bcd60e51b815260206004820152601160248201527037b7363ca3b930b73a37b927b929b2b63360791b604482015290519081900360640190fd5b6001600160a01b03808d166000908152600d6020908152604080832060028101549094168352600c9091528120906124688f8f6128f8565b6001840154909150612480818363ffffffff6135b516565b93549254939d50909b50995063ffffffff6201000080830482169a50600160301b840482169950830481169750600160501b909204909116945060ff8082169450610100909104169150509295985092959850929598565b33600081815260096020526040808220805460ff19166001179055519091907fcd822dc9688e20acea68724a2fbcfe4f3e526d20ecaa37b18fe3047ab377d6a5908390a250600190565b336000908152602081815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610e1d5780601f10610df257610100808354040283529160200191610e1d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6125be611ead565b6125fd576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b61260633612bc3565b61260f816135f7565b61134f8160006130ce565b60008261262681612c96565b612665576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61188e8484610e28565b60003361267b81612c7b565b6126c8576040805162461bcd60e51b81526020600482015260196024820152786772616e746f72206163636f756e74206e6f7420726561647960381b604482015290519081900360640190fd5b336000908152600e60205260409020805484919060ff16612729576040805162461bcd60e51b81526020600482015260166024820152751cd95d081c995cdd1c9a58dd1a5bdb9cc8199a5c9cdd60521b604482015290519081900360640190fd5b805463ffffffff61010090910481169083161080159061275c5750805463ffffffff650100000000009091048116908316105b6127a2576040805162461bcd60e51b8152602060048201526012602482015271737461727444617920746f6f206561726c7960701b604482015290519081900360640190fd5b8054600160481b900463ffffffff166127b9612399565b63ffffffff1610612803576040805162461bcd60e51b815260206004820152600f60248201526e19dc985b9d1bdc88195e1c1a5c9959608a1b604482015290519081900360640190fd5b612811888888883333612cc9565b98975050505050505050565b600381565b600061282e8483613690565b909211159392505050565b60055460009060ff1615612887576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa83836136ba565b60006001600160a01b0382166128d85760405162461bcd60e51b8152600401808060200182810382526022815260200180613e1a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038083166000908152600d6020908152604080832060028101549094168352600c909152812090919082612932856136ce565b835490915060ff161580612963575081548354620100009081900463ffffffff908116919092048216018116908216105b15612975575050600101549050610f66565b8154835462010000900463ffffffff908116600160301b9092048116919091018116908216106129ab5760009350505050610f66565b8254825463ffffffff620100009092048216830391600091600160501b900481169081908416816129d857fe5b040290506000612a258560000160069054906101000a900463ffffffff1663ffffffff16612a198463ffffffff1689600101546136ea90919063ffffffff16565b9063ffffffff61374316565b6001870154909150612a3d908263ffffffff6135b516565b9650505050505050610f66565b6001600160a01b038316612a8f5760405162461bcd60e51b8152600401808060200182810382526024815260200180613ea66024913960400191505060405180910390fd5b6001600160a01b038216612ad45760405162461bcd60e51b8152600401808060200182810382526022815260200180613d286022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000612b43848484613785565b612bb984612b4f6112fb565b612bb485604051806060016040528060288152602001613dd2602891396001600160a01b038a16600090815260026020526040812090612b8d6112fb565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6138e316565b612a4a565b5060019392505050565b6001600160a01b038116612bd657600080fd5b612be7600a8263ffffffff61393d16565b6040516001600160a01b038216907f33a8bb468e8361c5c40d643192eb6970b91cb87aa0200f8709f5b805087b905390600090a250565b6000612c72612c2b6112fb565b84612bb48560026000612c3c6112fb565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6139a416565b50600192915050565b6000612c8682611ba2565b8015610f665750610f6682613140565b60006001600160a01b038216331480610f665750506001600160a01b031660009081526009602052604090205460ff1690565b6001600160a01b0386166000908152600d602052604081205460ff1615612d2e576040805162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b604482015290519081900360640190fd5b858511158015612d3e5750600085115b8015612d525750612acd63ffffffff851610155b8015612d6657506205bd8863ffffffff8516105b612db0576040805162461bcd60e51b8152602060048201526016602482015275696e76616c69642076657374696e6720706172616d7360501b604482015290519081900360640190fd5b612db983613140565b612e0a576040805162461bcd60e51b815260206004820152601860248201527f6e6f20737563682076657374696e67207363686564756c650000000000000000604482015290519081900360640190fd5b612e15828888613785565b6040518060c001604052806001151581526020016000151581526020018563ffffffff168152602001868152602001846001600160a01b03168152602001836001600160a01b0316815250600d6000896001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548163ffffffff021916908363ffffffff1602179055506060820151816001015560808201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160030160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050816001600160a01b031685886001600160a01b03167fce19dc9f3460f5845c81c7fa52526977d7e7275df4b1d0e40ea09653252e0c758787604051808363ffffffff1663ffffffff168152602001826001600160a01b03166001600160a01b031681526020019250505060405180910390a45060019695505050505050565b6001600160a01b0382166130175760405162461bcd60e51b8152600401808060200182810382526021815260200180613e606021913960400191505060405180910390fd5b61305a81604051806060016040528060228152602001613cb0602291396001600160a01b038516600090815260016020526040902054919063ffffffff6138e316565b6001600160a01b038316600090815260016020526040902055600354613086908263ffffffff6135b516565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0382166130e157600080fd5b6130f2600a8363ffffffff6139fe16565b6001600160a01b0382166000818152600b6020526040808220805460ff1916851515179055517f614c7c37719098320f845a142223983b9adcc4c3f2663971d5b0eb4c661a24e79190a25050565b6001600160a01b03166000908152600c602052604090205460ff1690565b6000808463ffffffff1611801561317d5750610e4463ffffffff851611155b801561319457508363ffffffff168563ffffffff16105b80156131a7575060018363ffffffff1610155b6131f8576040805162461bcd60e51b815260206004820152601860248201527f696e76616c69642076657374696e67207363686564756c650000000000000000604482015290519081900360640190fd5b8263ffffffff168463ffffffff168161320d57fe5b0663ffffffff16600014801561323e57508263ffffffff168563ffffffff168161323357fe5b0663ffffffff166000145b6132795760405162461bcd60e51b8152600401808060200182810382526023815260200180613eca6023913960400191505060405180910390fd5b6040518060a0016040528060011515815260200183151581526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff16815250600c6000886001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160066101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600a6101000a81548163ffffffff021916908363ffffffff1602179055509050508115158463ffffffff16876001600160a01b03167fb84219eaee5910cc5311a393fbd4287b14bc791973b97f64d4b61b6d8554adc78887604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a450600195945050505050565b61341c60048263ffffffff61393d16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b61345d8282612fd2565b611a29826134696112fb565b612bb484604051806060016040528060248152602001613e3c602491396001600160a01b038816600090815260026020526040812090612b8d6112fb565b6134b860048263ffffffff6139fe16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6000612c726134fc6112fb565b84612bb485604051806060016040528060258152602001613eed60259139600260006135266112fb565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6138e316565b60055460009060ff16156135ab576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa8383613a7f565b60006113aa83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138e3565b8061360181612c96565b613640576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b613648611ead565b613687576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b611a2982613a93565b60008061369c84611be5565b90506000610f446136ad86866128f8565b839063ffffffff6135b516565b6000612c726136c76112fb565b8484612a4a565b600063ffffffff8216156136e25781610f66565b610f66612399565b6000826136f957506000610f66565b8282028284828161370657fe5b04146113aa5760405162461bcd60e51b8152600401808060200182810382526021815260200180613db16021913960400191505060405180910390fd5b60006113aa83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ae3565b6001600160a01b0383166137ca5760405162461bcd60e51b8152600401808060200182810382526025815260200180613e816025913960400191505060405180910390fd5b6001600160a01b03821661380f5760405162461bcd60e51b8152600401808060200182810382526023815260200180613c8d6023913960400191505060405180910390fd5b61385281604051806060016040528060268152602001613d6a602691396001600160a01b038616600090815260016020526040902054919063ffffffff6138e316565b6001600160a01b038085166000908152600160205260408082209390935590841681522054613887908263ffffffff6139a416565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156139355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b505050900390565b6139478282612891565b6139825760405162461bcd60e51b8152600401808060200182810382526021815260200180613d906021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000828201838110156113aa576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613a088282612891565b15613a5a576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000612c72613a8c6112fb565b8484613785565b613a9b611ead565b613ada576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b61134f81613b48565b60008183613b325760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b506000838581613b3e57fe5b0495945050505050565b6001600160a01b038116613b8d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613d026026913960400191505060405180910390fd5b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c3557805160ff1916838001178555613c62565b82800160010185558215613c62579182015b82811115613c62578251825591602001919060010190613c47565b50613c6e929150613c72565b5090565b610e2591905b80821115613c6e5760008155600101613c7856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573736163636f756e74206e6f7420726567697374657265640000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373696e76616c696420636c6966662f6475726174696f6e20666f7220696e74657276616c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158201b59cd1259572d966bd0ca0733c49823d95bb3bdd4a5829e1e348b6bf35351b964736f6c63430005110032526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x6080604052600436106102935760003560e01c806370a082311161015a578063a9059cbb116100c1578063da91254c1161007a578063da91254c14610c75578063dd62ed3e14610c8a578063f2fde38b14610cc5578063fbc6d1cb14610cf8578063fd1154c214610d31578063ffa1ad7414610d7c57610293565b8063a9059cbb14610b2c578063acc27b9814610b65578063b74e452b14610bc0578063c3c5a54714610bee578063d56ad0ba14610c21578063d9f226e914610c6057610293565b80638456cb59116101135780638456cb5914610a4e5780638da5cb5b14610a635780638f32d59b14610a7857806395d89b4114610a8d57806399ad427b14610aa2578063a457c2d714610af357610293565b806370a0823114610879578063715018a6146108ac57806379cc6790146108c15780637af023a9146108fa57806382dc1ec4146109685780638403eeb51461099b57610293565b80633f4ba83a116101fe57806344e393cb116101b757806344e393cb1461075757806346fbf68e146107925780635c975abb146107c55780636d589d64146107da5780636d71a9c6146108315780636ef8d66d1461086457610293565b80633f4ba83a1461061957806341c0e1b51461062e57806341d5f61914610643578063423f6cef146106b157806342842e0e146106ea57806342966c681461072d57610293565b80632455a035116102505780632455a0351461047e578063313ce5671461050457806332ae38481461052f578063332cc9c61461056057806339509351146105955780633d3b993c146105ce57610293565b806306fdde03146102cb578063095ea7b31461035557806318160ddd146103a2578063190de9f7146103c95780631bd2cf38146103fc57806323b872dd1461043b575b60408051348152905133917f9936746a4565f9766fa768f88f56a7487c78780ac179562773d1c75c5269537e919081900360200190a2005b3480156102d757600080fd5b506102e0610d91565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561031a578181015183820152602001610302565b50505050905090810190601f1680156103475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036157600080fd5b5061038e6004803603604081101561037857600080fd5b506001600160a01b038135169060200135610e28565b604080519115158252519081900360200190f35b3480156103ae57600080fd5b506103b7610f4d565b60408051918252519081900360200190f35b3480156103d557600080fd5b5061038e600480360360208110156103ec57600080fd5b50356001600160a01b0316610f53565b34801561040857600080fd5b5061038e6004803603604081101561041f57600080fd5b5080356001600160a01b0316906020013563ffffffff16610f6c565b34801561044757600080fd5b5061038e6004803603606081101561045e57600080fd5b506001600160a01b0381358116916020810135909116906040013561125a565b34801561048a57600080fd5b506104ae600480360360208110156104a157600080fd5b503563ffffffff166112bb565b60408051998a5260208a01989098528888019690965263ffffffff9485166060890152928416608088015290831660a087015290911660c0850152151560e0840152151561010083015251908190036101200190f35b34801561051057600080fd5b506105196112f2565b6040805160ff9092168252519081900360200190f35b34801561053b57600080fd5b506105446112fb565b604080516001600160a01b039092168252519081900360200190f35b34801561056c57600080fd5b506105936004803603602081101561058357600080fd5b50356001600160a01b03166112ff565b005b3480156105a157600080fd5b5061038e600480360360408110156105b857600080fd5b506001600160a01b038135169060200135611352565b3480156105da57600080fd5b5061038e600480360360808110156105f157600080fd5b5080356001600160a01b0316906020810135906040810135906060013563ffffffff166113b1565b34801561062557600080fd5b506105936115a9565b34801561063a57600080fd5b5061038e611692565b34801561064f57600080fd5b5061038e600480360361010081101561066757600080fd5b506001600160a01b038135169060208101359060408101359063ffffffff6060820135811691608081013582169160a082013581169160c08101359091169060e001351515611788565b3480156106bd57600080fd5b5061038e600480360360408110156106d457600080fd5b506001600160a01b038135169060200135611839565b3480156106f657600080fd5b5061038e6004803603606081101561070d57600080fd5b506001600160a01b03813581169160208101359091169060400135611899565b34801561073957600080fd5b506105936004803603602081101561075057600080fd5b50356118fb565b34801561076357600080fd5b506105936004803603604081101561077a57600080fd5b506001600160a01b03813516906020013515156119d8565b34801561079e57600080fd5b5061038e600480360360208110156107b557600080fd5b50356001600160a01b0316611a2d565b3480156107d157600080fd5b5061038e611a40565b3480156107e657600080fd5b5061038e600480360360a08110156107fd57600080fd5b506001600160a01b038135169063ffffffff6020820135811691604081013582169160608201351690608001351515611a49565b34801561083d57600080fd5b5061038e6004803603602081101561085457600080fd5b50356001600160a01b0316611ba2565b34801561087057600080fd5b50610593611bd3565b34801561088557600080fd5b506103b76004803603602081101561089c57600080fd5b50356001600160a01b0316611be5565b3480156108b857600080fd5b50610593611c00565b3480156108cd57600080fd5b50610593600480360360408110156108e457600080fd5b506001600160a01b038135169060200135611c80565b34801561090657600080fd5b5061038e600480360361010081101561091e57600080fd5b506001600160a01b038135169060208101359060408101359063ffffffff6060820135811691608081013582169160a082013581169160c08101359091169060e001351515611c8a565b34801561097457600080fd5b506105936004803603602081101561098b57600080fd5b50356001600160a01b0316611d65565b3480156109a757600080fd5b50610593600480360360208110156109be57600080fd5b8101906020810181356401000000008111156109d957600080fd5b8201836020820111156109eb57600080fd5b80359060200191846001830284011164010000000083111715610a0d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611db4945050505050565b348015610a5a57600080fd5b50610593611dd2565b348015610a6f57600080fd5b50610544611e99565b348015610a8457600080fd5b5061038e611ead565b348015610a9957600080fd5b506102e0611ed8565b348015610aae57600080fd5b5061038e60048036036080811015610ac557600080fd5b506001600160a01b038135169063ffffffff6020820135811691604081013582169160609091013516611f39565b348015610aff57600080fd5b5061038e60048036036040811015610b1657600080fd5b506001600160a01b0381351690602001356121bf565b348015610b3857600080fd5b5061038e60048036036040811015610b4f57600080fd5b506001600160a01b038135169060200135612217565b348015610b7157600080fd5b50610b9860048036036020811015610b8857600080fd5b50356001600160a01b03166122f1565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b348015610bcc57600080fd5b50610bd5612399565b6040805163ffffffff9092168252519081900360200190f35b348015610bfa57600080fd5b5061038e60048036036020811015610c1157600080fd5b50356001600160a01b03166123a2565b348015610c2d57600080fd5b506104ae60048036036040811015610c4457600080fd5b5080356001600160a01b0316906020013563ffffffff166123c0565b348015610c6c57600080fd5b5061038e6124d8565b348015610c8157600080fd5b506102e0612522565b348015610c9657600080fd5b506103b760048036036040811015610cad57600080fd5b506001600160a01b038135811691602001351661258b565b348015610cd157600080fd5b5061059360048036036020811015610ce857600080fd5b50356001600160a01b03166125b6565b348015610d0457600080fd5b5061038e60048036036040811015610d1b57600080fd5b506001600160a01b03813516906020013561261a565b348015610d3d57600080fd5b5061038e60048036036080811015610d5457600080fd5b5080356001600160a01b0316906020810135906040810135906060013563ffffffff1661266f565b348015610d8857600080fd5b50610bd561281d565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e1d5780601f10610df257610100808354040283529160200191610e1d565b820191906000526020600020905b815481529060010190602001808311610e0057829003601f168201915b505050505090505b90565b60003382610e3e8282610e39612399565b612822565b81610e4884611be5565b10610e845760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b815250610eb0565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b90610f395760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610efe578181015183820152602001610ee6565b50505050905090810190601f168015610f2b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610f448585612839565b95945050505050565b60035490565b6000610f66600a8363ffffffff61289116565b92915050565b6000610f7733610f53565b610fb6576040805162461bcd60e51b815260206004820152600b60248201526a37b7363ca3b930b73a37b960a91b604482015290519081900360640190fd5b6001600160a01b038084166000908152600d6020908152604080832060028101549094168352600c909152812090610fec611e99565b6001600160a01b0316336001600160a01b03161480611017575060038301546001600160a01b031633145b611056576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b825460ff1661109e576040805162461bcd60e51b815260206004820152600f60248201526e1b9bc81858dd1a5d994819dc985b9d608a1b604482015290519081900360640190fd5b8154610100900460ff166110e7576040805162461bcd60e51b815260206004820152600b60248201526a69727265766f6361626c6560a81b604482015290519081900360640190fd5b8154835462010000900463ffffffff908116600160301b9092048116919091018116908616111561114b576040805162461bcd60e51b81526020600482015260096024820152681b9bc81959999958dd60ba1b604482015290519081900360640190fd5b611153612399565b63ffffffff168563ffffffff1610156111b3576040805162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207265766f6b652076657374656420686f6c64696e6773000000604482015290519081900360640190fd5b6111bd86866128f8565b60038401549091506111da9087906001600160a01b031683612a4a565b60038301546111f49087906001600160a01b03168361125a565b506001600160a01b0386166000818152600d6020526040808220805460ff1961ff0019909116610100171690555163ffffffff881692917f906c0c4c98565a396c542d9102cae7a794e84af6763123e068a1b277333bf4a491a350600195945050505050565b60055460009060ff16156112a8576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6112b3848484612b36565b949350505050565b60008060008060008060008060006112d3338b6123c0565b9850985098509850985098509850985098509193959799909294969850565b60085460ff1690565b3390565b611307611ead565b611346576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b61134f81612bc3565b50565b60055460009060ff16156113a0576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa8383612c1e565b9392505050565b6000336113bd81612c7b565b61140a576040805162461bcd60e51b81526020600482015260196024820152786772616e746f72206163636f756e74206e6f7420726561647960381b604482015290519081900360640190fd5b336000908152600e60205260409020805484919060ff1661146b576040805162461bcd60e51b81526020600482015260166024820152751cd95d081c995cdd1c9a58dd1a5bdb9cc8199a5c9cdd60521b604482015290519081900360640190fd5b805463ffffffff61010090910481169083161080159061149e5750805463ffffffff650100000000009091048116908316105b6114e4576040805162461bcd60e51b8152602060048201526012602482015271737461727444617920746f6f206561726c7960701b604482015290519081900360640190fd5b8054600160481b900463ffffffff166114fb612399565b63ffffffff1610611545576040805162461bcd60e51b815260206004820152600f60248201526e19dc985b9d1bdc88195e1c1a5c9959608a1b604482015290519081900360640190fd5b8761154f81612c96565b61158e576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61159c898989893333612cc9565b9998505050505050505050565b6115b96115b46112fb565b611a2d565b6115f45760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b60055460ff16611642576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6116756112fb565b604080516001600160a01b039092168252519081900360200190a1565b60055460009060ff166116e3576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6116ee6115b46112fb565b6117295760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b61173233611a2d565b611770576040805162461bcd60e51b815260206004820152600a60248201526937b7363ca830bab9b2b960b11b604482015290519081900360640190fd5b600061177a611e99565b9050806001600160a01b0316ff5b600061179333610f53565b6117d2576040805162461bcd60e51b815260206004820152600b60248201526a37b7363ca3b930b73a37b960a91b604482015290519081900360640190fd5b886117dc81612c96565b61181b576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61182b8a8a8a8a8a8a8a8a611c8a565b9a9950505050505050505050565b60008261184581612c96565b611884576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61188e8484612217565b506001949350505050565b6000826118a581612c96565b6118e4576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b6118ef85858561125a565b50600195945050505050565b338161190a8282610e39612399565b8161191484611be5565b106119505760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b81525061197c565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b906119c85760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b506119d33384612fd2565b505050565b6119e0611ead565b611a1f576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b611a2982826130ce565b5050565b6000610f6660048363ffffffff61289116565b60055460ff1690565b6000611a53611ead565b611a92576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b85611a9c81612c96565b611adb576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b611ae487611ba2565b611b2c576040805162461bcd60e51b8152602060048201526014602482015273756e69666f726d206772616e746f72206f6e6c7960601b604482015290519081900360640190fd5b611b3587613140565b15611b87576040805162461bcd60e51b815260206004820152601760248201527f7363686564756c6520616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b611b94878688878761315e565b506001979650505050505050565b6000611bad82610f53565b8015610f665750506001600160a01b03166000908152600b602052604090205460ff1690565b611be3611bde6112fb565b61340b565b565b6001600160a01b031660009081526001602052604090205490565b611c08611ead565b611c47576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b81526020600482015260096024820152683337b93134b23232b760b91b604482015290519081900360640190fd5b611a298282613453565b6000611c9533610f53565b611cd4576040805162461bcd60e51b815260206004820152600b60248201526a37b7363ca3b930b73a37b960a91b604482015290519081900360640190fd5b6001600160a01b0389166000908152600d602052604090205460ff1615611d39576040805162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b604482015290519081900360640190fd5b611d46898587868661315e565b50611d55898989898d33612cc9565b5060019998505050505050505050565b611d706115b46112fb565b611dab5760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b61134f816134a7565b336000908152602081815260409091208251611a2992840190613bf4565b611ddd6115b46112fb565b611e185760405162461bcd60e51b8152600401808060200182810382526030815260200180613cd26030913960400191505060405180910390fd5b60055460ff1615611e63576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116756112fb565b60085461010090046001600160a01b031690565b60085460009061010090046001600160a01b0316611ec96112fb565b6001600160a01b031614905090565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e1d5780601f10610df257610100808354040283529160200191610e1d565b6000611f43611ead565b611f82576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b84611f8c81612c96565b611fcb576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b611fd486611ba2565b8015611feb57508463ffffffff168463ffffffff16115b80156120095750611ffa612399565b63ffffffff168363ffffffff16115b61204b576040805162461bcd60e51b815260206004820152600e60248201526d696e76616c696420706172616d7360901b604482015290519081900360640190fd5b60405180608001604052806001151581526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff16815250600e6000886001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160056101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160096101000a81548163ffffffff021916908363ffffffff160217905550905050856001600160a01b03167fd204f080300249d73110cd2c2e8d720f0362e94b8e0f1b797ac249acca176551868686604051808463ffffffff1663ffffffff1681526020018363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff168152602001935050505060405180910390a250600195945050505050565b60055460009060ff161561220d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa83836134ef565b600033826122288282610e39612399565b8161223284611be5565b1061226e5760405180604001604052806019815260200178696e73756666696369656e74207665737465642066756e647360381b81525061229a565b60405180604001604052806012815260200171696e73756666696369656e742066756e647360701b8152505b906122e65760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b50610f44858561355d565b60008060008361230033610f53565b806123135750336001600160a01b038216145b612358576040805162461bcd60e51b815260206004820152601160248201527037b7363ca3b930b73a37b927b929b2b63360791b604482015290519081900360640190fd5b505050506001600160a01b03166000908152600c602052604090205463ffffffff600160301b8204811692620100008304821692600160501b900490911690565b62015180420490565b6001600160a01b031660009081526009602052604090205460ff1690565b60008060008060008060008060008a6123d833610f53565b806123eb5750336001600160a01b038216145b612430576040805162461bcd60e51b815260206004820152601160248201527037b7363ca3b930b73a37b927b929b2b63360791b604482015290519081900360640190fd5b6001600160a01b03808d166000908152600d6020908152604080832060028101549094168352600c9091528120906124688f8f6128f8565b6001840154909150612480818363ffffffff6135b516565b93549254939d50909b50995063ffffffff6201000080830482169a50600160301b840482169950830481169750600160501b909204909116945060ff8082169450610100909104169150509295985092959850929598565b33600081815260096020526040808220805460ff19166001179055519091907fcd822dc9688e20acea68724a2fbcfe4f3e526d20ecaa37b18fe3047ab377d6a5908390a250600190565b336000908152602081815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610e1d5780601f10610df257610100808354040283529160200191610e1d565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6125be611ead565b6125fd576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b61260633612bc3565b61260f816135f7565b61134f8160006130ce565b60008261262681612c96565b612665576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b61188e8484610e28565b60003361267b81612c7b565b6126c8576040805162461bcd60e51b81526020600482015260196024820152786772616e746f72206163636f756e74206e6f7420726561647960381b604482015290519081900360640190fd5b336000908152600e60205260409020805484919060ff16612729576040805162461bcd60e51b81526020600482015260166024820152751cd95d081c995cdd1c9a58dd1a5bdb9cc8199a5c9cdd60521b604482015290519081900360640190fd5b805463ffffffff61010090910481169083161080159061275c5750805463ffffffff650100000000009091048116908316105b6127a2576040805162461bcd60e51b8152602060048201526012602482015271737461727444617920746f6f206561726c7960701b604482015290519081900360640190fd5b8054600160481b900463ffffffff166127b9612399565b63ffffffff1610612803576040805162461bcd60e51b815260206004820152600f60248201526e19dc985b9d1bdc88195e1c1a5c9959608a1b604482015290519081900360640190fd5b612811888888883333612cc9565b98975050505050505050565b600381565b600061282e8483613690565b909211159392505050565b60055460009060ff1615612887576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa83836136ba565b60006001600160a01b0382166128d85760405162461bcd60e51b8152600401808060200182810382526022815260200180613e1a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038083166000908152600d6020908152604080832060028101549094168352600c909152812090919082612932856136ce565b835490915060ff161580612963575081548354620100009081900463ffffffff908116919092048216018116908216105b15612975575050600101549050610f66565b8154835462010000900463ffffffff908116600160301b9092048116919091018116908216106129ab5760009350505050610f66565b8254825463ffffffff620100009092048216830391600091600160501b900481169081908416816129d857fe5b040290506000612a258560000160069054906101000a900463ffffffff1663ffffffff16612a198463ffffffff1689600101546136ea90919063ffffffff16565b9063ffffffff61374316565b6001870154909150612a3d908263ffffffff6135b516565b9650505050505050610f66565b6001600160a01b038316612a8f5760405162461bcd60e51b8152600401808060200182810382526024815260200180613ea66024913960400191505060405180910390fd5b6001600160a01b038216612ad45760405162461bcd60e51b8152600401808060200182810382526022815260200180613d286022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000612b43848484613785565b612bb984612b4f6112fb565b612bb485604051806060016040528060288152602001613dd2602891396001600160a01b038a16600090815260026020526040812090612b8d6112fb565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6138e316565b612a4a565b5060019392505050565b6001600160a01b038116612bd657600080fd5b612be7600a8263ffffffff61393d16565b6040516001600160a01b038216907f33a8bb468e8361c5c40d643192eb6970b91cb87aa0200f8709f5b805087b905390600090a250565b6000612c72612c2b6112fb565b84612bb48560026000612c3c6112fb565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6139a416565b50600192915050565b6000612c8682611ba2565b8015610f665750610f6682613140565b60006001600160a01b038216331480610f665750506001600160a01b031660009081526009602052604090205460ff1690565b6001600160a01b0386166000908152600d602052604081205460ff1615612d2e576040805162461bcd60e51b81526020600482015260146024820152736772616e7420616c72656164792065786973747360601b604482015290519081900360640190fd5b858511158015612d3e5750600085115b8015612d525750612acd63ffffffff851610155b8015612d6657506205bd8863ffffffff8516105b612db0576040805162461bcd60e51b8152602060048201526016602482015275696e76616c69642076657374696e6720706172616d7360501b604482015290519081900360640190fd5b612db983613140565b612e0a576040805162461bcd60e51b815260206004820152601860248201527f6e6f20737563682076657374696e67207363686564756c650000000000000000604482015290519081900360640190fd5b612e15828888613785565b6040518060c001604052806001151581526020016000151581526020018563ffffffff168152602001868152602001846001600160a01b03168152602001836001600160a01b0316815250600d6000896001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548163ffffffff021916908363ffffffff1602179055506060820151816001015560808201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160030160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050816001600160a01b031685886001600160a01b03167fce19dc9f3460f5845c81c7fa52526977d7e7275df4b1d0e40ea09653252e0c758787604051808363ffffffff1663ffffffff168152602001826001600160a01b03166001600160a01b031681526020019250505060405180910390a45060019695505050505050565b6001600160a01b0382166130175760405162461bcd60e51b8152600401808060200182810382526021815260200180613e606021913960400191505060405180910390fd5b61305a81604051806060016040528060228152602001613cb0602291396001600160a01b038516600090815260016020526040902054919063ffffffff6138e316565b6001600160a01b038316600090815260016020526040902055600354613086908263ffffffff6135b516565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0382166130e157600080fd5b6130f2600a8363ffffffff6139fe16565b6001600160a01b0382166000818152600b6020526040808220805460ff1916851515179055517f614c7c37719098320f845a142223983b9adcc4c3f2663971d5b0eb4c661a24e79190a25050565b6001600160a01b03166000908152600c602052604090205460ff1690565b6000808463ffffffff1611801561317d5750610e4463ffffffff851611155b801561319457508363ffffffff168563ffffffff16105b80156131a7575060018363ffffffff1610155b6131f8576040805162461bcd60e51b815260206004820152601860248201527f696e76616c69642076657374696e67207363686564756c650000000000000000604482015290519081900360640190fd5b8263ffffffff168463ffffffff168161320d57fe5b0663ffffffff16600014801561323e57508263ffffffff168563ffffffff168161323357fe5b0663ffffffff166000145b6132795760405162461bcd60e51b8152600401808060200182810382526023815260200180613eca6023913960400191505060405180910390fd5b6040518060a0016040528060011515815260200183151581526020018663ffffffff1681526020018563ffffffff1681526020018463ffffffff16815250600c6000886001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160066101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600a6101000a81548163ffffffff021916908363ffffffff1602179055509050508115158463ffffffff16876001600160a01b03167fb84219eaee5910cc5311a393fbd4287b14bc791973b97f64d4b61b6d8554adc78887604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a450600195945050505050565b61341c60048263ffffffff61393d16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b61345d8282612fd2565b611a29826134696112fb565b612bb484604051806060016040528060248152602001613e3c602491396001600160a01b038816600090815260026020526040812090612b8d6112fb565b6134b860048263ffffffff6139fe16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6000612c726134fc6112fb565b84612bb485604051806060016040528060258152602001613eed60259139600260006135266112fb565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6138e316565b60055460009060ff16156135ab576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6113aa8383613a7f565b60006113aa83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138e3565b8061360181612c96565b613640576040805162461bcd60e51b81526020600482015260166024820152600080516020613d4a833981519152604482015290519081900360640190fd5b613648611ead565b613687576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b611a2982613a93565b60008061369c84611be5565b90506000610f446136ad86866128f8565b839063ffffffff6135b516565b6000612c726136c76112fb565b8484612a4a565b600063ffffffff8216156136e25781610f66565b610f66612399565b6000826136f957506000610f66565b8282028284828161370657fe5b04146113aa5760405162461bcd60e51b8152600401808060200182810382526021815260200180613db16021913960400191505060405180910390fd5b60006113aa83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ae3565b6001600160a01b0383166137ca5760405162461bcd60e51b8152600401808060200182810382526025815260200180613e816025913960400191505060405180910390fd5b6001600160a01b03821661380f5760405162461bcd60e51b8152600401808060200182810382526023815260200180613c8d6023913960400191505060405180910390fd5b61385281604051806060016040528060268152602001613d6a602691396001600160a01b038616600090815260016020526040902054919063ffffffff6138e316565b6001600160a01b038085166000908152600160205260408082209390935590841681522054613887908263ffffffff6139a416565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156139355760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b505050900390565b6139478282612891565b6139825760405162461bcd60e51b8152600401808060200182810382526021815260200180613d906021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000828201838110156113aa576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613a088282612891565b15613a5a576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000612c72613a8c6112fb565b8484613785565b613a9b611ead565b613ada576040805162461bcd60e51b81526020600482018190526024820152600080516020613dfa833981519152604482015290519081900360640190fd5b61134f81613b48565b60008183613b325760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610efe578181015183820152602001610ee6565b506000838581613b3e57fe5b0495945050505050565b6001600160a01b038116613b8d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613d026026913960400191505060405180910390fd5b6008546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c3557805160ff1916838001178555613c62565b82800160010185558215613c62579182015b82811115613c62578251825591602001919060010190613c47565b50613c6e929150613c72565b5090565b610e2591905b80821115613c6e5760008155600101613c7856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573736163636f756e74206e6f7420726567697374657265640000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373696e76616c696420636c6966662f6475726174696f6e20666f7220696e74657276616c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158201b59cd1259572d966bd0ca0733c49823d95bb3bdd4a5829e1e348b6bf35351b964736f6c63430005110032

Deployed Bytecode Sourcemap

156:1266:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;976:38;;;1004:9;976:38;;;;992:10;;976:38;;;;;;;;;;156:1266;3792:81:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3792:81:1;;;:::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;3792:81:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16865:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16865:170:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16865:170:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;355:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;355:89:1;;;:::i;:::-;;;;;;;;;;;;;;;;3590:109:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3590:109:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3590:109:2;-1:-1:-1;;;;;3590:109:2;;:::i;15705:986:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15705:986:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15705:986:1;;-1:-1:-1;;;;;15705:986:1;;;;;;;;:::i;4479:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4479:158:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4479:158:1;;;;;;;;;;;;;;;;;:::i;14856:407::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14856:407:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14856:407:1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3970:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3970:81:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;610:129:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;610:129:2;;;:::i;:::-;;;;-1:-1:-1;;;;;610:129:2;;;;;;;;;;;;;;3843:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3843:97:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3843:97:2;-1:-1:-1;;;;;3843:97:2;;:::i;:::-;;4787:168:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4787:168:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4787:168:1;;;;;;;;:::i;19998:439::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19998:439:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;19998:439:1;;-1:-1:-1;;;;;19998:439:1;;;;;;;;;;;;;;;;;;:::i;5592:117:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5592:117:2;;;:::i;1160:259:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1160:259:0;;;:::i;11933:462:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11933:462:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;11933:462:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5950:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5950:155:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5950:155:1;;;;;;;;:::i;6285:183::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6285:183:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6285:183:1;;;;;;;;;;;;;;;;;:::i;1030:122:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1030:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1030:122:0;;:::i;3705:132:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3705:132:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3705:132:2;;;;;;;;;;:::i;1269:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1269:107:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1269:107:2;-1:-1:-1;;;;;1269:107:2;;:::i;5197:76::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5197:76:2;;;:::i;18309:513:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18309:513:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;18309:513:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4366:142:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4366:142:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4366:142:2;-1:-1:-1;;;;;4366:142:2;;:::i;1478:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1478:77:2;;;:::i;450:108:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;450:108:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;450:108:1;-1:-1:-1;;;;;450:108:1;;:::i;4679:90:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4679:90:2;;;:::i;4190:101:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4190:101:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4190:101:1;;;;;;;;:::i;11332:595::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11332:595:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;11332:595:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1382:90:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1382:90:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1382:90:2;-1:-1:-1;;;;;1382:90:2;;:::i;512:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;512:92:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;512:92:2;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;512:92:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;512:92:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;512:92:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;512:92:2;;-1:-1:-1;512:92:2;;-1:-1:-1;;;;;512:92:2:i;5471:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5471:115:2;;;:::i;2135:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2135:77:2;;;:::i;2327:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2327:92:2;;;:::i;3879:85:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3879:85:1;;;:::i;17648:655::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17648:655:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;17648:655:1;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4961:178::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4961:178:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4961:178:1;;;;;;;;:::i;16697:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16697:162:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16697:162:1;;;;;;;;:::i;9752:414::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9752:414:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9752:414:1;-1:-1:-1;;;;;9752:414:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12401:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12401:121:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5537:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5537:115:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5537:115:1;-1:-1:-1;;;;;5537:115:1;;:::i;13862:988::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13862:988:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13862:988:1;;-1:-1:-1;;;;;13862:988:1;;;;;;;;:::i;5365:166::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5365:166:1;;;:::i;745:107:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;745:107:2;;;:::i;725:132:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;725:132:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;725:132:1;;;;;;;;;;:::i;4775:207:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4775:207:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4775:207:2;-1:-1:-1;;;;;4775:207:2;;:::i;6111:168:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6111:168:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6111:168:1;;;;;;;;:::i;19594:398::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19594:398:1;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;19594:398:1;;-1:-1:-1;;;;;19594:398:1;;;;;;;;;;;;;;;;;;:::i;271:34:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;271:34:0;;;:::i;3792:81:1:-;3861:5;3854:12;;;;;;;;-1:-1:-1;;3854:12:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3829:13;;3854:12;;3861:5;;3854:12;;3861:5;3854:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3792:81;;:::o;16865:170::-;16973:7;16945:10;16957:5;15539:46;15560:7;15569:6;15577:7;:5;:7::i;:::-;15539:20;:46::i;:::-;15620:6;15599:18;15609:7;15599:9;:18::i;:::-;:27;:80;;;;;;;;;;;;;;;-1:-1:-1;;;15599:80:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15599:80:1;;;;15531:149;;;;;-1:-1:-1;;;15531:149:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15531:149:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16999:29;17013:7;17022:5;16999:13;:29::i;:::-;16992:36;16865:170;-1:-1:-1;;;;;16865:170:1:o;355:89::-;425:12;;355:89;:::o;3590:109:2:-;3647:4;3670:22;:9;3684:7;3670:22;:13;:22;:::i;:::-;3663:29;3590:109;-1:-1:-1;;3590:109:2:o;15705:986:1:-;15789:7;3375:21:2;3385:10;3375:9;:21::i;:::-;3367:45;;;;;-1:-1:-1;;;3367:45:2;;;;;;;;;;;;-1:-1:-1;;;3367:45:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;15835:25:1;;;15808:24;15835:25;;;:12;:25;;;;;;;;15922:21;;;;;;;15904:40;;:17;:40;;;;;;16010:7;:5;:7::i;:::-;-1:-1:-1;;;;;15996:21:1;:10;-1:-1:-1;;;;;15996:21:1;;:52;;;-1:-1:-1;16035:13:1;;;;-1:-1:-1;;;;;16035:13:1;16021:10;:27;15996:52;15988:76;;;;;-1:-1:-1;;;15988:76:1;;;;;;;;;;;;-1:-1:-1;;;15988:76:1;;;;;;;;;;;;;;;16082:14;;;;16074:42;;;;;-1:-1:-1;;;16074:42:1;;;;;;;;;;;;-1:-1:-1;;;16074:42:1;;;;;;;;;;;;;;;16134:19;;;;;;;16126:43;;;;;-1:-1:-1;;;16126:43:1;;;;;;;;;;;;-1:-1:-1;;;16126:43:1;;;;;;;;;;;;;;;16213:16;;16196:14;;;;;16213:16;16196:14;;;-1:-1:-1;;;16213:16:1;;;;;16196:33;;;;16187:42;;;;;;;16179:64;;;;;-1:-1:-1;;;16179:64:1;;;;;;;;;;;;-1:-1:-1;;;16179:64:1;;;;;;;;;;;;;;;16270:7;:5;:7::i;:::-;16261:16;;:5;:16;;;;16253:58;;;;;-1:-1:-1;;;16253:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;16339:39;16359:11;16372:5;16339:19;:39::i;:::-;16411:13;;;;16321:57;;-1:-1:-1;16389:53:1;;16398:11;;-1:-1:-1;;;;;16411:13:1;16321:57;16389:8;:53::i;:::-;16478:13;;;;16452:57;;16465:11;;-1:-1:-1;;;;;16478:13:1;16493:15;16452:12;:57::i;:::-;-1:-1:-1;;;;;;16520:25:1;;;;;;:12;:25;;;;;;:43;;-1:-1:-1;;;;16520:43:1;;;;;16573:42;;;16631:32;;;;;16520:25;16631:32;;;-1:-1:-1;16680:4:1;;15705:986;-1:-1:-1;;;;;15705:986:1:o;4479:158::-;5323:7:2;;4572:4:1;;5323:7:2;;5322:8;5314:37;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;;;;4595:35:1;4614:4;4620:2;4624:5;4595:18;:35::i;:::-;4588:42;4479:158;-1:-1:-1;;;;4479:158:1:o;14856:407::-;14928:20;14958:23;14991:21;15022:19;15051;15080:20;15110:23;15143:13;15166:15;15209:47;15231:10;15243:12;15209:21;:47::i;:::-;15202:54;;;;;;;;;;;;;;;;;;14856:407;;;;;;;;;;;:::o;3970:81::-;4035:9;;;;3970:81;:::o;610:129:2:-;699:10;610:129;:::o;3843:97::-;2257:9;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;3910:23;3925:7;3910:14;:23::i;:::-;3843:97;:::o;4787:168:1:-;5323:7:2;;4881:4:1;;5323:7:2;;5322:8;5314:37;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;;;;4904:44:1;4928:7;4937:10;4904:23;:44::i;:::-;4897:51;4787:168;-1:-1:-1;;;4787:168:1:o;19998:439::-;20306:7;20203:10;19077:37;19106:7;19077:28;:37::i;:::-;19069:75;;;;;-1:-1:-1;;;19069:75:1;;;;;;;;;;;;-1:-1:-1;;;19069:75:1;;;;;;;;;;;;;;;19280:10;19231:32;19266:25;;;:13;:25;;;;;19309:19;;20246:8;;19266:25;19309:19;;19301:54;;;;;-1:-1:-1;;;19301:54:1;;;;;;;;;;;;-1:-1:-1;;;19301:54:1;;;;;;;;;;;;;;;19399:23;;;;;;;;;19387:35;;;;;;;:85;;-1:-1:-1;19449:23:1;;;;;;;;;19438:34;;;;19387:85;19366:129;;;;;-1:-1:-1;;;19366:129:1;;;;;;;;;;;;-1:-1:-1;;;19366:129:1;;;;;;;;;;;;;;;19524:25;;-1:-1:-1;;;19524:25:1;;;;19514:7;:5;:7::i;:::-;:35;;;19506:63;;;;;-1:-1:-1;;;19506:63:1;;;;;;;;;;;;-1:-1:-1;;;19506:63:1;;;;;;;;;;;;;;;20280:11;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;20336:94;20356:11;20369;20382:13;20397:8;20407:10;20419;20336:19;:94::i;:::-;20329:101;19998:439;-1:-1:-1;;;;;;;;;19998:439:1:o;5592:117:2:-;1170:22;1179:12;:10;:12::i;:::-;1170:8;:22::i;:::-;1162:83;;;;-1:-1:-1;;;1162:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5415:7;;;;5407:40;;;;;-1:-1:-1;;;5407:40:2;;;;;;;;;;;;-1:-1:-1;;;5407:40:2;;;;;;;;;;;;;;;5650:7;:15;;-1:-1:-1;;5650:15:2;;;5680:22;5689:12;:10;:12::i;:::-;5680:22;;;-1:-1:-1;;;;;5680:22:2;;;;;;;;;;;;;;5592:117::o;1160:259:0:-;5415:7:2;;1214:15:0;;5415:7:2;;5407:40;;;;;-1:-1:-1;;;5407:40:2;;;;;;;;;;;;-1:-1:-1;;;5407:40:2;;;;;;;;;;;;;;;1170:22;1179:12;:10;:12::i;1170:22::-;1162:83;;;;-1:-1:-1;;;1162:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1250:20:0;1259:10;1250:8;:20::i;:::-;1242:43;;;;;-1:-1:-1;;;1242:43:0;;;;;;;;;;;;-1:-1:-1;;;1242:43:0;;;;;;;;;;;;;;;1296:28;1343:7;:5;:7::i;:::-;1296:56;;1376:12;-1:-1:-1;;;;;1363:26:0;;11933:462:1;12207:7;3375:21:2;3385:10;3375:9;:21::i;:::-;3367:45;;;;;-1:-1:-1;;;3367:45:2;;;;;;;;;;;;-1:-1:-1;;;3367:45:2;;;;;;;;;;;;;;;12185:11:1;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;12234:154;12266:11;12279;12292:13;12319:8;12329;12339:13;12354:8;12376:11;12234:18;:154::i;:::-;12227:161;11933:462;-1:-1:-1;;;;;;;;;;11933:462:1:o;5950:155::-;6039:7;6026:2;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;6058:19;6067:2;6071:5;6058:8;:19::i;:::-;-1:-1:-1;6094:4:1;;5950:155;-1:-1:-1;;;;5950:155:1:o;6285:183::-;6392:7;6379:2;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;6411:29;6424:4;6430:2;6434:5;6411:12;:29::i;:::-;-1:-1:-1;6457:4:1;;6285:183;-1:-1:-1;;;;;6285:183:1:o;1030:122:0:-;1083:10;1095:5;15539:46:1;15560:7;15569:6;15577:7;:5;:7::i;15539:46::-;15620:6;15599:18;15609:7;15599:9;:18::i;:::-;:27;:80;;;;;;;;;;;;;;;-1:-1:-1;;;15599:80:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15599:80:1;;;;15531:149;;;;;-1:-1:-1;;;15531:149:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;15531:149:1;;1120:24:0;1126:10;1138:5;1120;:24::i;:::-;1030:122;;;:::o;3705:132:2:-;2257:9;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;3792:38;3804:7;3813:16;3792:11;:38::i;:::-;3705:132;;:::o;1269:107::-;1325:4;1348:21;:8;1361:7;1348:21;:12;:21;:::i;5197:76::-;5259:7;;;;5197:76;:::o;18309:513:1:-;18552:7;2257:9:2;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;18530:7:1;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;18583:25;18600:7;18583:16;:25::i;:::-;18575:58;;;;;-1:-1:-1;;;18575:58:1;;;;;;;;;;;;-1:-1:-1;;;18575:58:1;;;;;;;;;;;;;;;18652:28;18672:7;18652:19;:28::i;:::-;18651:29;18643:65;;;;;-1:-1:-1;;;18643:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;18718:76;18738:7;18747:13;18762:8;18772;18782:11;18718:19;:76::i;:::-;-1:-1:-1;18811:4:1;;18309:513;-1:-1:-1;;;;;;;18309:513:1:o;4366:142:2:-;4430:4;4453:18;4463:7;4453:9;:18::i;:::-;:48;;;;-1:-1:-1;;;;;;;4475:26:2;;;;;:17;:26;;;;;;;;;4366:142::o;1478:77::-;1521:27;1535:12;:10;:12::i;:::-;1521:13;:27::i;:::-;1478:77::o;450:108:1:-;-1:-1:-1;;;;;533:18:1;507:7;533:18;;;:9;:18;;;;;;;450:108::o;4679:90:2:-;2257:9;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;4735:27;;;-1:-1:-1;;;4735:27:2;;;;;;;;;;;;-1:-1:-1;;;4735:27:2;;;;;;;;;;;;;;4190:101:1;4258:26;4268:7;4277:6;4258:9;:26::i;11332:595::-;11614:7;3375:21:2;3385:10;3375:9;:21::i;:::-;3367:45;;;;;-1:-1:-1;;;3367:45:2;;;;;;;;;;;;-1:-1:-1;;;3367:45:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;11642:25:1;;;;;;:12;:25;;;;;:34;;;11641:35;11633:68;;;;;-1:-1:-1;;;11633:68:1;;;;;;;;;;;;-1:-1:-1;;;11633:68:1;;;;;;;;;;;;;;;11712:80;11732:11;11745:13;11760:8;11770;11780:11;11712:19;:80::i;:::-;;11803:95;11823:11;11836;11849:13;11864:8;11874:11;11887:10;11803:19;:95::i;:::-;-1:-1:-1;11916:4:1;;11332:595;-1:-1:-1;;;;;;;;;11332:595:1:o;1382:90:2:-;1170:22;1179:12;:10;:12::i;1170:22::-;1162:83;;;;-1:-1:-1;;;1162:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1446:19;1457:7;1446:10;:19::i;512:92::-;574:10;567:6;:18;;;;;;;;;;;:30;;;;;;;;:::i;5471:115::-;1170:22;1179:12;:10;:12::i;1170:22::-;1162:83;;;;-1:-1:-1;;;1162:83:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5323:7;;;;5322:8;5314:37;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;;;;5530:7;:14;;-1:-1:-1;;5530:14:2;5540:4;5530:14;;;5559:20;5566:12;:10;:12::i;2135:77::-;2199:6;;;;;-1:-1:-1;;;;;2199:6:2;;2135:77::o;2327:92::-;2406:6;;2367:4;;2406:6;;;-1:-1:-1;;;;;2406:6:2;2390:12;:10;:12::i;:::-;-1:-1:-1;;;;;2390:22:2;;2383:29;;2327:92;:::o;3879:85:1:-;3950:7;3943:14;;;;;;;;-1:-1:-1;;3943:14:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3918:13;;3943:14;;3950:7;;3943:14;;3950:7;3943:14;;;;;;;;;;;;;;;;;;;;;;;;17648:655;17861:7;2257:9:2;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;17839:7:1;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;17905:25;17922:7;17905:16;:25::i;:::-;:63;;;;;17957:11;17943:25;;:11;:25;;;17905:63;:99;;;;;17997:7;:5;:7::i;:::-;17981:23;;:13;:23;;;17905:99;17884:139;;;;;-1:-1:-1;;;17884:139:1;;;;;;;;;;;;-1:-1:-1;;;17884:139:1;;;;;;;;;;;;;;;18059:128;;;;;;;;18085:4;18059:128;;;;;;18114:11;18059:128;;;;;;18139:11;18059:128;;;;;;18164:13;18059:128;;;;;18034:13;:22;18048:7;-1:-1:-1;;;;;18034:22:1;-1:-1:-1;;;;;18034:22:1;;;;;;;;;;;;:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18226:7;-1:-1:-1;;;;;18203:72:1;;18235:11;18248;18261:13;18203:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18292:4:1;;17648:655;-1:-1:-1;;;;;17648:655:1:o;4961:178::-;5323:7:2;;5060:4:1;;5323:7:2;;5322:8;5314:37;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;;;;5083:49:1;5107:7;5116:15;5083:23;:49::i;16697:162::-;16801:7;16773:10;16785:5;15539:46;15560:7;15569:6;15577:7;:5;:7::i;15539:46::-;15620:6;15599:18;15609:7;15599:9;:18::i;:::-;:27;:80;;;;;;;;;;;;;;;-1:-1:-1;;;15599:80:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15599:80:1;;;;15531:149;;;;;-1:-1:-1;;;15531:149:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;15531:149:1;;16827:25;16842:2;16846:5;16827:14;:25::i;9752:414::-;9887:19;9916:20;9946:23;9852:11;3498:21:2;3508:10;3498:9;:21::i;:::-;:46;;;-1:-1:-1;3523:10:2;-1:-1:-1;;;;;3523:21:2;;;3498:46;3490:76;;;;;-1:-1:-1;;;3490:76:2;;;;;;;;;;;;-1:-1:-1;;;3490:76:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;10007:30:1;;;;;:17;:30;;;;;:39;;-1:-1:-1;;;10007:39:1;;;;;10056:44;;;;;;-1:-1:-1;;;10110:39:1;;;;;;9752:414::o;12401:121::-;7091:12;12481:15;:33;;12401:121::o;5537:115::-;-1:-1:-1;;;;;5623:22:1;5597:7;5623:22;;;:13;:22;;;;;;;;;5537:115::o;13862:988::-;14034:20;14064:23;14097:21;14128:19;14157;14186:20;14216:23;14249:13;14272:15;13999:11;3498:21:2;3508:10;3498:9;:21::i;:::-;:46;;;-1:-1:-1;3523:10:2;-1:-1:-1;;;;;3523:21:2;;;3498:46;3490:76;;;;;-1:-1:-1;;;3490:76:2;;;;;;;;;;;;-1:-1:-1;;;3490:76:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;14335:25:1;;;14308:24;14335:25;;;:12;:25;;;;;;;;14422:21;;;;;;;14404:40;;:17;:40;;;;;;14480:46;14348:11;14513:12;14480:19;:46::i;:::-;14558:12;;;;14454:72;;-1:-1:-1;14598:32:1;14558:12;14454:72;14598:32;:15;:32;:::i;:::-;14686:14;;14710:16;;14581:262;;-1:-1:-1;14640:15:1;;-1:-1:-1;14665:11:1;-1:-1:-1;14686:14:1;;;;;;;;-1:-1:-1;;;;14710:16:1;;;;;-1:-1:-1;14736:21:1;;;;;-1:-1:-1;;;;14767:16:1;;;;;;;-1:-1:-1;14793:14:1;;;;;-1:-1:-1;14686:14:1;14817:16;;;;;-1:-1:-1;13862:988:1;;;;;;;;;;;;:::o;5365:166::-;5441:10;5408:7;5427:25;;;:13;:25;;;;;;:32;;-1:-1:-1;;5427:32:1;5455:4;5427:32;;;5474:29;5408:7;;5441:10;5474:29;;5408:7;;5474:29;-1:-1:-1;5520:4:1;5365:166;:::o;745:107:2:-;833:10;826:6;:18;;;;;;;;;;;;818:27;;;;;;-1:-1:-1;;818:27:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;784:22;;818:27;;;826:18;818:27;;;;;;;;;;;;;;;;;;;;;;;;725:132:1;-1:-1:-1;;;;;823:18:1;;;797:7;823:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;725:132::o;4775:207:2:-;2257:9;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;4847:26;4862:10;4847:14;:26::i;:::-;4883:33;4907:8;4883:23;:33::i;:::-;4926:49;4938:8;2999:5;4926:11;:49::i;6111:168:1:-;6209:7;6191;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;6228:23;6236:7;6245:5;6228:7;:23::i;19594:398::-;19861:7;19795:10;19077:37;19106:7;19077:28;:37::i;:::-;19069:75;;;;;-1:-1:-1;;;19069:75:1;;;;;;;;;;;;-1:-1:-1;;;19069:75:1;;;;;;;;;;;;;;;19280:10;19231:32;19266:25;;;:13;:25;;;;;19309:19;;19838:8;;19266:25;19309:19;;19301:54;;;;;-1:-1:-1;;;19301:54:1;;;;;;;;;;;;-1:-1:-1;;;19301:54:1;;;;;;;;;;;;;;;19399:23;;;;;;;;;19387:35;;;;;;;:85;;-1:-1:-1;19449:23:1;;;;;;;;;19438:34;;;;19387:85;19366:129;;;;;-1:-1:-1;;;19366:129:1;;;;;;;;;;;;-1:-1:-1;;;19366:129:1;;;;;;;;;;;;;;;19524:25;;-1:-1:-1;;;19524:25:1;;;;19514:7;:5;:7::i;:::-;:35;;;19506:63;;;;;-1:-1:-1;;;19506:63:1;;;;;;;;;;;;-1:-1:-1;;;19506:63:1;;;;;;;;;;;;;;;19891:94;19911:11;19924;19937:13;19952:8;19962:10;19974;19891:19;:94::i;:::-;19884:101;19594:398;-1:-1:-1;;;;;;;;19594:398:1:o;271:34:0:-;304:1;271:34;:::o;15269:180:1:-;15369:7;15406:35;15426:7;15435:5;15406:19;:35::i;:::-;15396:45;;;;;15269:180;-1:-1:-1;;;15269:180:1:o;4643:138::-;5323:7:2;;4722:4:1;;5323:7:2;;5322:8;5314:37;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;;;;4745:29:1;4759:7;4768:5;4745:13;:29::i;1891:200:4:-;1963:4;-1:-1:-1;;;;;1987:21:4;;1979:68;;;;-1:-1:-1;;;1979:68:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2064:20:4;:11;:20;;;;;;;;;;;;;;;1891:200::o;12685:886:1:-;-1:-1:-1;;;;;12841:25:1;;;12779:23;12841:25;;;:12;:25;;;;;;;;12928:21;;;;;;;12910:40;;:17;:40;;;;;12779:23;;12841:25;12779:23;12975:27;12989:12;12975:13;:27::i;:::-;13018:14;;12960:42;;-1:-1:-1;13018:14:1;;13017:15;;:65;;-1:-1:-1;13061:21:1;;13044:14;;13061:21;13044:14;;;;13061:21;13044:14;;;13061:21;;;;;;13044:38;13036:46;;;;;;13017:65;13013:552;;;-1:-1:-1;;13113:12:1;;;;-1:-1:-1;13106:19:1;;13013:552;13180:16;;13163:14;;;;;13180:16;13163:14;;;-1:-1:-1;;;13180:16:1;;;;;13163:33;;;;13154:42;;;;;;13150:415;;13235:1;13220:17;;;;;;;13150:415;13312:14;;13403:16;;13312:14;;;;;;;13304:22;;;13284:17;;-1:-1:-1;;;13403:16:1;;;;;;;13370:29;;13403:16;13370:29;;;;;13369:50;13340:79;;13433:14;13450:59;13492:7;:16;;;;;;;;;;;;13450:59;;:37;13467:19;13450:37;;:5;:12;;;:16;;:37;;;;:::i;:::-;:41;:59;:41;:59;:::i;:::-;13530:12;;;;13433:76;;-1:-1:-1;13530:24:1;;13433:76;13530:24;:16;:24;:::i;:::-;13523:31;;;;;;;;;;2928:332;-1:-1:-1;;;;;3021:19:1;;3013:68;;;;-1:-1:-1;;;3013:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3099:21:1;;3091:68;;;;-1:-1:-1;;;3091:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3170:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;3221:32;;;;;;;;;;;;;;;;;2928:332;;;:::o;1019:300::-;1108:4;1124:36;1134:6;1142:9;1153:6;1124:9;:36::i;:::-;1170:121;1179:6;1187:12;:10;:12::i;:::-;1201:89;1239:6;1201:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1201:19:1;;;;;;:11;:19;;;;;;1221:12;:10;:12::i;:::-;-1:-1:-1;;;;;1201:33:1;;;;;;;;;;;;-1:-1:-1;1201:33:1;;;:89;;:37;:89;:::i;:::-;1170:8;:121::i;:::-;-1:-1:-1;1308:4:1;1019:300;;;;;:::o;4191:169:2:-;-1:-1:-1;;;;;4258:21:2;;4250:30;;;;;;4290:25;:9;4307:7;4290:25;:16;:25;:::i;:::-;4330:23;;-1:-1:-1;;;;;4330:23:2;;;;;;;;4191:169;:::o;1325:207:1:-;1405:4;1421:83;1430:12;:10;:12::i;:::-;1444:7;1453:50;1492:10;1453:11;:25;1465:12;:10;:12::i;:::-;-1:-1:-1;;;;;1453:25:1;;;;;;;;;;;;;;;;;-1:-1:-1;1453:25:1;;;:34;;;;;;;;;;;:50;:38;:50;:::i;1421:83::-;-1:-1:-1;1521:4:1;1325:207;;;;:::o;18828:168::-;18906:7;18932:25;18949:7;18932:16;:25::i;:::-;:57;;;;;18961:28;18981:7;18961:19;:28::i;5658:148::-;5722:11;-1:-1:-1;;;;;5752:21:1;;5763:10;5752:21;;:47;;-1:-1:-1;;;;;;;5777:22:1;;;;;:13;:22;;;;;;;;;5658:148::o;10172:1153::-;-1:-1:-1;;;;;10433:25:1;;10401:7;10433:25;;;:12;:25;;;;;:34;;;10432:35;10424:68;;;;;-1:-1:-1;;;10424:68:1;;;;;;;;;;;;-1:-1:-1;;;10424:68:1;;;;;;;;;;;;;;;10541:11;10524:13;:28;;:49;;;;;10572:1;10556:13;:17;10524:49;:92;;;;-1:-1:-1;7356:36:1;10589:27;;;;;10524:92;:122;;;;-1:-1:-1;7440:37:1;10620:26;;;;10524:122;10503:182;;;;;-1:-1:-1;;;10503:182:1;;;;;;;;;;;;-1:-1:-1;;;10503:182:1;;;;;;;;;;;;;;;10704:36;10724:15;10704:19;:36::i;:::-;10696:73;;;;;-1:-1:-1;;;10696:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;10780:44;10790:7;10799:11;10812;10780:9;:44::i;:::-;10863:334;;;;;;;;10887:4;10863:334;;;;;;10917:5;10863:334;;;;;;10950:8;10863:334;;;;;;10972:13;10863:334;;;;10999:15;-1:-1:-1;;;;;10863:334:1;;;;;11089:7;-1:-1:-1;;;;;10863:334:1;;;;10835:12;:25;10848:11;-1:-1:-1;;;;;10835:25:1;-1:-1:-1;;;;;10835:25:1;;;;;;;;;;;;:362;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10835:362:1;;;;;-1:-1:-1;;;;;10835:362:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10835:362:1;;;;;-1:-1:-1;;;;;10835:362:1;;;;;;;;;11289:7;-1:-1:-1;;;;;11213:84:1;11247:13;11234:11;-1:-1:-1;;;;;11213:84:1;;11262:8;11272:15;11213:84;;;;;;;;;;;;;-1:-1:-1;;;;;11213:84:1;-1:-1:-1;;;;;11213:84:1;;;;;;;;;;;;;;;;-1:-1:-1;11314:4:1;10172:1153;;;;;;;;:::o;2580:342::-;-1:-1:-1;;;;;2655:21:1;;2647:67;;;;-1:-1:-1;;;2647:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2746:68;2769:6;2746:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2746:18:1;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;2725:18:1;;;;;;:9;:18;;;;;:89;2839:12;;:24;;2856:6;2839:24;:16;:24;:::i;:::-;2824:12;:39;2878:37;;;;;;;;2904:1;;-1:-1:-1;;;;;2878:37:1;;;;;;;;;;;;2580:342;;:::o;3946:239:2:-;-1:-1:-1;;;;;4033:21:2;;4025:30;;;;;;4065:22;:9;4079:7;4065:22;:13;:22;:::i;:::-;-1:-1:-1;;;;;4097:26:2;;;;;;:17;:26;;;;;;:45;;-1:-1:-1;;4097:45:2;;;;;;;4157:21;;;4097:26;4157:21;3946:239;;:::o;9610:136:1:-;-1:-1:-1;;;;;9705:26:1;9679:7;9705:26;;;:17;:26;;;;;:34;;;;9610:136::o;8739:865::-;8910:7;8962:1;8951:8;:12;;;:42;;;;-1:-1:-1;6954:25:1;8967:26;;;;;8951:42;:82;;;;;9025:8;9009:24;;:13;:24;;;8951:82;:111;;;;;9061:1;9049:8;:13;;;;8951:111;8930:182;;;;;-1:-1:-1;;;8930:182:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;9155:8;9144:19;;:8;:19;;;;;;;;:24;;9167:1;9144:24;:57;;;;;9188:8;9172:24;;:13;:24;;;;;;;;:29;;9200:1;9172:29;9144:57;9123:139;;;;-1:-1:-1;;;9123:139:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9310:126;;;;;;;;9339:4;9310:126;;;;;;9368:11;9310:126;;;;;;9393:13;9310:126;;;;;;9408:8;9310:126;;;;;;9418:8;9310:126;;;;;9273:17;:34;9291:15;-1:-1:-1;;;;;9273:34:1;-1:-1:-1;;;;;9273:34:1;;;;;;;;;;;;:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9564:11;9452:124;;9532:8;9452:124;;9488:15;-1:-1:-1;;;;;9452:124:1;;9517:13;9542:8;9452:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9593:4:1;8739:865;;;;;;;:::o;1686:127:2:-;1745:24;:8;1761:7;1745:24;:15;:24;:::i;:::-;1784:22;;-1:-1:-1;;;;;1784:22:2;;;;;;;;1686:127;:::o;3267:229:1:-;3338:22;3344:7;3353:6;3338:5;:22::i;:::-;3370:119;3379:7;3388:12;:10;:12::i;:::-;3402:86;3441:6;3402:86;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3402:20:1;;;;;;:11;:20;;;;;;3423:12;:10;:12::i;1561:119:2:-;1617:21;:8;1630:7;1617:21;:12;:21;:::i;:::-;1653:20;;-1:-1:-1;;;;;1653:20:2;;;;;;;;1561:119;:::o;1538:258:1:-;1623:4;1639:129;1648:12;:10;:12::i;:::-;1662:7;1671:96;1710:15;1671:96;;;;;;;;;;;;;;;;;:11;:25;1683:12;:10;:12::i;:::-;-1:-1:-1;;;;;1671:25:1;;;;;;;;;;;;;;;;;-1:-1:-1;1671:25:1;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;4343:130::-;5323:7:2;;4418:4:1;;5323:7:2;;5322:8;5314:37;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;-1:-1:-1;;;5314:37:2;;;;;;;;;;;;;;;4441:25:1;4456:2;4460:5;4441:14;:25::i;230:134:4:-;288:7;314:43;318:1;321;314:43;;;;;;;;;;;;;;;;;:3;:43::i;6474:142:1:-;6546:8;5876:23;5891:7;5876:14;:23::i;:::-;5868:58;;;;;-1:-1:-1;;;5868:58:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5868:58:1;;;;;;;;;;;;;;;2257:9:2;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;6576:33:1;6600:8;6576:23;:33::i;13577:279::-;13664:23;13699:19;13721:22;13731:11;13721:9;:22::i;:::-;13699:44;;13753:14;13770:56;13786:39;13806:11;13819:5;13786:19;:39::i;:::-;13770:11;;:56;:15;:56;:::i;863:149::-;929:4;945:39;954:12;:10;:12::i;:::-;968:7;977:6;945:8;:39::i;12528:151::-;12595:16;12630:17;;;;:42;;12660:12;12630:42;;;12650:7;:5;:7::i;562:241:4:-;620:7;644:6;640:45;;-1:-1:-1;673:1:4;666:8;;640:45;707:5;;;711:1;707;:5;:1;730:5;;;;;:10;722:56;;;;-1:-1:-1;;;722:56:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;809:130;867:7;893:39;897:1;900;893:39;;;;;;;;;;;;;;;;;:3;:39::i;1802:464:1:-;-1:-1:-1;;;;;1899:20:1;;1891:70;;;;-1:-1:-1;;;1891:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1979:23:1;;1971:71;;;;-1:-1:-1;;;1971:71:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2073;2095:6;2073:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2073:17:1;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;2053:17:1;;;;;;;:9;:17;;;;;;:91;;;;2177:20;;;;;;;:32;;2202:6;2177:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;2154:20:1;;;;;;;:9;:20;;;;;;;;;:55;;;;2224:35;;;;;;;2154:20;;2224:35;;;;;;;;;;;;;1802:464;;;:::o;370:186:4:-;456:7;491:12;483:6;;;;475:29;;;;-1:-1:-1;;;475:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;475:29:4;-1:-1:-1;;;526:5:4;;;370:186::o;1705:180::-;1784:18;1788:4;1794:7;1784:3;:18::i;:::-;1776:64;;;;-1:-1:-1;;;1776:64:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1850:20:4;1873:5;1850:20;;;;;;;;;;;:28;;-1:-1:-1;;1850:28:4;;;1705:180::o;49:175::-;107:7;138:5;;;161:6;;;;153:46;;;;;-1:-1:-1;;;153:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;1524:175;1601:18;1605:4;1611:7;1601:3;:18::i;:::-;1600:19;1592:63;;;;;-1:-1:-1;;;1592:63:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1665:20:4;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;1665:27:4;1688:4;1665:27;;;1524:175::o;564:155:1:-;633:4;649:42;659:12;:10;:12::i;:::-;673:9;684:6;649:9;:42::i;2568:107:2:-;2257:9;:7;:9::i;:::-;2249:54;;;;;-1:-1:-1;;;2249:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2249:54:2;;;;;;;;;;;;;;;2640:28;2659:8;2640:18;:28::i;945:185:4:-;1031:7;1065:12;1058:5;1050:28;;;;-1:-1:-1;;;1050:28:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1050:28:4;;1088:9;1104:1;1100;:5;;;;;;;945:185;-1:-1:-1;;;;;945:185:4:o;2681:225:2:-;-1:-1:-1;;;;;2754:22:2;;2746:73;;;;-1:-1:-1;;;2746:73:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2855:6;;2834:38;;-1:-1:-1;;;;;2834:38:2;;;;2855:6;;;;;2834:38;;;;;2882:6;:17;;-1:-1:-1;;;;;2882:17:2;;;;;-1:-1:-1;;;;;;2882:17:2;;;;;;;;;2681:225::o;156:1266:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;156:1266:0;;;-1:-1:-1;156:1266:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://1b59cd1259572d966bd0ca0733c49823d95bb3bdd4a5829e1e348b6bf35351b9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.