ETH Price: $1,881.23 (-12.26%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Upgrade Contract99175912020-04-21 19:03:522116 days ago1587495832IN
0xE895B499...234622E8e
0 ETH0.000188236
Pause99175862020-04-21 19:02:182116 days ago1587495738IN
0xE895B499...234622E8e
0 ETH0.000268366
Add Sys Admin95812232020-02-29 21:49:212168 days ago1583012961IN
0xE895B499...234622E8e
0 ETH0.000365018
Add Sys Admin95811952020-02-29 21:44:392168 days ago1583012679IN
0xE895B499...234622E8e
0 ETH0.000022691
Strip Roles95811532020-02-29 21:33:592168 days ago1583012039IN
0xE895B499...234622E8e
0 ETH0.00007064
Add Owner95810782020-02-29 21:21:452168 days ago1583011305IN
0xE895B499...234622E8e
0 ETH0.000045641
Unpause94333252020-02-07 3:58:522190 days ago1581047932IN
0xE895B499...234622E8e
0 ETH0.000123928
Add Sys Admin94330202020-02-07 2:54:252190 days ago1581044065IN
0xE895B499...234622E8e
0 ETH0.000190488
Add Sys Admin94330202020-02-07 2:54:252190 days ago1581044065IN
0xE895B499...234622E8e
0 ETH0.000365018
Set Media Uri Ba...94330182020-02-07 2:54:002190 days ago1581044040IN
0xE895B499...234622E8e
0 ETH0.000381688
Set View Uri Bas...94330122020-02-07 2:52:322190 days ago1581043952IN
0xE895B499...234622E8e
0 ETH0.000381698
Set Token Uri Ba...94330102020-02-07 2:52:102190 days ago1581043930IN
0xE895B499...234622E8e
0 ETH0.00038168
Set Teleporter C...94330082020-02-07 2:51:322190 days ago1581043892IN
0xE895B499...234622E8e
0 ETH0.000385278

View more zero value Internal Transactions in Advanced View mode

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
AvastarMetadata

Compiler Version
v0.5.14+commit.1f1aaa4

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-02-07
*/

// File: contracts/AvastarTypes.sol

pragma solidity 0.5.14;

/**
 * @title Avastar Data Types
 * @author Cliff Hall
 */
contract AvastarTypes {

    enum Generation {
        ONE,
        TWO,
        THREE,
        FOUR,
        FIVE
    }

    enum Series {
        PROMO,
        ONE,
        TWO,
        THREE,
        FOUR,
        FIVE
    }

    enum Wave {
        PRIME,
        REPLICANT
    }

    enum Gene {
        SKIN_TONE,
        HAIR_COLOR,
        EYE_COLOR,
        BG_COLOR,
        BACKDROP,
        EARS,
        FACE,
        NOSE,
        MOUTH,
        FACIAL_FEATURE,
        EYES,
        HAIR_STYLE
    }

    enum Gender {
        ANY,
        MALE,
        FEMALE
    }

    enum Rarity {
        COMMON,
        UNCOMMON,
        RARE,
        EPIC,
        LEGENDARY
    }

    struct Trait {
        uint256 id;
        Generation generation;
        Gender gender;
        Gene gene;
        Rarity rarity;
        uint8 variation;
        Series[] series;
        string name;
        string svg;

    }

    struct Prime {
        uint256 id;
        uint256 serial;
        uint256 traits;
        bool[12] replicated;
        Generation generation;
        Series series;
        Gender gender;
        uint8 ranking;
    }

    struct Replicant {
        uint256 id;
        uint256 serial;
        uint256 traits;
        Generation generation;
        Gender gender;
        uint8 ranking;
    }

    struct Avastar {
        uint256 id;
        uint256 serial;
        uint256 traits;
        Generation generation;
        Wave wave;
    }

    struct Attribution {
        Generation generation;
        string artist;
        string infoURI;
    }

}

// File: contracts/IAvastarTeleporter.sol

pragma solidity 0.5.14;


/**
 * @title AvastarTeleporter Interface
 * @author Cliff Hall
 * @notice Declared as abstract contract rather than interface as it must inherit for enum types.
 * Used by AvastarMinter contract to interact with subset of AvastarTeleporter contract functions.
 */
contract IAvastarTeleporter is AvastarTypes {

    /**
     * @notice Acknowledge contract is `AvastarTeleporter`
     * @return always true if the contract is in fact `AvastarTeleporter`
     */
    function isAvastarTeleporter() external pure returns (bool);

    /**
     * @notice Get token URI for a given Avastar Token ID.
     * Reverts if given token id is not a valid Avastar Token ID.
     * @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
     * @return uri the off-chain URI to the JSON metadata for the given Avastar
     */
    function tokenURI(uint _tokenId)
    external view
    returns (string memory uri);

    /**
     * @notice Get an Avastar's Wave by token ID.
     * @param _tokenId the token id of the given Avastar
     * @return wave the Avastar's wave (Prime/Replicant)
     */
    function getAvastarWaveByTokenId(uint256 _tokenId)
    external view
    returns (Wave wave);

    /**
     * @notice Get the Avastar Prime metadata associated with a given Token ID.
     * @param _tokenId the Token ID of the specified Prime
     * @return tokenId the Prime's token ID
     * @return serial the Prime's serial
     * @return traits the Prime's trait hash
     * @return generation the Prime's generation
     * @return series the Prime's series
     * @return gender the Prime's gender
     * @return ranking the Prime's ranking
     */
    function getPrimeByTokenId(uint256 _tokenId)
    external view
    returns (
        uint256 tokenId,
        uint256 serial,
        uint256 traits,
        Generation generation,
        Series series,
        Gender gender,
        uint8 ranking
    );

    /**
     * @notice Get the Avastar Replicant metadata associated with a given Token ID
     * @param _tokenId the token ID of the specified Replicant
     * @return tokenId the Replicant's token ID
     * @return serial the Replicant's serial
     * @return traits the Replicant's trait hash
     * @return generation the Replicant's generation
     * @return gender the Replicant's gender
     * @return ranking the Replicant's ranking
     */
    function getReplicantByTokenId(uint256 _tokenId)
    external view
    returns (
        uint256 tokenId,
        uint256 serial,
        uint256 traits,
        Generation generation,
        Gender gender,
        uint8 ranking
    );

    /**
     * @notice Retrieve a Trait's info by ID.
     * @param _traitId the ID of the Trait to retrieve
     * @return id the ID of the trait
     * @return generation generation of the trait
     * @return series list of series the trait may appear in
     * @return gender gender(s) the trait is valid for
     * @return gene gene the trait belongs to
     * @return variation variation of the gene the trait represents
     * @return rarity the rarity level of this trait
     * @return name name of the trait
     */
    function getTraitInfoById(uint256 _traitId)
    external view
    returns (
        uint256 id,
        Generation generation,
        Series[] memory series,
        Gender gender,
        Gene gene,
        Rarity rarity,
        uint8 variation,
        string memory name
    );


    /**
     * @notice Retrieve a Trait's name by ID.
     * @param _traitId the ID of the Trait to retrieve
     * @return name name of the trait
     */
    function getTraitNameById(uint256 _traitId)
    external view
    returns (string memory name);

    /**
     * @notice Get Trait ID by Generation, Gene, and Variation.
     * @param _generation the generation the trait belongs to
     * @param _gene gene the trait belongs to
     * @param _variation the variation of the gene
     * @return traitId the ID of the specified trait
     */
    function getTraitIdByGenerationGeneAndVariation(
        Generation _generation,
        Gene _gene,
        uint8 _variation
    )
    external view
    returns (uint256 traitId);

    /**
     * @notice Get the artist Attribution for a given Generation, combined into a single string.
     * @param _generation the generation to retrieve artist attribution for
     * @return attribution a single string with the artist and artist info URI
     */
    function getAttributionByGeneration(Generation _generation)
    external view
    returns (
        string memory attribution
    );

    /**
     * @notice Mint an Avastar Prime
     * Only invokable by minter role, when contract is not paused.
     * If successful, emits a `NewPrime` event.
     * @param _owner the address of the new Avastar's owner
     * @param _traits the new Prime's trait hash
     * @param _generation the new Prime's generation
     * @return _series the new Prime's series
     * @param _gender the new Prime's gender
     * @param _ranking the new Prime's rarity ranking
     * @return tokenId the newly minted Prime's token ID
     * @return serial the newly minted Prime's serial
     */
    function mintPrime(
        address _owner,
        uint256 _traits,
        Generation _generation,
        Series _series,
        Gender _gender,
        uint8 _ranking
    )
    external
    returns (uint256, uint256);

    /**
     * @notice Mint an Avastar Replicant.
     * Only invokable by minter role, when contract is not paused.
     * If successful, emits a `NewReplicant` event.
     * @param _owner the address of the new Avastar's owner
     * @param _traits the new Replicant's trait hash
     * @param _generation the new Replicant's generation
     * @param _gender the new Replicant's gender
     * @param _ranking the new Replicant's rarity ranking
     * @return tokenId the newly minted Replicant's token ID
     * @return serial the newly minted Replicant's serial
     */
    function mintReplicant(
        address _owner,
        uint256 _traits,
        Generation _generation,
        Gender _gender,
        uint8 _ranking
    )
    external
    returns (uint256, uint256);

    /**
     * Gets the owner of the specified token ID.
     * @param tokenId the token ID to search for the owner of
     * @return owner the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @notice Gets the total amount of tokens stored by the contract.
     * @return count total number of tokens
     */
    function totalSupply() public view returns (uint256 count);
}

// File: contracts/AvastarBase.sol

pragma solidity 0.5.14;

/**
 * @title Avastar Base
 * @author Cliff Hall
 * @notice Utilities used by descendant contracts
 */
contract AvastarBase {

    /**
     * @notice Convert a `uint` value to a `string`
     * via OraclizeAPI - MIT licence
     * https://github.com/provable-things/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol#L896
     * @param _i the `uint` value to be converted
     * @return result the `string` representation of the given `uint` value
     */
    function uintToStr(uint _i)
    internal pure
    returns (string memory result) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        result = string(bstr);
    }

    /**
     * @notice Concatenate two strings
     * @param _a the first string
     * @param _b the second string
     * @return result the concatenation of `_a` and `_b`
     */
    function strConcat(string memory _a, string memory _b)
    internal pure
    returns(string memory result) {
        result = string(abi.encodePacked(bytes(_a), bytes(_b)));
    }

}

// File: @openzeppelin/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    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];
    }
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/AccessControl.sol

pragma solidity 0.5.14;



/**
 * @title Access Control
 * @author Cliff Hall
 * @notice Role-based access control and contract upgrade functionality.
 */
contract AccessControl {

    using SafeMath for uint256;
    using SafeMath for uint16;
    using Roles for Roles.Role;

    Roles.Role private admins;
    Roles.Role private minters;
    Roles.Role private owners;

    /**
     * @notice Sets `msg.sender` as system admin by default.
     * Starts paused. System admin must unpause, and add other roles after deployment.
     */
    constructor() public {
        admins.add(msg.sender);
    }

    /**
     * @notice Emitted when contract is paused by system administrator.
     */
    event ContractPaused();

    /**
     * @notice Emitted when contract is unpaused by system administrator.
     */
    event ContractUnpaused();

    /**
     * @notice Emitted when contract is upgraded by system administrator.
     * @param newContract address of the new version of the contract.
     */
    event ContractUpgrade(address newContract);


    bool public paused = true;
    bool public upgraded = false;
    address public newContractAddress;

    /**
     * @notice Modifier to scope access to minters
     */
    modifier onlyMinter() {
        require(minters.has(msg.sender));
        _;
    }

    /**
     * @notice Modifier to scope access to owners
     */
    modifier onlyOwner() {
        require(owners.has(msg.sender));
        _;
    }

    /**
     * @notice Modifier to scope access to system administrators
     */
    modifier onlySysAdmin() {
        require(admins.has(msg.sender));
        _;
    }

    /**
     * @notice Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /**
     * @notice Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(paused);
        _;
    }

    /**
     * @notice Modifier to make a function callable only when the contract not upgraded.
     */
    modifier whenNotUpgraded() {
        require(!upgraded);
        _;
    }

    /**
     * @notice Called by a system administrator to  mark the smart contract as upgraded,
     * in case there is a serious breaking bug. This method stores the new contract
     * address and emits an event to that effect. Clients of the contract should
     * update to the new contract address upon receiving this event. This contract will
     * remain paused indefinitely after such an upgrade.
     * @param _newAddress address of new contract
     */
    function upgradeContract(address _newAddress) external onlySysAdmin whenPaused whenNotUpgraded {
        require(_newAddress != address(0));
        upgraded = true;
        newContractAddress = _newAddress;
        emit ContractUpgrade(_newAddress);
    }

    /**
     * @notice Called by a system administrator to add a minter.
     * Reverts if `_minterAddress` already has minter role
     * @param _minterAddress approved minter
     */
    function addMinter(address _minterAddress) external onlySysAdmin {
        minters.add(_minterAddress);
        require(minters.has(_minterAddress));
    }

    /**
     * @notice Called by a system administrator to add an owner.
     * Reverts if `_ownerAddress` already has owner role
     * @param _ownerAddress approved owner
     * @return added boolean indicating whether the role was granted
     */
    function addOwner(address _ownerAddress) external onlySysAdmin {
        owners.add(_ownerAddress);
        require(owners.has(_ownerAddress));
    }

    /**
     * @notice Called by a system administrator to add another system admin.
     * Reverts if `_sysAdminAddress` already has sysAdmin role
     * @param _sysAdminAddress approved owner
     */
    function addSysAdmin(address _sysAdminAddress) external onlySysAdmin {
        admins.add(_sysAdminAddress);
        require(admins.has(_sysAdminAddress));
    }

    /**
     * @notice Called by an owner to remove all roles from an address.
     * Reverts if address had no roles to be removed.
     * @param _address address having its roles stripped
     */
    function stripRoles(address _address) external onlyOwner {
        require(msg.sender != _address);
        bool stripped = false;
        if (admins.has(_address)) {
            admins.remove(_address);
            stripped = true;
        }
        if (minters.has(_address)) {
            minters.remove(_address);
            stripped = true;
        }
        if (owners.has(_address)) {
            owners.remove(_address);
            stripped = true;
        }
        require(stripped == true);
    }

    /**
     * @notice Called by a system administrator to pause, triggers stopped state
     */
    function pause() external onlySysAdmin whenNotPaused {
        paused = true;
        emit ContractPaused();
    }

    /**
     * @notice Called by a system administrator to un-pause, returns to normal state
     */
    function unpause() external onlySysAdmin whenPaused whenNotUpgraded {
        paused = false;
        emit ContractUnpaused();
    }

}

// File: contracts/AvastarMetadata.sol

pragma solidity 0.5.14;





/**
 * @title Avastar Metadata Generator
 * @author Cliff Hall
 * @notice Generate Avastar metadata from on-chain data.
 * Refers to the `AvastarTeleporter` for raw data to generate
 * the human and machine readable metadata for a given Avastar token Id.
 */
contract AvastarMetadata is AvastarBase, AvastarTypes, AccessControl {

    string public constant INVALID_TOKEN_ID = "Invalid Token ID";

    /**
     * @notice Event emitted when AvastarTeleporter contract is set
     * @param contractAddress the address of the AvastarTeleporter contract
     */
    event TeleporterContractSet(address contractAddress);

    /**
     * @notice Event emitted when TokenURI base changes
     * @param tokenUriBase the base URI for tokenURI calls
     */
    event TokenUriBaseSet(string tokenUriBase);

    /**
     * @notice Event emitted when the `mediaUriBase` is set.
     * Only emitted when the `mediaUriBase` is set after contract deployment.
     * @param mediaUriBase the new URI
     */
    event MediaUriBaseSet(string mediaUriBase);

    /**
     * @notice Event emitted when the `viewUriBase` is set.
     * Only emitted when the `viewUriBase` is set after contract deployment.
     * @param viewUriBase the new URI
     */
    event ViewUriBaseSet(string viewUriBase);

    /**
     * @notice Address of the AvastarTeleporter contract
     */
    IAvastarTeleporter private teleporterContract ;

    /**
     * @notice The base URI for an Avastar's off-chain metadata
     */
    string internal tokenUriBase;

    /**
     * @notice Base URI for an Avastar's off-chain image
     */
    string private mediaUriBase;

    /**
     * @notice Base URI to view an Avastar on the Avastars website
     */
    string private viewUriBase;

    /**
     * @notice Set the address of the `AvastarTeleporter` contract.
     * Only invokable by system admin role, when contract is paused and not upgraded.
     * To be used if the Teleporter contract has to be upgraded and a new instance deployed.
     * If successful, emits an `TeleporterContractSet` event.
     * @param _address address of `AvastarTeleporter` contract
     */
    function setTeleporterContract(address _address) external onlySysAdmin whenPaused whenNotUpgraded {

        // Cast the candidate contract to the IAvastarTeleporter interface
        IAvastarTeleporter candidateContract = IAvastarTeleporter(_address);

        // Verify that we have the appropriate address
        require(candidateContract.isAvastarTeleporter());

        // Set the contract address
        teleporterContract = IAvastarTeleporter(_address);

        // Emit the event
        emit TeleporterContractSet(_address);
    }

    /**
     * @notice Acknowledge contract is `AvastarMetadata`
     * @return always true
     */
    function isAvastarMetadata() external pure returns (bool) {return true;}

    /**
     * @notice Set the base URI for creating `tokenURI` for each Avastar.
     * Only invokable by system admin role, when contract is paused and not upgraded.
     * If successful, emits an `TokenUriBaseSet` event.
     * @param _tokenUriBase base for the ERC721 tokenURI
     */
    function setTokenUriBase(string calldata _tokenUriBase)
    external onlySysAdmin whenPaused whenNotUpgraded
    {
        // Set the base for metadata tokenURI
        tokenUriBase = _tokenUriBase;

        // Emit the event
        emit TokenUriBaseSet(_tokenUriBase);
    }

    /**
     * @notice Set the base URI for the image of each Avastar.
     * Only invokable by system admin role, when contract is paused and not upgraded.
     * If successful, emits an `MediaUriBaseSet` event.
     * @param _mediaUriBase base for the mediaURI shown in metadata for each Avastar
     */
    function setMediaUriBase(string calldata _mediaUriBase)
    external onlySysAdmin whenPaused whenNotUpgraded
    {
        // Set the base for metadata tokenURI
        mediaUriBase = _mediaUriBase;

        // Emit the event
        emit MediaUriBaseSet(_mediaUriBase);
    }

    /**
     * @notice Set the base URI for the image of each Avastar.
     * Only invokable by system admin role, when contract is paused and not upgraded.
     * If successful, emits an `MediaUriBaseSet` event.
     * @param _viewUriBase base URI for viewing an Avastar on the Avastars website
     */
    function setViewUriBase(string calldata _viewUriBase)
    external onlySysAdmin whenPaused whenNotUpgraded
    {
        // Set the base for metadata tokenURI
        viewUriBase = _viewUriBase;

        // Emit the event
        emit ViewUriBaseSet(_viewUriBase);
    }

    /**
     * @notice Get view URI for a given Avastar Token ID.
     * @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
     * @return uri the off-chain URI to view the Avastar on the Avastars website
     */
    function viewURI(uint _tokenId)
    public view
    returns (string memory uri)
    {
        require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);
        uri = strConcat(viewUriBase, uintToStr(_tokenId));
    }

    /**
     * @notice Get media URI for a given Avastar Token ID.
     * @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
     * @return uri the off-chain URI to the Avastar image
     */
    function mediaURI(uint _tokenId)
    public view
    returns (string memory uri)
    {
        require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);
        uri = strConcat(mediaUriBase, uintToStr(_tokenId));
    }

    /**
     * @notice Get token URI for a given Avastar Token ID.
     * @param _tokenId the Token ID of a previously minted Avastar Prime or Replicant
     * @return uri the Avastar's off-chain JSON metadata URI
     */
    function tokenURI(uint _tokenId)
    external view
    returns (string memory uri)
    {
        require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);
        uri = strConcat(tokenUriBase, uintToStr(_tokenId));
    }

    /**
     * @notice Get human-readable metadata for a given Avastar by Token ID.
     * @param _tokenId the token id of the given Avastar
     * @return metadata the Avastar's human-readable metadata
     */
    function getAvastarMetadata(uint256 _tokenId)
    external view
    returns (string memory metadata) {

        require(_tokenId < teleporterContract.totalSupply(), INVALID_TOKEN_ID);

        uint256 id;
        uint256 serial;
        uint256 traits;
        Generation generation;
        Wave wave;
        Series series;
        Gender gender;
        uint8 ranking;
        string memory attribution;

        // Get the Avastar
        wave = teleporterContract.getAvastarWaveByTokenId(_tokenId);

        // Get Prime or Replicant info depending on Avastar's Wave
        if (wave == Wave.PRIME) {
            (id, serial, traits, generation, series, gender, ranking) = teleporterContract.getPrimeByTokenId(_tokenId);
        } else {
            (id, serial, traits, generation, gender, ranking)  = teleporterContract.getReplicantByTokenId(_tokenId);
        }

        // Get artist attribution
        attribution = teleporterContract.getAttributionByGeneration(generation);
        attribution = strConcat('Original art by: ', attribution);

        // Name
        metadata = strConcat('{\n  "name": "Avastar #', uintToStr(uint8(id)));
        metadata = strConcat(metadata, '",\n');

        // Description: Generation
        metadata = strConcat(metadata, '  "description": "Generation ');
        metadata = strConcat(metadata, uintToStr(uint8(generation) + 1));

        // Description: Series (if 1-5)
        if (wave == Wave.PRIME && series != Series.PROMO) {
            metadata = strConcat(metadata, ' Series ');
            metadata = strConcat(metadata, uintToStr(uint8(series)));
        }

        // Description: Gender
        metadata = strConcat(metadata, (gender == Gender.MALE) ? ' Male ' : ' Female ');

        // Description: Founder, Exclusive, Prime, or Replicant
        if (wave == Wave.PRIME && series == Series.PROMO) {
            metadata = strConcat(metadata, (serial <100) ? 'Founder. ' : 'Exclusive. ');
        } else {
            metadata = strConcat(metadata, (wave == Wave.PRIME) ? 'Prime. ' : 'Replicant. ');
        }
        metadata = strConcat(metadata, attribution);
        metadata = strConcat(metadata, '",\n');

        // View URI
        metadata = strConcat(metadata, '  "external_url": "');
        metadata = strConcat(metadata, viewURI(_tokenId));
        metadata = strConcat(metadata, '",\n');

        // Media URI
        metadata = strConcat(metadata, '  "image": "');
        metadata = strConcat(metadata, mediaURI(_tokenId));
        metadata = strConcat(metadata, '",\n');

        // Attributes (ala OpenSea)
        metadata = strConcat(metadata, '  "attributes": [\n');

        // Gender
        metadata = strConcat(metadata, '    {\n');
        metadata = strConcat(metadata, '      "trait_type": "gender",\n');
        metadata = strConcat(metadata, '      "value": "');
        metadata = strConcat(metadata, (gender == Gender.MALE) ? 'male"' : 'female"');
        metadata = strConcat(metadata, '\n    },\n');

        // Wave
        metadata = strConcat(metadata, '    {\n');
        metadata = strConcat(metadata, '      "trait_type": "wave",\n');
        metadata = strConcat(metadata, '      "value": "');
        metadata = strConcat(metadata, (wave == Wave.PRIME) ? 'prime"' : 'replicant"');
        metadata = strConcat(metadata, '\n    },\n');

        // Generation
        metadata = strConcat(metadata, '    {\n');
        metadata = strConcat(metadata, '      "display_type": "number",\n');
        metadata = strConcat(metadata, '      "trait_type": "generation",\n');
        metadata = strConcat(metadata, '      "value": ');
        metadata = strConcat(metadata, uintToStr(uint8(generation) + 1));
        metadata = strConcat(metadata, '\n    },\n');

        // Series
        if (wave == Wave.PRIME) {
            metadata = strConcat(metadata, '    {\n');
            metadata = strConcat(metadata, '      "display_type": "number",\n');
            metadata = strConcat(metadata, '      "trait_type": "series",\n');
            metadata = strConcat(metadata, '      "value": ');
            metadata = strConcat(metadata, uintToStr(uint8(series)));
            metadata = strConcat(metadata, '\n    },\n');
        }

        // Serial
        metadata = strConcat(metadata, '    {\n');
        metadata = strConcat(metadata, '      "display_type": "number",\n');
        metadata = strConcat(metadata, '      "trait_type": "serial",\n');
        metadata = strConcat(metadata, '      "value": ');
        metadata = strConcat(metadata, uintToStr(serial));
        metadata = strConcat(metadata, '\n    },\n');

        // Ranking
        metadata = strConcat(metadata, '    {\n');
        metadata = strConcat(metadata, '      "display_type": "number",\n');
        metadata = strConcat(metadata, '      "trait_type": "ranking",\n');
        metadata = strConcat(metadata, '      "value": ');
        metadata = strConcat(metadata, uintToStr(ranking));
        metadata = strConcat(metadata, '\n    },\n');

        // Level
        metadata = strConcat(metadata, '    {\n');
        metadata = strConcat(metadata, '      "trait_type": "level",\n');
        metadata = strConcat(metadata, '      "value": "');
        metadata = strConcat(metadata, getRankingLevel(ranking));
        metadata = strConcat(metadata, '"\n    },\n');

        // Traits
        metadata = strConcat(metadata, assembleTraitMetadata(generation, traits));

        // Finish JSON object
        metadata = strConcat(metadata, '  ]\n}');

    }

    /**
     * @notice Get the rarity level for a given Avastar Rank
     * @param ranking the ranking level (1-100)
     * @return level the rarity level (Common, Uncommon, Rare, Epic, Legendary)
     */
    function getRankingLevel(uint8 ranking)
    internal pure
    returns (string memory level) {
        require(ranking >0 && ranking <=100);
        uint8[4] memory breaks = [33, 41, 50, 60];
        if (ranking < breaks[0]) {level = "Common";}
        else if (ranking < breaks[1]) {level = "Uncommon";}
        else if (ranking < breaks[2]) {level = "Rare";}
        else if (ranking < breaks[3]) {level = "Epic";}
        else {level = "Legendary";}
    }

    /**
     * @notice Assemble the human-readable metadata for a given Trait hash.
     * Used internally by
     * @param _generation the generation the Avastar belongs to
     * @param _traitHash the Avastar's trait hash
     * @return metdata the JSON trait metadata for the Avastar
     */
    function assembleTraitMetadata(Generation _generation, uint256 _traitHash)
    internal view
    returns (string memory metadata)
    {
        require(_traitHash > 0);
        uint256 slotConst = 256;
        uint256 slotMask = 255;
        uint256 bitMask;
        uint256 slottedValue;
        uint256 slotMultiplier;
        uint256 variation;
        uint256 traitId;

        // Iterate trait hash by Gene and assemble trait attribute data
        for (uint8 slot = 0; slot <= uint8(Gene.HAIR_STYLE); slot++){
            slotMultiplier = uint256(slotConst**slot);  // Create slot multiplier
            bitMask = slotMask * slotMultiplier;        // Create bit mask for slot
            slottedValue = _traitHash & bitMask;        // Extract slotted value from hash
            if (slottedValue > 0) {
                variation = (slot > 0)                  // Extract variation from slotted value
                ? slottedValue / slotMultiplier
                : slottedValue;
                if (variation > 0) {
                    traitId = teleporterContract.getTraitIdByGenerationGeneAndVariation(_generation, Gene(slot), uint8(variation));
                    metadata = strConcat(metadata, '    {\n');
                    metadata = strConcat(metadata, '      "trait_type": "');
                    if (slot == uint8(Gene.SKIN_TONE)) {
                        metadata = strConcat(metadata, 'skin_tone');
                    } else if (slot == uint8(Gene.HAIR_COLOR)) {
                        metadata = strConcat(metadata, 'hair_color');
                    } else if (slot == uint8(Gene.EYE_COLOR)) {
                        metadata = strConcat(metadata, 'eye_color');
                    } else if (slot == uint8(Gene.BG_COLOR)) {
                        metadata = strConcat(metadata, 'background_color');
                    } else if (slot == uint8(Gene.BACKDROP)) {
                        metadata = strConcat(metadata, 'backdrop');
                    } else if (slot == uint8(Gene.EARS)) {
                        metadata = strConcat(metadata, 'ears');
                    } else if (slot == uint8(Gene.FACE)) {
                        metadata = strConcat(metadata, 'face');
                    } else if (slot == uint8(Gene.NOSE)) {
                        metadata = strConcat(metadata, 'nose');
                    } else if (slot == uint8(Gene.MOUTH)) {
                        metadata = strConcat(metadata, 'mouth');
                    } else if (slot == uint8(Gene.FACIAL_FEATURE)) {
                        metadata = strConcat(metadata, 'facial_feature');
                    } else if (slot == uint8(Gene.EYES)) {
                        metadata = strConcat(metadata, 'eyes');
                    } else if (slot == uint8(Gene.HAIR_STYLE)) {
                        metadata = strConcat(metadata, 'hair_style');
                    }
                    metadata = strConcat(metadata, '",\n');
                    metadata = strConcat(metadata, '      "value": "');
                    metadata = strConcat(metadata, teleporterContract.getTraitNameById(traitId));
                    metadata = strConcat(metadata, '"\n    }');
                    if (slot < uint8(Gene.HAIR_STYLE))  metadata = strConcat(metadata, ',');
                    metadata = strConcat(metadata, '\n');

                }
            }
        }
    }

}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"mediaUriBase","type":"string"}],"name":"MediaUriBaseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"TeleporterContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenUriBase","type":"string"}],"name":"TokenUriBaseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"viewUriBase","type":"string"}],"name":"ViewUriBaseSet","type":"event"},{"constant":true,"inputs":[],"name":"INVALID_TOKEN_ID","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_ownerAddress","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_sysAdminAddress","type":"address"}],"name":"addSysAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAvastarMetadata","outputs":[{"internalType":"string","name":"metadata","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isAvastarMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mediaURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newContractAddress","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":[{"internalType":"string","name":"_mediaUriBase","type":"string"}],"name":"setMediaUriBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTeleporterContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_tokenUriBase","type":"string"}],"name":"setTokenUriBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_viewUriBase","type":"string"}],"name":"setViewUriBase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"stripRoles","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"upgradeContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgraded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]

608060405260038054600160ff199091161761ff00191690556200003160003362000037602090811b6200205d17901c565b6200012d565b6200004c82826001600160e01b03620000c416565b156200009f576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200010d5760405162461bcd60e51b815260040180806020018281038252602281526020018062002ca66022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b612b69806200013d6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638f8e854b116100ad578063c87b56dd11610071578063c87b56dd1461042d578063dc97f5741461044a578063e486b68114610467578063eb2c02231461046f578063eeb9bf05146104955761012c565b80638f8e854b1461033f578063983b2d56146103d15780639a3b58c9146103f7578063b49aa3b51461041d578063c28de2cd146104255761012c565b80635fdc4ec6116100f45780635fdc4ec6146102595780636533a6fc1461027f5780636af04a57146102ed5780637065cb48146103115780638456cb59146103375761012c565b80633bdafc43146101315780633f4ba83a146101595780634ea17ef2146101615780635bea607f146101cf5780635c975abb1461023d575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b03166104b2565b005b610157610577565b6101576004803603602081101561017757600080fd5b810190602081018135600160201b81111561019157600080fd5b8201836020820111156101a357600080fd5b803590602001918460018302840111600160201b831117156101c457600080fd5b5090925090506105ea565b610157600480360360208110156101e557600080fd5b810190602081018135600160201b8111156101ff57600080fd5b82018360208201111561021157600080fd5b803590602001918460018302840111600160201b8311171561023257600080fd5b509092509050610699565b610245610748565b604080519115158252519081900360200190f35b6101576004803603602081101561026f57600080fd5b50356001600160a01b0316610751565b6101576004803603602081101561029557600080fd5b810190602081018135600160201b8111156102af57600080fd5b8201836020820111156102c157600080fd5b803590602001918460018302840111600160201b831117156102e257600080fd5b509092509050610857565b6102f5610906565b604080516001600160a01b039092168252519081900360200190f35b6101576004803603602081101561032757600080fd5b50356001600160a01b031661091b565b610157610963565b61035c6004803603602081101561035557600080fd5b50356109c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039657818101518382015260200161037e565b50505050905090810190601f1680156103c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610157600480360360208110156103e757600080fd5b50356001600160a01b03166119e2565b6101576004803603602081101561040d57600080fd5b50356001600160a01b0316611a1e565b61035c611a5a565b610245611a86565b61035c6004803603602081101561044357600080fd5b5035611a94565b61035c6004803603602081101561046057600080fd5b5035611c27565b610245611d7b565b6101576004803603602081101561048557600080fd5b50356001600160a01b0316611d81565b61035c600480360360208110156104ab57600080fd5b5035611e3b565b6104c360023363ffffffff611f8f16565b6104cc57600080fd5b336001600160a01b03821614156104e257600080fd5b60006104f4818363ffffffff611f8f16565b1561050e5761050a60008363ffffffff611ff616565b5060015b61051f60018363ffffffff611f8f16565b156105395761053560018363ffffffff611ff616565b5060015b61054a60028363ffffffff611f8f16565b156105645761056060028363ffffffff611ff616565b5060015b60018115151461057357600080fd5b5050565b61058860003363ffffffff611f8f16565b61059157600080fd5b60035460ff166105a057600080fd5b600354610100900460ff16156105b557600080fd5b6003805460ff191690556040517f0e5e3b3fb504c22cf5c42fa07d521225937514c654007e1f12646f89768d6f9490600090a1565b6105fb60003363ffffffff611f8f16565b61060457600080fd5b60035460ff1661061357600080fd5b600354610100900460ff161561062857600080fd5b610634600783836129f9565b507f34c2bb88eea859654dad64c1ba2b28a3ea76b179b635d750a5b8d7ca092c1bb1828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6106aa60003363ffffffff611f8f16565b6106b357600080fd5b60035460ff166106c257600080fd5b600354610100900460ff16156106d757600080fd5b6106e3600683836129f9565b507f39859a3024bf53d50e0b0d5d0c56f098fadc7b96710cf0f277f302e1ae2c33fa828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b60035460ff1681565b61076260003363ffffffff611f8f16565b61076b57600080fd5b60035460ff1661077a57600080fd5b600354610100900460ff161561078f57600080fd5b6000819050806001600160a01b031663950699fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107cd57600080fd5b505afa1580156107e1573d6000803e3d6000fd5b505050506040513d60208110156107f757600080fd5b505161080257600080fd5b600480546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f703bc78725b2f16bafbf6232f3d5d610f25096a4a6b759fdbb5a46252d12108f9181900360200190a15050565b61086860003363ffffffff611f8f16565b61087157600080fd5b60035460ff1661088057600080fd5b600354610100900460ff161561089557600080fd5b6108a1600583836129f9565b507fd5136665992c6c23e622ac8866b41e520263e8197aabd6d13903819906bcd384828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6003546201000090046001600160a01b031681565b61092c60003363ffffffff611f8f16565b61093557600080fd5b61094660028263ffffffff61205d16565b61095760028263ffffffff611f8f16565b61096057600080fd5b50565b61097460003363ffffffff611f8f16565b61097d57600080fd5b60035460ff161561098d57600080fd5b6003805460ff191660011790556040517fab35696f06e428ebc5ceba8cd17f8fed287baf43440206d1943af1ee53e6d26790600090a1565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1557600080fd5b505afa158015610a29573d6000803e3d6000fd5b505050506040513d6020811015610a3f57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310610af35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ab8578181015183820152602001610aa0565b50505050905090810190601f168015610ae55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000806000806000806000806060600460009054906101000a90046001600160a01b03166001600160a01b031663b622528a8c6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b5b57600080fd5b505afa158015610b6f573d6000803e3d6000fd5b505050506040513d6020811015610b8557600080fd5b505194506000856001811115610b9757fe5b1415610c4a5760048054604080516306ea67cd60e11b81529283018e9052516001600160a01b0390911691630dd4cf9a9160248083019260e0929190829003018186803b158015610be757600080fd5b505afa158015610bfb573d6000803e3d6000fd5b505050506040513d60e0811015610c1157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a50985095509093509150610ceb565b60048054604080516332630d0d60e21b81529283018e9052516001600160a01b039091169163c98c34349160248083019260c0929190829003018186803b158015610c9457600080fd5b505afa158015610ca8573d6000803e3d6000fd5b505050506040513d60c0811015610cbe57600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b509950975090935091505b60048054604051630a68970560e11b81526001600160a01b03909116916314d12e0a9189919081019081908390811115610d2157fe5b60ff16815260200191505060006040518083038186803b158015610d4457600080fd5b505afa158015610d58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d8157600080fd5b8101908080516040519392919084600160201b821115610da057600080fd5b908301906020820185811115610db557600080fd5b8251600160201b811182820188101715610dce57600080fd5b82525081516020918201929091019080838360005b83811015610dfb578181015183820152602001610de3565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b506040525050509050610e6460405180604001604052806011815260200170027b934b3b4b730b61030b93a10313c9d1607d1b815250826120de565b9050610ea9604051806040016040528060168152602001757b0a2020226e616d65223a202241766173746172202360501b815250610ea48b60ff16612199565b6120de565b9950610ed08a6040518060400160405280600381526020016211160560e91b8152506120de565b9950610f118a6040518060400160405280601d81526020017f2020226465736372697074696f6e223a202247656e65726174696f6e200000008152506120de565b9950610f318a610ea4886004811115610f2657fe5b60010160ff16612199565b99506000856001811115610f4157fe5b148015610f5a57506000846005811115610f5757fe5b14155b15610fa957610f898a6040518060400160405280600881526020016701029b2b934b2b9960c51b8152506120de565b9950610fa68a610ea4866005811115610f9e57fe5b60ff16612199565b99505b61100a8a6001856002811115610fbb57fe5b14610fe657604051806040016040528060088152602001670102332b6b0b632960c51b815250610ea4565b6040518060400160405280600681526020016501026b0b632960d51b8152506120de565b9950600085600181111561101a57fe5b1480156110325750600084600581111561103057fe5b145b1561109a576110938a60648a1061106c576040518060400160405280600b81526020016a022bc31b63ab9b4bb3297160ad1b815250610ea4565b6040518060400160405280600981526020016802337bab73232b917160bd1b8152506120de565b9950611102565b6110ff8a60008760018111156110ac57fe5b146110da576040518060400160405280600b81526020016a02932b83634b1b0b73a17160ad1b815250610ea4565b604051806040016040528060078152602001660283934b6b297160cd1b8152506120de565b99505b61110c8a826120de565b99506111338a6040518060400160405280600381526020016211160560e91b8152506120de565b995061116a8a6040518060400160405280601381526020017210101132bc3a32b93730b62fbab936111d101160691b8152506120de565b99506111798a610ea48d611c27565b99506111a08a6040518060400160405280600381526020016211160560e91b8152506120de565b99506111d08a6040518060400160405280600c81526020016b10101134b6b0b3b2911d101160a11b8152506120de565b99506111df8a610ea48d611e3b565b99506112068a6040518060400160405280600381526020016211160560e91b8152506120de565b995061123c8a6040518060400160405280601281526020017110101130ba3a3934b13aba32b9911d102d8560711b8152506120de565b99506112668a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506112a78a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202267656e646572222c0a00008152506120de565b99506112db8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061133c8a60018560028111156112ef57fe5b1461131957604051806040016040528060078152602001663332b6b0b6329160c91b815250610ea4565b6040518060400160405280600581526020016436b0b6329160d91b8152506120de565b99506113688a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506113928a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506113d38a6040518060400160405280601c81526020017f2020202020202274726169745f74797065223a202277617665222c0a000000008152506120de565b99506114078a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061146c8a600087600181111561141b57fe5b14611448576040518060400160405280600a8152602001693932b83634b1b0b73a1160b11b815250610ea4565b60405180604001604052806006815260200165383934b6b29160d11b8152506120de565b99506114988a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506114c28a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506114f18a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506115158a604051806060016040528060228152602001612af3602291396120de565b99506115488a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061155d8a610ea4886004811115610f2657fe5b99506115898a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b9950600085600181111561159957fe5b14156116ae576115c78a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506115f68a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506116378a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a2022736572696573222c0a00008152506120de565b995061166a8a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061167f8a610ea4866005811115610f9e57fe5b99506116ab8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99505b6116d68a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506117058a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506117468a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202273657269616c222c0a00008152506120de565b99506117798a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506117888a610ea48a612199565b99506117b48a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506117de8a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061180d8a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b995061184e8a6040518060400160405280601f81526020017f2020202020202274726169745f74797065223a202272616e6b696e67222c0a008152506120de565b99506118818a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506118938a610ea48460ff16612199565b99506118bf8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506118e98a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061192a8a6040518060400160405280601d81526020017f2020202020202274726169745f74797065223a20226c6576656c222c0a0000008152506120de565b995061195e8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061196d8a610ea48461225c565b995061199a8a604051806040016040528060098152602001681105101010103e960560b91b8152506120de565b99506119aa8a610ea4888a6123b8565b99506119d38a6040518060400160405280600581526020016420205d0a7d60d81b8152506120de565b9b9a5050505050505050505050565b6119f360003363ffffffff611f8f16565b6119fc57600080fd5b611a0d60018263ffffffff61205d16565b61095760018263ffffffff611f8f16565b611a2f60003363ffffffff611f8f16565b611a3857600080fd5b611a4960008263ffffffff61205d16565b61095760008263ffffffff611f8f16565b6040518060400160405280601081526020016f125b9d985b1a5908151bdad95b88125160821b81525081565b600354610100900460ff1681565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae457600080fd5b505afa158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611b855760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b820191906000526020600020905b815481529060010190602001808311611bf657829003601f168201915b5050505050610ea484612199565b92915050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d6020811015611ca157600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611d185760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60015b90565b611d9260003363ffffffff611f8f16565b611d9b57600080fd5b60035460ff16611daa57600080fd5b600354610100900460ff1615611dbf57600080fd5b6001600160a01b038116611dd257600080fd5b6003805461010061ff00199091161762010000600160b01b031916620100006001600160a01b0384169081029190911790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305916020908290030190a150565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d6020811015611eb557600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611f2c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60006001600160a01b038216611fd65760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad16022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6120008282611f8f565b61203b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ab06021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6120678282611f8f565b156120b9576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b606082826040516020018083805190602001908083835b602083106121145780518252601f1990920191602091820191016120f5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061215c5780518252601f19909201916020918201910161213d565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b6060816121be57506040805180820190915260018152600360fc1b6020820152612257565b8160005b81156121d657600101600a820491506121c2565b6060816040519080825280601f01601f191660200182016040528015612203576020820181803883390190505b50905060001982015b851561225157600a860660300160f81b8282806001900393508151811061222f57fe5b60200101906001600160f81b031916908160001a905350600a8604955061220c565b50925050505b919050565b606060008260ff16118015612275575060648260ff1611155b61227e57600080fd5b612286612a77565b5060408051608081018252602180825260296020830152603292820192909252603c60608201529060ff841610156122de576040518060400160405280600681526020016521b7b6b6b7b760d11b81525091506123b2565b806001602002015160ff168360ff16101561231b57604051806040016040528060088152602001672ab731b7b6b6b7b760c11b81525091506123b2565b806002602002015160ff168360ff16101561235457604051806040016040528060048152602001635261726560e01b81525091506123b2565b806003602002015160ff168360ff16101561238d57604051806040016040528060048152602001634570696360e01b81525091506123b2565b604051806040016040528060098152602001684c6567656e6461727960b81b81525091505b50919050565b6060600082116123c757600080fd5b61010060ff600080808080805b600b60ff8216116129eb5760ff8116880a87810296508a87169550935084156129e35760008160ff16116124085784612413565b83858161241157fe5b045b925082156129e3576004546001600160a01b0316634001a2678c60ff8416600b81111561243c57fe5b866040518463ffffffff1660e01b81526004018084600481111561245c57fe5b60ff16815260200183600b81111561247057fe5b60ff1681526020018260ff1660ff168152602001935050505060206040518083038186803b1580156124a157600080fd5b505afa1580156124b5573d6000803e3d6000fd5b505050506040513d60208110156124cb57600080fd5b5051604080518082019091526006815265101010103d8560d11b60208201529092506124f8908a906120de565b98506125318960405180604001604052806015815260200174101010101010113a3930b4ba2fba3cb832911d101160591b8152506120de565b985060ff811661256d576125668960405180604001604052806009815260200168736b696e5f746f6e6560b81b8152506120de565b98506127c2565b60ff8116600114156125a557612566896040518060400160405280600a8152602001693430b4b92fb1b7b637b960b11b8152506120de565b60ff8116600214156125dc57612566896040518060400160405280600981526020016832bcb2afb1b7b637b960b91b8152506120de565b60ff81166003141561261a57612566896040518060400160405280601081526020016f3130b1b5b3b937bab7322fb1b7b637b960811b8152506120de565b60ff81166004141561265057612566896040518060400160405280600881526020016706261636b64726f760c41b8152506120de565b60ff8116600514156126825761256689604051806040016040528060048152602001636561727360e01b8152506120de565b60ff8116600614156126b45761256689604051806040016040528060048152602001636661636560e01b8152506120de565b60ff8116600714156126e65761256689604051806040016040528060048152602001636e6f736560e01b8152506120de565b60ff8116600814156127195761256689604051806040016040528060058152602001640dadeeae8d60db1b8152506120de565b60ff81166009141561275557612566896040518060400160405280600e81526020016d66616369616c5f6665617475726560901b8152506120de565b60ff8116600a14156127875761256689604051806040016040528060048152602001636579657360e01b8152506120de565b60ff8116600b14156127c2576127bf896040518060400160405280600a815260200169686169725f7374796c6560b01b8152506120de565b98505b6127e7896040518060400160405280600381526020016211160560e91b8152506120de565b985061281b896040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b600480546040805163eaf3a9b960e01b815292830186905251929b5061295e928c926001600160a01b039092169163eaf3a9b9916024808301926000929190829003018186803b15801561286e57600080fd5b505afa158015612882573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128ab57600080fd5b8101908080516040519392919084600160201b8211156128ca57600080fd5b9083019060208201858111156128df57600080fd5b8251600160201b8111828201881017156128f857600080fd5b82525081516020918201929091019080838360005b8381101561292557818101518382015260200161290d565b50505050905090810190601f1680156129525780820380516001836020036101000a031916815260200191505b506040525050506120de565b98506129898960405180604001604052806007815260200166220a202020207d60c81b8152506120de565b9850600b60ff821610156129bd576129ba89604051806040016040528060018152602001600b60fa1b8152506120de565b98505b6129e089604051806040016040528060018152602001600560f91b8152506120de565b98505b6001016123d4565b505050505050505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a3a5782800160ff19823516178555612a67565b82800160010185558215612a67579182015b82811115612a67578235825591602001919060010190612a4c565b50612a73929150612a95565b5090565b60405180608001604052806004906020820280388339509192915050565b611d7e91905b80821115612a735760008155600101612a9b56fe526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f20616464726573732020202020202274726169745f74797065223a202267656e65726174696f6e222c0a20202020202022646973706c61795f74797065223a20226e756d626572222c0aa265627a7a72315820e7765bcd8b5d49a5a6c38427a5ac415d39905f83e91602aad980956129f8c5fa64736f6c634300050e0032526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80638f8e854b116100ad578063c87b56dd11610071578063c87b56dd1461042d578063dc97f5741461044a578063e486b68114610467578063eb2c02231461046f578063eeb9bf05146104955761012c565b80638f8e854b1461033f578063983b2d56146103d15780639a3b58c9146103f7578063b49aa3b51461041d578063c28de2cd146104255761012c565b80635fdc4ec6116100f45780635fdc4ec6146102595780636533a6fc1461027f5780636af04a57146102ed5780637065cb48146103115780638456cb59146103375761012c565b80633bdafc43146101315780633f4ba83a146101595780634ea17ef2146101615780635bea607f146101cf5780635c975abb1461023d575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b03166104b2565b005b610157610577565b6101576004803603602081101561017757600080fd5b810190602081018135600160201b81111561019157600080fd5b8201836020820111156101a357600080fd5b803590602001918460018302840111600160201b831117156101c457600080fd5b5090925090506105ea565b610157600480360360208110156101e557600080fd5b810190602081018135600160201b8111156101ff57600080fd5b82018360208201111561021157600080fd5b803590602001918460018302840111600160201b8311171561023257600080fd5b509092509050610699565b610245610748565b604080519115158252519081900360200190f35b6101576004803603602081101561026f57600080fd5b50356001600160a01b0316610751565b6101576004803603602081101561029557600080fd5b810190602081018135600160201b8111156102af57600080fd5b8201836020820111156102c157600080fd5b803590602001918460018302840111600160201b831117156102e257600080fd5b509092509050610857565b6102f5610906565b604080516001600160a01b039092168252519081900360200190f35b6101576004803603602081101561032757600080fd5b50356001600160a01b031661091b565b610157610963565b61035c6004803603602081101561035557600080fd5b50356109c5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039657818101518382015260200161037e565b50505050905090810190601f1680156103c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610157600480360360208110156103e757600080fd5b50356001600160a01b03166119e2565b6101576004803603602081101561040d57600080fd5b50356001600160a01b0316611a1e565b61035c611a5a565b610245611a86565b61035c6004803603602081101561044357600080fd5b5035611a94565b61035c6004803603602081101561046057600080fd5b5035611c27565b610245611d7b565b6101576004803603602081101561048557600080fd5b50356001600160a01b0316611d81565b61035c600480360360208110156104ab57600080fd5b5035611e3b565b6104c360023363ffffffff611f8f16565b6104cc57600080fd5b336001600160a01b03821614156104e257600080fd5b60006104f4818363ffffffff611f8f16565b1561050e5761050a60008363ffffffff611ff616565b5060015b61051f60018363ffffffff611f8f16565b156105395761053560018363ffffffff611ff616565b5060015b61054a60028363ffffffff611f8f16565b156105645761056060028363ffffffff611ff616565b5060015b60018115151461057357600080fd5b5050565b61058860003363ffffffff611f8f16565b61059157600080fd5b60035460ff166105a057600080fd5b600354610100900460ff16156105b557600080fd5b6003805460ff191690556040517f0e5e3b3fb504c22cf5c42fa07d521225937514c654007e1f12646f89768d6f9490600090a1565b6105fb60003363ffffffff611f8f16565b61060457600080fd5b60035460ff1661061357600080fd5b600354610100900460ff161561062857600080fd5b610634600783836129f9565b507f34c2bb88eea859654dad64c1ba2b28a3ea76b179b635d750a5b8d7ca092c1bb1828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6106aa60003363ffffffff611f8f16565b6106b357600080fd5b60035460ff166106c257600080fd5b600354610100900460ff16156106d757600080fd5b6106e3600683836129f9565b507f39859a3024bf53d50e0b0d5d0c56f098fadc7b96710cf0f277f302e1ae2c33fa828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b60035460ff1681565b61076260003363ffffffff611f8f16565b61076b57600080fd5b60035460ff1661077a57600080fd5b600354610100900460ff161561078f57600080fd5b6000819050806001600160a01b031663950699fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107cd57600080fd5b505afa1580156107e1573d6000803e3d6000fd5b505050506040513d60208110156107f757600080fd5b505161080257600080fd5b600480546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f703bc78725b2f16bafbf6232f3d5d610f25096a4a6b759fdbb5a46252d12108f9181900360200190a15050565b61086860003363ffffffff611f8f16565b61087157600080fd5b60035460ff1661088057600080fd5b600354610100900460ff161561089557600080fd5b6108a1600583836129f9565b507fd5136665992c6c23e622ac8866b41e520263e8197aabd6d13903819906bcd384828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b6003546201000090046001600160a01b031681565b61092c60003363ffffffff611f8f16565b61093557600080fd5b61094660028263ffffffff61205d16565b61095760028263ffffffff611f8f16565b61096057600080fd5b50565b61097460003363ffffffff611f8f16565b61097d57600080fd5b60035460ff161561098d57600080fd5b6003805460ff191660011790556040517fab35696f06e428ebc5ceba8cd17f8fed287baf43440206d1943af1ee53e6d26790600090a1565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1557600080fd5b505afa158015610a29573d6000803e3d6000fd5b505050506040513d6020811015610a3f57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310610af35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ab8578181015183820152602001610aa0565b50505050905090810190601f168015610ae55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000806000806000806000806060600460009054906101000a90046001600160a01b03166001600160a01b031663b622528a8c6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610b5b57600080fd5b505afa158015610b6f573d6000803e3d6000fd5b505050506040513d6020811015610b8557600080fd5b505194506000856001811115610b9757fe5b1415610c4a5760048054604080516306ea67cd60e11b81529283018e9052516001600160a01b0390911691630dd4cf9a9160248083019260e0929190829003018186803b158015610be757600080fd5b505afa158015610bfb573d6000803e3d6000fd5b505050506040513d60e0811015610c1157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a50985095509093509150610ceb565b60048054604080516332630d0d60e21b81529283018e9052516001600160a01b039091169163c98c34349160248083019260c0929190829003018186803b158015610c9457600080fd5b505afa158015610ca8573d6000803e3d6000fd5b505050506040513d60c0811015610cbe57600080fd5b508051602082015160408301516060840151608085015160a090950151939d50919b509950975090935091505b60048054604051630a68970560e11b81526001600160a01b03909116916314d12e0a9189919081019081908390811115610d2157fe5b60ff16815260200191505060006040518083038186803b158015610d4457600080fd5b505afa158015610d58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d8157600080fd5b8101908080516040519392919084600160201b821115610da057600080fd5b908301906020820185811115610db557600080fd5b8251600160201b811182820188101715610dce57600080fd5b82525081516020918201929091019080838360005b83811015610dfb578181015183820152602001610de3565b50505050905090810190601f168015610e285780820380516001836020036101000a031916815260200191505b506040525050509050610e6460405180604001604052806011815260200170027b934b3b4b730b61030b93a10313c9d1607d1b815250826120de565b9050610ea9604051806040016040528060168152602001757b0a2020226e616d65223a202241766173746172202360501b815250610ea48b60ff16612199565b6120de565b9950610ed08a6040518060400160405280600381526020016211160560e91b8152506120de565b9950610f118a6040518060400160405280601d81526020017f2020226465736372697074696f6e223a202247656e65726174696f6e200000008152506120de565b9950610f318a610ea4886004811115610f2657fe5b60010160ff16612199565b99506000856001811115610f4157fe5b148015610f5a57506000846005811115610f5757fe5b14155b15610fa957610f898a6040518060400160405280600881526020016701029b2b934b2b9960c51b8152506120de565b9950610fa68a610ea4866005811115610f9e57fe5b60ff16612199565b99505b61100a8a6001856002811115610fbb57fe5b14610fe657604051806040016040528060088152602001670102332b6b0b632960c51b815250610ea4565b6040518060400160405280600681526020016501026b0b632960d51b8152506120de565b9950600085600181111561101a57fe5b1480156110325750600084600581111561103057fe5b145b1561109a576110938a60648a1061106c576040518060400160405280600b81526020016a022bc31b63ab9b4bb3297160ad1b815250610ea4565b6040518060400160405280600981526020016802337bab73232b917160bd1b8152506120de565b9950611102565b6110ff8a60008760018111156110ac57fe5b146110da576040518060400160405280600b81526020016a02932b83634b1b0b73a17160ad1b815250610ea4565b604051806040016040528060078152602001660283934b6b297160cd1b8152506120de565b99505b61110c8a826120de565b99506111338a6040518060400160405280600381526020016211160560e91b8152506120de565b995061116a8a6040518060400160405280601381526020017210101132bc3a32b93730b62fbab936111d101160691b8152506120de565b99506111798a610ea48d611c27565b99506111a08a6040518060400160405280600381526020016211160560e91b8152506120de565b99506111d08a6040518060400160405280600c81526020016b10101134b6b0b3b2911d101160a11b8152506120de565b99506111df8a610ea48d611e3b565b99506112068a6040518060400160405280600381526020016211160560e91b8152506120de565b995061123c8a6040518060400160405280601281526020017110101130ba3a3934b13aba32b9911d102d8560711b8152506120de565b99506112668a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506112a78a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202267656e646572222c0a00008152506120de565b99506112db8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061133c8a60018560028111156112ef57fe5b1461131957604051806040016040528060078152602001663332b6b0b6329160c91b815250610ea4565b6040518060400160405280600581526020016436b0b6329160d91b8152506120de565b99506113688a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506113928a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506113d38a6040518060400160405280601c81526020017f2020202020202274726169745f74797065223a202277617665222c0a000000008152506120de565b99506114078a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061146c8a600087600181111561141b57fe5b14611448576040518060400160405280600a8152602001693932b83634b1b0b73a1160b11b815250610ea4565b60405180604001604052806006815260200165383934b6b29160d11b8152506120de565b99506114988a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506114c28a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506114f18a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506115158a604051806060016040528060228152602001612af3602291396120de565b99506115488a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061155d8a610ea4886004811115610f2657fe5b99506115898a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b9950600085600181111561159957fe5b14156116ae576115c78a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506115f68a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506116378a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a2022736572696573222c0a00008152506120de565b995061166a8a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b995061167f8a610ea4866005811115610f9e57fe5b99506116ab8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99505b6116d68a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b99506117058a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b99506117468a6040518060400160405280601e81526020017f2020202020202274726169745f74797065223a202273657269616c222c0a00008152506120de565b99506117798a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506117888a610ea48a612199565b99506117b48a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506117de8a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061180d8a604051806040016040528060208152602001600080516020612b158339815191528152506120de565b995061184e8a6040518060400160405280601f81526020017f2020202020202274726169745f74797065223a202272616e6b696e67222c0a008152506120de565b99506118818a6040518060400160405280600f81526020016e0101010101010113b30b63ab2911d1608d1b8152506120de565b99506118938a610ea48460ff16612199565b99506118bf8a6040518060400160405280600881526020016705101010103e960560c11b8152506120de565b99506118e98a60405180604001604052806006815260200165101010103d8560d11b8152506120de565b995061192a8a6040518060400160405280601d81526020017f2020202020202274726169745f74797065223a20226c6576656c222c0a0000008152506120de565b995061195e8a6040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b995061196d8a610ea48461225c565b995061199a8a604051806040016040528060098152602001681105101010103e960560b91b8152506120de565b99506119aa8a610ea4888a6123b8565b99506119d38a6040518060400160405280600581526020016420205d0a7d60d81b8152506120de565b9b9a5050505050505050505050565b6119f360003363ffffffff611f8f16565b6119fc57600080fd5b611a0d60018263ffffffff61205d16565b61095760018263ffffffff611f8f16565b611a2f60003363ffffffff611f8f16565b611a3857600080fd5b611a4960008263ffffffff61205d16565b61095760008263ffffffff611f8f16565b6040518060400160405280601081526020016f125b9d985b1a5908151bdad95b88125160821b81525081565b600354610100900460ff1681565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae457600080fd5b505afa158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611b855760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b820191906000526020600020905b815481529060010190602001808311611bf657829003601f168201915b5050505050610ea484612199565b92915050565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d6020811015611ca157600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611d185760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60015b90565b611d9260003363ffffffff611f8f16565b611d9b57600080fd5b60035460ff16611daa57600080fd5b600354610100900460ff1615611dbf57600080fd5b6001600160a01b038116611dd257600080fd5b6003805461010061ff00199091161762010000600160b01b031916620100006001600160a01b0384169081029190911790915560408051918252517f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa446199305916020908290030190a150565b6060600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8b57600080fd5b505afa158015611e9f573d6000803e3d6000fd5b505050506040513d6020811015611eb557600080fd5b505160408051808201909152601081526f125b9d985b1a5908151bdad95b88125160821b6020820152908310611f2c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610ab8578181015183820152602001610aa0565b5060068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152611c219390929091830182828015611c135780601f10611be857610100808354040283529160200191611c13565b60006001600160a01b038216611fd65760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad16022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6120008282611f8f565b61203b5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ab06021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6120678282611f8f565b156120b9576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b606082826040516020018083805190602001908083835b602083106121145780518252601f1990920191602091820191016120f5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061215c5780518252601f19909201916020918201910161213d565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b6060816121be57506040805180820190915260018152600360fc1b6020820152612257565b8160005b81156121d657600101600a820491506121c2565b6060816040519080825280601f01601f191660200182016040528015612203576020820181803883390190505b50905060001982015b851561225157600a860660300160f81b8282806001900393508151811061222f57fe5b60200101906001600160f81b031916908160001a905350600a8604955061220c565b50925050505b919050565b606060008260ff16118015612275575060648260ff1611155b61227e57600080fd5b612286612a77565b5060408051608081018252602180825260296020830152603292820192909252603c60608201529060ff841610156122de576040518060400160405280600681526020016521b7b6b6b7b760d11b81525091506123b2565b806001602002015160ff168360ff16101561231b57604051806040016040528060088152602001672ab731b7b6b6b7b760c11b81525091506123b2565b806002602002015160ff168360ff16101561235457604051806040016040528060048152602001635261726560e01b81525091506123b2565b806003602002015160ff168360ff16101561238d57604051806040016040528060048152602001634570696360e01b81525091506123b2565b604051806040016040528060098152602001684c6567656e6461727960b81b81525091505b50919050565b6060600082116123c757600080fd5b61010060ff600080808080805b600b60ff8216116129eb5760ff8116880a87810296508a87169550935084156129e35760008160ff16116124085784612413565b83858161241157fe5b045b925082156129e3576004546001600160a01b0316634001a2678c60ff8416600b81111561243c57fe5b866040518463ffffffff1660e01b81526004018084600481111561245c57fe5b60ff16815260200183600b81111561247057fe5b60ff1681526020018260ff1660ff168152602001935050505060206040518083038186803b1580156124a157600080fd5b505afa1580156124b5573d6000803e3d6000fd5b505050506040513d60208110156124cb57600080fd5b5051604080518082019091526006815265101010103d8560d11b60208201529092506124f8908a906120de565b98506125318960405180604001604052806015815260200174101010101010113a3930b4ba2fba3cb832911d101160591b8152506120de565b985060ff811661256d576125668960405180604001604052806009815260200168736b696e5f746f6e6560b81b8152506120de565b98506127c2565b60ff8116600114156125a557612566896040518060400160405280600a8152602001693430b4b92fb1b7b637b960b11b8152506120de565b60ff8116600214156125dc57612566896040518060400160405280600981526020016832bcb2afb1b7b637b960b91b8152506120de565b60ff81166003141561261a57612566896040518060400160405280601081526020016f3130b1b5b3b937bab7322fb1b7b637b960811b8152506120de565b60ff81166004141561265057612566896040518060400160405280600881526020016706261636b64726f760c41b8152506120de565b60ff8116600514156126825761256689604051806040016040528060048152602001636561727360e01b8152506120de565b60ff8116600614156126b45761256689604051806040016040528060048152602001636661636560e01b8152506120de565b60ff8116600714156126e65761256689604051806040016040528060048152602001636e6f736560e01b8152506120de565b60ff8116600814156127195761256689604051806040016040528060058152602001640dadeeae8d60db1b8152506120de565b60ff81166009141561275557612566896040518060400160405280600e81526020016d66616369616c5f6665617475726560901b8152506120de565b60ff8116600a14156127875761256689604051806040016040528060048152602001636579657360e01b8152506120de565b60ff8116600b14156127c2576127bf896040518060400160405280600a815260200169686169725f7374796c6560b01b8152506120de565b98505b6127e7896040518060400160405280600381526020016211160560e91b8152506120de565b985061281b896040518060400160405280601081526020016f101010101010113b30b63ab2911d101160811b8152506120de565b600480546040805163eaf3a9b960e01b815292830186905251929b5061295e928c926001600160a01b039092169163eaf3a9b9916024808301926000929190829003018186803b15801561286e57600080fd5b505afa158015612882573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156128ab57600080fd5b8101908080516040519392919084600160201b8211156128ca57600080fd5b9083019060208201858111156128df57600080fd5b8251600160201b8111828201881017156128f857600080fd5b82525081516020918201929091019080838360005b8381101561292557818101518382015260200161290d565b50505050905090810190601f1680156129525780820380516001836020036101000a031916815260200191505b506040525050506120de565b98506129898960405180604001604052806007815260200166220a202020207d60c81b8152506120de565b9850600b60ff821610156129bd576129ba89604051806040016040528060018152602001600b60fa1b8152506120de565b98505b6129e089604051806040016040528060018152602001600560f91b8152506120de565b98505b6001016123d4565b505050505050505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a3a5782800160ff19823516178555612a67565b82800160010185558215612a67579182015b82811115612a67578235825591602001919060010190612a4c565b50612a73929150612a95565b5090565b60405180608001604052806004906020820280388339509192915050565b611d7e91905b80821115612a735760008155600101612a9b56fe526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f20616464726573732020202020202274726169745f74797065223a202267656e65726174696f6e222c0a20202020202022646973706c61795f74797065223a20226e756d626572222c0aa265627a7a72315820e7765bcd8b5d49a5a6c38427a5ac415d39905f83e91602aad980956129f8c5fa64736f6c634300050e0032

Deployed Bytecode Sourcemap

22485:16205:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22485:16205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21136:525;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21136:525:0;-1:-1:-1;;;;;21136:525:0;;:::i;:::-;;21998:135;;;:::i;26664:278::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26664:278:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26664:278:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26664:278:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;26664:278:0;;-1:-1:-1;26664:278:0;-1:-1:-1;26664:278:0;:::i;26062:284::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26062:284:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26062:284:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26062:284:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;26062:284:0;;-1:-1:-1;26062:284:0;-1:-1:-1;26062:284:0;:::i;17868:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;24417:554;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24417:554:0;-1:-1:-1;;;;;24417:554:0;;:::i;25458:284::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25458:284:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;25458:284:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25458:284:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;25458:284:0;;-1:-1:-1;25458:284:0;-1:-1:-1;25458:284:0;:::i;17935:33::-;;;:::i;:::-;;;;-1:-1:-1;;;;;17935:33:0;;;;;;;;;;;;;;20394:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20394:152:0;-1:-1:-1;;;;;20394:152:0;;:::i;21769:117::-;;;:::i;28601:5660::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28601:5660:0;;:::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;28601:5660:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19972:158;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19972:158:0;-1:-1:-1;;;;;19972:158:0;;:::i;20761:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20761:164:0;-1:-1:-1;;;;;20761:164:0;;:::i;22563:60::-;;;:::i;17900:28::-;;;:::i;28137:240::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28137:240:0;;:::i;27196:236::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27196:236:0;;:::i;25083:72::-;;;:::i;19513:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19513:261:0;-1:-1:-1;;;;;19513:261:0;;:::i;27664:238::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27664:238:0;;:::i;21136:525::-;18249:22;:6;18260:10;18249:22;:10;:22;:::i;:::-;18241:31;;;;;;21212:10;-1:-1:-1;;;;;21212:22:0;;;;21204:31;;;;;;21246:13;21282:20;21246:13;21293:8;21282:20;:10;:20;:::i;:::-;21278:106;;;21319:23;:6;21333:8;21319:23;:13;:23;:::i;:::-;-1:-1:-1;21368:4:0;21278:106;21398:21;:7;21410:8;21398:21;:11;:21;:::i;:::-;21394:108;;;21436:24;:7;21451:8;21436:24;:14;:24;:::i;:::-;-1:-1:-1;21486:4:0;21394:108;21516:20;:6;21527:8;21516:20;:10;:20;:::i;:::-;21512:106;;;21553:23;:6;21567:8;21553:23;:13;:23;:::i;:::-;-1:-1:-1;21602:4:0;21512:106;21648:4;21636:16;;;;21628:25;;;;;;18283:1;21136:525;:::o;21998:135::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;22077:6;:14;;-1:-1:-1;;22077:14:0;;;22107:18;;;;22086:5;;22107:18;21998:135::o;26664:278::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;26835:26;:11;26849:12;;26835:26;:::i;:::-;;26906:28;26921:12;;26906:28;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;26906:28:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;26906:28:0;;;;-1:-1:-1;26906:28:0;;-1:-1:-1;;;;26906:28:0;26664:278;;:::o;26062:284::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;26235:28;:12;26250:13;;26235:28;:::i;:::-;;26308:30;26324:13;;26308:30;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;26308:30:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;26308:30:0;;;;-1:-1:-1;26308:30:0;;-1:-1:-1;;;;26308:30:0;26062:284;;:::o;17868:25::-;;;;;;:::o;24417:554::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;24604:36;24662:8;24604:67;;24748:17;-1:-1:-1;;;;;24748:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24748:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24748:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24748:39:0;24740:48;;;;;;24838:18;:49;;-1:-1:-1;;;;;24838:49:0;;-1:-1:-1;;;;;;24838:49:0;;;;;;;;24932:31;;;;;;;;;;;;;;;;19023:1;24417:554;:::o;25458:284::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;25631:28;:12;25646:13;;25631:28;:::i;:::-;;25704:30;25720:13;;25704:30;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;25704:30:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;25704:30:0;;;;-1:-1:-1;25704:30:0;;-1:-1:-1;;;;25704:30:0;25458:284;;:::o;17935:33::-;;;;;;-1:-1:-1;;;;;17935:33:0;;:::o;20394:152::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;20468:25;:6;20479:13;20468:25;:10;:25;:::i;:::-;20512;:6;20523:13;20512:25;:10;:25;:::i;:::-;20504:34;;;;;;20394:152;:::o;21769:117::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18632:6;;;;18631:7;18623:16;;;;;;21833:6;:13;;-1:-1:-1;;21833:13:0;21842:4;21833:13;;;21862:16;;;;21833:6;;21862:16;21769:117::o;28601:5660::-;28680:22;28736:18;;;;;;;;;-1:-1:-1;;;;;28736:18:0;-1:-1:-1;;;;;28736:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28736:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28736:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28736:32:0;28770:16;;;;;;;;;;;;-1:-1:-1;;;28736:32:0;28770:16;;;;28725:43;;28717:70;;;;-1:-1:-1;;;28717:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;28717:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28800:10;28821:14;28846;28871:21;28903:9;28923:13;28947;28971;28995:25;29068:18;;;;;;;;;-1:-1:-1;;;;;29068:18:0;-1:-1:-1;;;;;29068:42:0;;29111:8;29068:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29068:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29068:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29068:52:0;;-1:-1:-1;29213:10:0;29205:4;:18;;;;;;;;;29201:293;;;29300:18;;;:46;;;-1:-1:-1;;;29300:46:0;;;;;;;;;-1:-1:-1;;;;;29300:18:0;;;;:36;;:46;;;;;;;;;;;;;;:18;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;29300:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29300:46:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29300:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29300:46:0;;-1:-1:-1;29300:46:0;;-1:-1:-1;29300:46:0;-1:-1:-1;29300:46:0;-1:-1:-1;29300:46:0;;-1:-1:-1;29300:46:0;-1:-1:-1;29201:293:0;;;29432:18;;;:50;;;-1:-1:-1;;;29432:50:0;;;;;;;;;-1:-1:-1;;;;;29432:18:0;;;;:40;;:50;;;;;;;;;;;;;;:18;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;29432:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29432:50:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29432:50:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29432:50:0;;-1:-1:-1;29432:50:0;-1:-1:-1;29432:50:0;-1:-1:-1;29432:50:0;;-1:-1:-1;29432:50:0;-1:-1:-1;29201:293:0;29555:18;;;:57;;-1:-1:-1;;;29555:57:0;;-1:-1:-1;;;;;29555:18:0;;;;:45;;29601:10;;29555:57;;;;;;29601:10;;29555:57;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29555:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29555:57:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;29555:57:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;29555:57:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;29555:57:0;;420:4:-1;411:14;;;;29555:57:0;;;;;411:14:-1;29555:57:0;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;29555:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29541:71;;29637:43;;;;;;;;;;;;;;-1:-1:-1;;;29637:43:0;;;29668:11;29637:9;:43::i;:::-;29623:57;;29721:58;;;;;;;;;;;;;;-1:-1:-1;;;29721:58:0;;;29758:20;29774:2;29758:20;;:9;:20::i;:::-;29721:9;:58::i;:::-;29710:69;;29801:27;29811:8;29801:27;;;;;;;;;;;;;-1:-1:-1;;;29801:27:0;;;:9;:27::i;:::-;29790:38;;29888:52;29898:8;29888:52;;;;;;;;;;;;;;;;;:9;:52::i;:::-;29877:63;;29962:53;29972:8;29982:32;29998:10;29992:17;;;;;;;;30012:1;29992:21;29982:32;;:9;:32::i;29962:53::-;29951:64;-1:-1:-1;30081:10:0;30073:4;:18;;;;;;;;;:44;;;;-1:-1:-1;30105:12:0;30095:6;:22;;;;;;;;;;30073:44;30069:190;;;30145:31;30155:8;30145:31;;;;;;;;;;;;;-1:-1:-1;;;30145:31:0;;;:9;:31::i;:::-;30134:42;;30202:45;30212:8;30222:24;30238:6;30232:13;;;;;;;;30222:24;;:9;:24::i;30202:45::-;30191:56;;30069:190;30314:68;30324:8;30345:11;30335:6;:21;;;;;;;;;30334:47;;;;;;;;;;;;;;;-1:-1:-1;;;30334:47:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30334:47:0;;;30314:9;:68::i;:::-;30303:79;-1:-1:-1;30472:10:0;30464:4;:18;;;;;;;;;:44;;;;-1:-1:-1;30496:12:0;30486:6;:22;;;;;;;;;30464:44;30460:265;;;30536:64;30546:8;30565:3;30557:6;:11;30556:43;;;;;;;;;;;;;;;-1:-1:-1;;;30556:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30556:43:0;;;30536:9;:64::i;:::-;30525:75;;30460:265;;;30644:69;30654:8;30673:10;30665:4;:18;;;;;;;;;30664:48;;;;;;;;;;;;;;;-1:-1:-1;;;30664:48:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30664:48:0;;;30644:9;:69::i;:::-;30633:80;;30460:265;30746:32;30756:8;30766:11;30746:9;:32::i;:::-;30735:43;;30800:27;30810:8;30800:27;;;;;;;;;;;;;-1:-1:-1;;;30800:27:0;;;:9;:27::i;:::-;30789:38;;30872:42;30882:8;30872:42;;;;;;;;;;;;;-1:-1:-1;;;30872:42:0;;;:9;:42::i;:::-;30861:53;;30936:38;30946:8;30956:17;30964:8;30956:7;:17::i;30936:38::-;30925:49;;30996:27;31006:8;30996:27;;;;;;;;;;;;;-1:-1:-1;;;30996:27:0;;;:9;:27::i;:::-;30985:38;;31069:35;31079:8;31069:35;;;;;;;;;;;;;-1:-1:-1;;;31069:35:0;;;:9;:35::i;:::-;31058:46;;31126:39;31136:8;31146:18;31155:8;31146;:18::i;31126:39::-;31115:50;;31187:27;31197:8;31187:27;;;;;;;;;;;;;-1:-1:-1;;;31187:27:0;;;:9;:27::i;:::-;31176:38;;31275:42;31285:8;31275:42;;;;;;;;;;;;;-1:-1:-1;;;31275:42:0;;;:9;:42::i;:::-;31264:53;;31360:30;31370:8;31360:30;;;;;;;;;;;;;-1:-1:-1;;;31360:30:0;;;:9;:30::i;:::-;31349:41;;31412:54;31422:8;31412:54;;;;;;;;;;;;;;;;;:9;:54::i;:::-;31401:65;;31488:39;31498:8;31488:39;;;;;;;;;;;;;-1:-1:-1;;;31488:39:0;;;:9;:39::i;:::-;31477:50;-1:-1:-1;31549:66:0;31477:50;31580:11;31570:6;:21;;;;;;;;;31569:45;;;;;;;;;;;;;;;-1:-1:-1;;;31569:45:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31569:45:0;;;31549:9;:66::i;:::-;31538:77;;31637:33;31647:8;31637:33;;;;;;;;;;;;;-1:-1:-1;;;31637:33:0;;;:9;:33::i;:::-;31626:44;;31711:30;31721:8;31711:30;;;;;;;;;;;;;-1:-1:-1;;;31711:30:0;;;:9;:30::i;:::-;31700:41;;31763:52;31773:8;31763:52;;;;;;;;;;;;;;;;;:9;:52::i;:::-;31752:63;;31837:39;31847:8;31837:39;;;;;;;;;;;;;-1:-1:-1;;;31837:39:0;;;:9;:39::i;:::-;31826:50;-1:-1:-1;31898:67:0;31826:50;31927:10;31919:4;:18;;;;;;;;;31918:46;;;;;;;;;;;;;;;-1:-1:-1;;;31918:46:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31918:46:0;;;31898:9;:67::i;:::-;31887:78;;31987:33;31997:8;31987:33;;;;;;;;;;;;;-1:-1:-1;;;31987:33:0;;;:9;:33::i;:::-;31976:44;;32067:30;32077:8;32067:30;;;;;;;;;;;;;-1:-1:-1;;;32067:30:0;;;:9;:30::i;:::-;32056:41;;32119:56;32129:8;32119:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32119:56:0;;;:9;:56::i;:::-;32108:67;;32197:58;32207:8;32197:58;;;;;;;;;;;;;;;;;:9;:58::i;:::-;32186:69;;32277:38;32287:8;32277:38;;;;;;;;;;;;;-1:-1:-1;;;32277:38:0;;;:9;:38::i;:::-;32266:49;;32337:53;32347:8;32357:32;32373:10;32367:17;;;;;;;32337:53;32326:64;;32412:33;32422:8;32412:33;;;;;;;;;;;;;-1:-1:-1;;;32412:33:0;;;:9;:33::i;:::-;32401:44;-1:-1:-1;32489:10:0;32481:4;:18;;;;;;;;;32477:448;;;32527:30;32537:8;32527:30;;;;;;;;;;;;;-1:-1:-1;;;32527:30:0;;;:9;:30::i;:::-;32516:41;;32583:56;32593:8;32583:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32583:56:0;;;:9;:56::i;:::-;32572:67;;32665:54;32675:8;32665:54;;;;;;;;;;;;;;;;;:9;:54::i;:::-;32654:65;;32745:38;32755:8;32745:38;;;;;;;;;;;;;-1:-1:-1;;;32745:38:0;;;:9;:38::i;:::-;32734:49;;32809:45;32819:8;32829:24;32845:6;32839:13;;;;;;;32809:45;32798:56;;32880:33;32890:8;32880:33;;;;;;;;;;;;;-1:-1:-1;;;32880:33:0;;;:9;:33::i;:::-;32869:44;;32477:448;32967:30;32977:8;32967:30;;;;;;;;;;;;;-1:-1:-1;;;32967:30:0;;;:9;:30::i;:::-;32956:41;;33019:56;33029:8;33019:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33019:56:0;;;:9;:56::i;:::-;33008:67;;33097:54;33107:8;33097:54;;;;;;;;;;;;;;;;;:9;:54::i;:::-;33086:65;;33173:38;33183:8;33173:38;;;;;;;;;;;;;-1:-1:-1;;;33173:38:0;;;:9;:38::i;:::-;33162:49;;33233:38;33243:8;33253:17;33263:6;33253:9;:17::i;33233:38::-;33222:49;;33293:33;33303:8;33293:33;;;;;;;;;;;;;-1:-1:-1;;;33293:33:0;;;:9;:33::i;:::-;33282:44;;33370:30;33380:8;33370:30;;;;;;;;;;;;;-1:-1:-1;;;33370:30:0;;;:9;:30::i;:::-;33359:41;;33422:56;33432:8;33422:56;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33422:56:0;;;:9;:56::i;:::-;33411:67;;33500:55;33510:8;33500:55;;;;;;;;;;;;;;;;;:9;:55::i;:::-;33489:66;;33577:38;33587:8;33577:38;;;;;;;;;;;;;-1:-1:-1;;;33577:38:0;;;:9;:38::i;:::-;33566:49;;33637:39;33647:8;33657:18;33667:7;33657:18;;:9;:18::i;33637:39::-;33626:50;;33698:33;33708:8;33698:33;;;;;;;;;;;;;-1:-1:-1;;;33698:33:0;;;:9;:33::i;:::-;33687:44;;33773:30;33783:8;33773:30;;;;;;;;;;;;;-1:-1:-1;;;33773:30:0;;;:9;:30::i;:::-;33762:41;;33825:53;33835:8;33825:53;;;;;;;;;;;;;;;;;:9;:53::i;:::-;33814:64;;33900:39;33910:8;33900:39;;;;;;;;;;;;;-1:-1:-1;;;33900:39:0;;;:9;:39::i;:::-;33889:50;;33961:45;33971:8;33981:24;33997:7;33981:15;:24::i;33961:45::-;33950:56;;34028:34;34038:8;34028:34;;;;;;;;;;;;;-1:-1:-1;;;34028:34:0;;;:9;:34::i;:::-;34017:45;;34105:62;34115:8;34125:41;34147:10;34159:6;34125:21;:41::i;34105:62::-;34094:73;;34222:29;34232:8;34222:29;;;;;;;;;;;;;-1:-1:-1;;;34222:29:0;;;:9;:29::i;:::-;34211:40;28601:5660;-1:-1:-1;;;;;;;;;;;28601:5660:0:o;19972:158::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;20048:27;:7;20060:14;20048:27;:11;:27;:::i;:::-;20094;:7;20106:14;20094:27;:11;:27;:::i;20761:164::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;20841:28;:6;20852:16;20841:28;:10;:28;:::i;:::-;20888;:6;20899:16;20888:28;:10;:28;:::i;22563:60::-;;;;;;;;;;;;;;-1:-1:-1;;;22563:60:0;;;;:::o;17900:28::-;;;;;;;;;:::o;28137:240::-;28203:17;28257:18;;;;;;;;;-1:-1:-1;;;;;28257:18:0;-1:-1:-1;;;;;28257:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28257:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28257:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28257:32:0;28291:16;;;;;;;;;;;;-1:-1:-1;;;28257:32:0;28291:16;;;;28246:43;;28238:70;;;;-1:-1:-1;;;28238:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;28238:70:0;-1:-1:-1;28335:12:0;28325:44;;;;;;;;-1:-1:-1;;28325:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28335:12;;28325:44;;28335:12;28325:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28349:19;28359:8;28349:9;:19::i;28325:44::-;28319:50;28137:240;-1:-1:-1;;28137:240:0:o;27196:236::-;27259:17;27313:18;;;;;;;;;-1:-1:-1;;;;;27313:18:0;-1:-1:-1;;;;;27313:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27313:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27313:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27313:32:0;27347:16;;;;;;;;;;;;-1:-1:-1;;;27313:32:0;27347:16;;;;27302:43;;27294:70;;;;-1:-1:-1;;;27294:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;27294:70:0;-1:-1:-1;27391:11:0;27381:43;;;;;;;;-1:-1:-1;;27381:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27391:11;;27381:43;;27391:11;27381:43;;;;;;;;;;;;;;;;;;;;;;;;25083:72;25149:4;25083:72;;:::o;19513:261::-;18427:22;:6;18438:10;18427:22;:10;:22;:::i;:::-;18419:31;;;;;;18813:6;;;;18805:15;;;;;;19003:8;;;;;;;19002:9;18994:18;;;;;;-1:-1:-1;;;;;19627:25:0;;19619:34;;;;;;19664:8;:15;;;-1:-1:-1;;19664:15:0;;;;-1:-1:-1;;;;;;19690:32:0;;-1:-1:-1;;;;;19690:32:0;;;;;;;;;;;;19738:28;;;;;;;;;;;;;;;;;19513:261;:::o;27664:238::-;27728:17;27782:18;;;;;;;;;-1:-1:-1;;;;;27782:18:0;-1:-1:-1;;;;;27782:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27782:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27782:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27782:32:0;27816:16;;;;;;;;;;;;-1:-1:-1;;;27782:32:0;27816:16;;;;27771:43;;27763:70;;;;-1:-1:-1;;;27763:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;27763:70:0;-1:-1:-1;27860:12:0;27850:44;;;;;;;;-1:-1:-1;;27850:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27860:12;;27850:44;;27860:12;27850:44;;;;;;;;;;;;;;;;;;;;;;;;11010:203;11082:4;-1:-1:-1;;;;;11107:21:0;;11099:68;;;;-1:-1:-1;;;11099:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11185:20:0;:11;:20;;;;;;;;;;;;;;;11010:203::o;10732:183::-;10812:18;10816:4;10822:7;10812:3;:18::i;:::-;10804:64;;;;-1:-1:-1;;;10804:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10879:20:0;10902:5;10879:20;;;;;;;;;;;:28;;-1:-1:-1;;10879:28:0;;;10732:183::o;10474:178::-;10552:18;10556:4;10562:7;10552:3;:18::i;:::-;10551:19;10543:63;;;;;-1:-1:-1;;;10543:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10617:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;10617:27:0;10640:4;10617:27;;;10474:178::o;9955:183::-;10042:20;10114:2;10125;10091:38;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;10091:38:0;;;;;;;;;;-1:-1:-1;10091:38:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10091:38:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10091:38:0;;;10075:55;;9955:183;;;;:::o;9272:488::-;9333:20;9370:7;9366:50;;-1:-1:-1;9394:10:0;;;;;;;;;;;;-1:-1:-1;;;9394:10:0;;;;;;9366:50;9435:2;9426:6;9467:69;9474:6;;9467:69;;9497:5;;9522:2;9517:7;;;;9467:69;;;9546:17;9576:3;9566:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;9566:14:0;87:34:-1;135:17;;-1:-1;9566:14:0;-1:-1:-1;9546:34:0;-1:-1:-1;;;9600:7:0;;9618:103;9625:7;;9618:103;;9682:2;9677;:7;9672:2;:12;9661:25;;9649:4;9654:3;;;;;;;9649:9;;;;;;;;;;;:37;-1:-1:-1;;;;;9649:37:0;;;;;;;;-1:-1:-1;9707:2:0;9701:8;;;;9618:103;;;-1:-1:-1;9747:4:0;-1:-1:-1;;;9272:488:0;;;;:::o;34479:467::-;34552:19;34601:1;34592:7;:10;;;:27;;;;;34616:3;34606:7;:13;;;;34592:27;34584:36;;;;;;34631:22;;:::i;:::-;-1:-1:-1;34631:41:0;;;;;;;;34657:2;34631:41;;;34661:2;34631:41;;;;34665:2;34631:41;;;;;;;34669:2;34631:41;;;;;34687:19;;;;34683:256;;;34709:16;;;;;;;;;;;;;-1:-1:-1;;;34709:16:0;;;;;34683:256;;;34756:6;34763:1;34756:9;;;;34746:19;;:7;:19;;;34742:197;;;34768:18;;;;;;;;;;;;;-1:-1:-1;;;34768:18:0;;;;;34742:197;;;34817:6;34824:1;34817:9;;;;34807:19;;:7;:19;;;34803:136;;;34829:14;;;;;;;;;;;;;-1:-1:-1;;;34829:14:0;;;;;34803:136;;;34874:6;34881:1;34874:9;;;;34864:19;;:7;:19;;;34860:79;;;34886:14;;;;;;;;;;;;;-1:-1:-1;;;34886:14:0;;;;;34860:79;;;34918:19;;;;;;;;;;;;;-1:-1:-1;;;34918:19:0;;;;;34860:79;34479:467;;;;:::o;35256:3429::-;35364:22;35425:1;35412:10;:14;35404:23;;;;;;35458:3;35491;35438:17;;;;;;35724:2954;35759:15;35745:30;;;;35724:2954;;35824:15;;;;;35892:25;;;;-1:-1:-1;35982:20:0;;;;-1:-1:-1;35824:15:0;-1:-1:-1;36063:16:0;;36059:2608;;36120:1;36113:4;:8;;;36112:148;;36248:12;36112:148;;;36214:14;36199:12;:29;;;;;;36112:148;36100:160;-1:-1:-1;36283:13:0;;36279:2373;;36331:18;;-1:-1:-1;;;;;36331:18:0;:57;36389:11;36402:10;;;;;;;;;;;36420:9;36331:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36331:100:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36331:100:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36331:100:0;36465:30;;;;;;;;;;;;-1:-1:-1;;;36331:100:0;36465:30;;;36331:100;;-1:-1:-1;36465:30:0;;36475:8;;36465:9;:30::i;:::-;36454:41;;36529:44;36539:8;36529:44;;;;;;;;;;;;;-1:-1:-1;;;36529:44:0;;;:9;:44::i;:::-;36518:55;-1:-1:-1;36600:29:0;;;36596:1584;;36669:32;36679:8;36669:32;;;;;;;;;;;;;-1:-1:-1;;;36669:32:0;;;:9;:32::i;:::-;36658:43;;36596:1584;;;36735:30;;;36749:15;36735:30;36731:1449;;;36805:33;36815:8;36805:33;;;;;;;;;;;;;-1:-1:-1;;;36805:33:0;;;:9;:33::i;36731:1449::-;36872:29;;;36886:14;36872:29;36868:1312;;;36941:32;36951:8;36941:32;;;;;;;;;;;;;-1:-1:-1;;;36941:32:0;;;:9;:32::i;36868:1312::-;37007:28;;;37021:13;37007:28;37003:1177;;;37075:39;37085:8;37075:39;;;;;;;;;;;;;-1:-1:-1;;;37075:39:0;;;:9;:39::i;37003:1177::-;37148:28;;;37162:13;37148:28;37144:1036;;;37216:31;37226:8;37216:31;;;;;;;;;;;;;-1:-1:-1;;;37216:31:0;;;:9;:31::i;37144:1036::-;37281:24;;;37295:9;37281:24;37277:903;;;37345:27;37355:8;37345:27;;;;;;;;;;;;;-1:-1:-1;;;37345:27:0;;;:9;:27::i;37277:903::-;37406:24;;;37420:9;37406:24;37402:778;;;37470:27;37480:8;37470:27;;;;;;;;;;;;;-1:-1:-1;;;37470:27:0;;;:9;:27::i;37402:778::-;37531:24;;;37545:9;37531:24;37527:653;;;37595:27;37605:8;37595:27;;;;;;;;;;;;;-1:-1:-1;;;37595:27:0;;;:9;:27::i;37527:653::-;37656:25;;;37670:10;37656:25;37652:528;;;37721:28;37731:8;37721:28;;;;;;;;;;;;;-1:-1:-1;;;37721:28:0;;;:9;:28::i;37652:528::-;37783:34;;;37797:19;37783:34;37779:401;;;37857:37;37867:8;37857:37;;;;;;;;;;;;;-1:-1:-1;;;37857:37:0;;;:9;:37::i;37779:401::-;37928:24;;;37942:9;37928:24;37924:256;;;37992:27;38002:8;37992:27;;;;;;;;;;;;;-1:-1:-1;;;37992:27:0;;;:9;:27::i;37924:256::-;38053:30;;;38067:15;38053:30;38049:131;;;38123:33;38133:8;38123:33;;;;;;;;;;;;;-1:-1:-1;;;38123:33:0;;;:9;:33::i;:::-;38112:44;;38049:131;38213:27;38223:8;38213:27;;;;;;;;;;;;;-1:-1:-1;;;38213:27:0;;;:9;:27::i;:::-;38202:38;;38274:39;38284:8;38274:39;;;;;;;;;;;;;-1:-1:-1;;;38274:39:0;;;:9;:39::i;:::-;38367:18;;;:44;;;-1:-1:-1;;;38367:44:0;;;;;;;;;38263:50;;-1:-1:-1;38347:65:0;;38263:50;;-1:-1:-1;;;;;38367:18:0;;;;:35;;:44;;;;;:18;;:44;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;38367:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38367:44:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;38367:44:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;38367:44:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;38367:44:0;;420:4:-1;411:14;;;;38367:44:0;;;;;411:14:-1;38367:44:0;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;38367:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38347:9;:65::i;:::-;38336:76;;38446:31;38456:8;38446:31;;;;;;;;;;;;;-1:-1:-1;;;38446:31:0;;;:9;:31::i;:::-;38435:42;-1:-1:-1;38517:15:0;38504:29;;;;38500:71;;;38547:24;38557:8;38547:24;;;;;;;;;;;;;-1:-1:-1;;;38547:24:0;;;:9;:24::i;:::-;38536:35;;38500:71;38605:25;38615:8;38605:25;;;;;;;;;;;;;-1:-1:-1;;;38605:25:0;;;:9;:25::i;:::-;38594:36;;36279:2373;35777:6;;35724:2954;;;;35256:3429;;;;;;;;;;;:::o;22485:16205::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22485:16205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22485:16205:0;;;-1:-1:-1;22485:16205:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;22485:16205:0;;;-1:-1:-1;;22485:16205:0:o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://e7765bcd8b5d49a5a6c38427a5ac415d39905f83e91602aad980956129f8c5fa

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.