My Name Tag:
Not Available, login to update
[ Download CSV Export ]
OVERVIEW
Team & Advisors Time-lock Contract.Contract Name:
HEC_Team_Distribution
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-01-18 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.2; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Provides walletsrmation about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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 addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ 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 multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b, string memory errorMessage) 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, errorMessage); 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. */ 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Heroes Chained base TimeLock Contract. * */ abstract contract HEC_Base_Distribution is Ownable, ReentrancyGuard { /* ====== INCLUDES ====== */ using SafeMath for uint256; using SafeERC20 for IERC20; /* ====== CONSTANTS ====== */ uint256 internal constant SECONDS_PER_DAY = 24 * 60 * 60; /* ====== EVENTS ====== */ event RewardClaimed(address indexed user, uint256 amount); /* ====== VARIABLES ====== */ address public immutable HeC; uint256 internal totalDebt; bool internal STOPPED = false; mapping( address => uint256 ) public walletIndices; WalletInfo[] public wallets; /* ====== STRUCTS ====== */ struct WalletInfo { address recipient; uint256 unlockedBalance; uint256 lockedBalance; uint256 initialBalance; uint256 releaseAmountPerDay; uint256 claimableEpochTime; } /* ====== VIRTUAL FUNCTIONS ====== */ function getTGEEpochTime() internal virtual view returns(uint256); function getInitialContractBalance() internal virtual view returns(uint256); function getTGEUnlockPercentage() internal virtual view returns(uint256); function getCliffEndEpochTime() internal virtual view returns(uint256); function getVestingEndEpochTime() internal virtual view returns(uint256); /* ====== CONSTRUCTOR ====== */ constructor( address _hec) { require( _hec != address(0) ); HeC = _hec; totalDebt = 0; STOPPED = false; } /* ====== FUNCTIONS ====== */ /** @notice calculate and send claimable amount to the recipient as of call time */ function claim() external nonReentrant { require(STOPPED == false, "Contract is in suspended state."); require(getTGEEpochTime() > 0, "Contract not initialized yet."); require(wallets.length > 0, "No recipients found."); require(uint256(block.timestamp) > getTGEEpochTime(), "Request not valid."); uint256 index = walletIndices[msg.sender]; require(wallets[ index ].recipient == msg.sender, "Claim request is not valid."); require(wallets[ index ].lockedBalance.add( wallets[ index ].unlockedBalance ) > 0, "There is no balance left to claim."); uint256 valueToSendFromVesting = calculateClaimableAmountForVesting( index ); uint256 valueToSendFromTGE = wallets[ index ].unlockedBalance; uint256 valueToSendTOTAL = valueToSendFromVesting.add(valueToSendFromTGE); require( valueToSendTOTAL > 0, "There is no balance to claim at the moment."); uint256 vestingDayCount = calculateVestingDayCount( wallets[ index ].claimableEpochTime, uint256(block.timestamp) ); wallets[ index ].lockedBalance = wallets[ index ].lockedBalance.sub( valueToSendFromVesting ); wallets[ index ].unlockedBalance = wallets[ index ].unlockedBalance.sub( valueToSendFromTGE ); wallets[ index ].claimableEpochTime = wallets[ index ].claimableEpochTime.add( vestingDayCount.mul( SECONDS_PER_DAY ) ); totalDebt = totalDebt.sub( valueToSendTOTAL ); IERC20( HeC ).safeTransfer(msg.sender, valueToSendTOTAL); emit RewardClaimed( msg.sender, valueToSendTOTAL ); } /** @notice calculate and return claimable amount as of call time */ function claimable() external view returns (uint256) { require(STOPPED == false, "Contract is in suspended state."); require(getTGEEpochTime() > 0, "Contract not initialized yet."); require(wallets.length > 0, "No recipients found."); uint256 index = walletIndices[ msg.sender ]; require(wallets[ index ].recipient == msg.sender, "Request not valid."); if (uint256(block.timestamp) <= getTGEEpochTime()) return 0; return wallets[ index ].unlockedBalance.add( calculateClaimableAmountForVesting( index ) ); } /** @notice calculate claimable amount accoring to vesting conditions as of call time @param _index uint256 */ function calculateClaimableAmountForVesting( uint256 _index ) private view returns (uint256) { //initial value of current claimable time is the ending time of cliff/lock period //after first claim, this value is iterated forward by the time unit amount claimed. //Calculate the number of vesting days passed since the most recent claim time (or TGE time initially) //for instance, this calculations gives the number of days passed since last claim (or TGE time) //we use the number of seconds passed and divide it by number of seconds per day uint256 vestingDayCount = calculateVestingDayCount( wallets[ _index ].claimableEpochTime, uint256(block.timestamp) ); uint256 valueToSendFromVesting = wallets[ _index ].releaseAmountPerDay.mul( vestingDayCount ); //If claim time is after Vesting End Time, send all the remaining tokens. if (uint256(block.timestamp) > getVestingEndEpochTime()) valueToSendFromVesting = wallets[ _index ].lockedBalance; if ( valueToSendFromVesting > wallets[ _index ].lockedBalance ) { valueToSendFromVesting = wallets[ _index ].lockedBalance; } return valueToSendFromVesting; } /** @notice calculate number of days between given dates @param _start_time uint256 @param _end_time uint256 */ function calculateVestingDayCount( uint256 _start_time, uint256 _end_time ) private pure returns (uint256) { if (_end_time <= _start_time) return 0; return _end_time.sub(_start_time).div(SECONDS_PER_DAY); } /** @notice add a recipient to the contract. @param _recipient address @param _tokenAmount uint256 */ function _addRecipient( address _recipient, uint256 _tokenAmount ) private { uint256 index = walletIndices[ _recipient ]; if (wallets.length > 0) { if (index > 0) { require(false, "Address already in list."); //Force throw exception } else { require(_recipient != wallets[0].recipient, "Address already in list."); } } require( _recipient != address(0), "Recipient address cannot be empty." ); require( _tokenAmount > 0, "Token amount invalid." ); require(totalDebt.add(_tokenAmount) <= getInitialContractBalance(), "Cannot add this debt amount due to the balance of this Contract."); uint256 vestingDayCount = calculateVestingDayCount( getCliffEndEpochTime(), getVestingEndEpochTime() ); //This contract does not support cases where Cliff-End = Vesting-End, i.e. There's no vesting period require(vestingDayCount > 0, "Unexpected vesting day count."); uint256 _unlockedBalance = _tokenAmount.mul(getTGEUnlockPercentage()).div(100); uint256 _lockedBalance = _tokenAmount.sub(_unlockedBalance); uint256 _releaseAmountPerDay = _lockedBalance.div(vestingDayCount); wallets.push( WalletInfo({ recipient: _recipient, unlockedBalance: _unlockedBalance, lockedBalance: _lockedBalance, initialBalance: _tokenAmount, releaseAmountPerDay: _releaseAmountPerDay, claimableEpochTime: getCliffEndEpochTime() })); walletIndices[_recipient] = wallets.length.sub(1); totalDebt = totalDebt.add(_tokenAmount); } /** @notice remove a recipient from contract @param _recipient address */ function _removeRecipient( address _recipient ) private { uint256 _index = walletIndices[ _recipient ]; require( _recipient == wallets[ _index ].recipient, "Recipient index does not match." ); totalDebt = totalDebt.sub( wallets[ _index ].lockedBalance ).sub( wallets[ _index ].unlockedBalance ); wallets[ _index ].recipient = address(0); wallets[ _index ].releaseAmountPerDay = 0; wallets[ _index ].claimableEpochTime = 0; wallets[ _index ].initialBalance = 0; wallets[ _index ].unlockedBalance = 0; wallets[ _index ].lockedBalance = 0; delete walletIndices[ _recipient ]; } /** @notice batch add recipients to the contract. @param _recipients address[] @param _tokenAmounts uint256[] */ function addRecipients(address[] memory _recipients, uint256[] memory _tokenAmounts) external nonReentrant onlyOwner returns (bool) { require( _recipients.length == _tokenAmounts.length, "Array sizes do not match."); require( _recipients.length > 0, "Array cannot be empty."); for( uint256 i = 0; i < _recipients.length; i++ ) { _addRecipient( _recipients[i], _tokenAmounts[i] ); } return true; } /** @notice batch remove recipients from contract @param _recipients address[] */ function removeRecipients(address[] memory _recipients) external nonReentrant onlyOwner returns (bool) { require( _recipients.length > 0, "Array cannot be empty."); for( uint256 i = 0; i < _recipients.length; i++ ) { _removeRecipient( _recipients[i] ); } return true; } /** @notice withdrawal of remaining tokens in case of emergency conditions */ function emergencyWithdrawal() external nonReentrant onlyOwner { require(STOPPED, "Contract is not in suspended state."); uint256 total = IERC20( HeC ).balanceOf( address(this) ); IERC20( HeC ).safeTransfer(msg.sender, total); } /** @notice temporarily stop contract operations in case of emergency conditions */ function suspendOperations() external onlyOwner returns (bool) { STOPPED = true; return true; } /** @notice resume contract operations after emergency conditions */ function resumeOperations() external onlyOwner returns (bool) { STOPPED = false; return true; } /** @notice get remaining balance of this contract */ function getRemainingBalance() external view onlyOwner returns (uint256) { return IERC20( HeC ).balanceOf( address(this) ); } /** @notice return whether contract is suspended or not */ function isSuspended() external onlyOwner view returns (bool) { bool ret = STOPPED; return ret; } /** @notice get remaining debts of all recipients */ function getRemainingDebt() external view onlyOwner returns (uint256) { uint256 remainingBalance = 0; for( uint256 i = 0; i < wallets.length; i++ ) { remainingBalance = remainingBalance.add( wallets[i].lockedBalance ).add( wallets[i].unlockedBalance ); } return remainingBalance; } } /** * @dev Heroes Chained TimeLock Contract for Pre-Seed, Seed, Private, Team. * LP, Foundation and Community & Marketing Contracts. */ contract HEC_Team_Distribution is HEC_Base_Distribution { /* ====== INCLUDES ====== */ using SafeMath for uint256; //Properties - In accordance with Token Distribution Plan uint256 private INITIAL_CONTRACT_BALANCE = 0; //(X million tokens) uint256 private TGE_UNLOCK_PERCENTAGE = 0; //X% uint256 private TGE_EPOCH_TIME = 0; uint256 private CLIFF_END_EPOCH_TIME = 0; uint256 private VESTING_END_EPOCH_TIME = 0; /* ====== STRUCTS ====== */ struct ContractInfo { uint256 TGEEpochTime; uint256 CliffEndEpochTime; uint256 VestingEndEpochTime; uint256 TGEUnlockPercentage; uint256 InitialContractBalance; } /* ====== CONSTRUCTOR ====== */ constructor( address _hec ) HEC_Base_Distribution( _hec ) { require( _hec != address(0) ); } /* ====== FUNCTIONS ====== */ /** @notice get TGE, Cliff-End and Vesting-End and other properties */ function getContractInfo() external view onlyOwner returns ( ContractInfo memory ) { ContractInfo memory ret = ContractInfo({ TGEEpochTime: TGE_EPOCH_TIME, CliffEndEpochTime: CLIFF_END_EPOCH_TIME, VestingEndEpochTime: VESTING_END_EPOCH_TIME, TGEUnlockPercentage: TGE_UNLOCK_PERCENTAGE, InitialContractBalance: INITIAL_CONTRACT_BALANCE }); return ret; } function getTGEEpochTime() internal override view returns(uint256) { return TGE_EPOCH_TIME; } function getInitialContractBalance() internal override view returns(uint256) { return INITIAL_CONTRACT_BALANCE; } function getCliffEndEpochTime() internal override view returns(uint256){ return CLIFF_END_EPOCH_TIME; } function getVestingEndEpochTime() internal override view returns(uint256){ return VESTING_END_EPOCH_TIME; } function getTGEUnlockPercentage() internal override view returns(uint256){ return TGE_UNLOCK_PERCENTAGE; } /** @notice set TGE, Cliff-End and Vesting-End dates and initialize the contract. @param _TGEEpochTime uint256 @param _CliffEndEpochTime uint256 @param _VestingEndEpochTime uint256 */ function setContractProperties( uint256 _InitialContractBalance, uint256 _TGEEpochTime, uint256 _TGEUnlockPercentage, uint256 _CliffEndEpochTime, uint256 _VestingEndEpochTime ) external onlyOwner returns (bool) { require(STOPPED, "Contract is not in suspended state."); require(_InitialContractBalance > 0, "Initial Contract Balance should be greater than 0."); require(_TGEUnlockPercentage <= 20, "TGE Unlock Percentage cannot be greater than 20% per HeC Tokenomics."); if (TGE_EPOCH_TIME > 0) { require(IERC20( HeC ).balanceOf( address(this) ) == 0, "Contract already has tokens and TGE already set. Cannot change dates at this moment."); } require(_TGEEpochTime >= uint256(block.timestamp), "TGE time cannot be earlier than now."); require(_CliffEndEpochTime >= _TGEEpochTime, "Cliff End time cannot be earlier than TGE time."); require(_VestingEndEpochTime >= _CliffEndEpochTime, "Vesting End time cannot be earlier than Cliff End time."); TGE_EPOCH_TIME = _TGEEpochTime; CLIFF_END_EPOCH_TIME = _CliffEndEpochTime; VESTING_END_EPOCH_TIME = _VestingEndEpochTime; INITIAL_CONTRACT_BALANCE = _InitialContractBalance; TGE_UNLOCK_PERCENTAGE = _TGEUnlockPercentage; return true; } }
[{"inputs":[{"internalType":"address","name":"_hec","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"inputs":[],"name":"HeC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_tokenAmounts","type":"uint256[]"}],"name":"addRecipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractInfo","outputs":[{"components":[{"internalType":"uint256","name":"TGEEpochTime","type":"uint256"},{"internalType":"uint256","name":"CliffEndEpochTime","type":"uint256"},{"internalType":"uint256","name":"VestingEndEpochTime","type":"uint256"},{"internalType":"uint256","name":"TGEUnlockPercentage","type":"uint256"},{"internalType":"uint256","name":"InitialContractBalance","type":"uint256"}],"internalType":"struct HEC_Team_Distribution.ContractInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSuspended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"}],"name":"removeRecipients","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeOperations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_InitialContractBalance","type":"uint256"},{"internalType":"uint256","name":"_TGEEpochTime","type":"uint256"},{"internalType":"uint256","name":"_TGEUnlockPercentage","type":"uint256"},{"internalType":"uint256","name":"_CliffEndEpochTime","type":"uint256"},{"internalType":"uint256","name":"_VestingEndEpochTime","type":"uint256"}],"name":"setContractProperties","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"suspendOperations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletIndices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wallets","outputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"unlockedBalance","type":"uint256"},{"internalType":"uint256","name":"lockedBalance","type":"uint256"},{"internalType":"uint256","name":"initialBalance","type":"uint256"},{"internalType":"uint256","name":"releaseAmountPerDay","type":"uint256"},{"internalType":"uint256","name":"claimableEpochTime","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040526000600360006101000a81548160ff02191690831515021790555060006006556000600755600060085560006009556000600a553480156200004557600080fd5b5060405162004abc38038062004abc83398181016040528101906200006b91906200024e565b806200008c620000806200016b60201b60201c565b6200017360201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ce57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060006002819055506000600360006101000a81548160ff02191690831515021790555050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200016457600080fd5b50620002c8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200024881620002ae565b92915050565b6000602082840312156200026157600080fd5b6000620002718482850162000237565b91505092915050565b600062000287826200028e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002b9816200027a565b8114620002c557600080fd5b50565b60805160601c6147b26200030a600039600081816104bb015281816107b501528181610f4e015281816111ab0152818161125b015261143401526147b26000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063715018a6116100a25780639dd509cb116100715780639dd509cb146102b2578063a6e1d016146102e2578063af38d75714610300578063bf2a1c081461031e578063f2fde38b1461033c57610116565b8063715018a6146102375780637ad71f72146102415780637cc1f867146102765780638da5cb5b1461029457610116565b80634e71d92d116100e95780634e71d92d146101b7578063598f89fc146101c15780635b0a3843146101df578063639ab82f146101e95780636db9a96f1461021957610116565b806310764cd41461011b5780631d1309351461014b5780632fba2c85146101695780633b5784f614610187575b600080fd5b610135600480360381019061013091906131fe565b610358565b6040516101429190613859565b60405180910390f35b61015361069c565b6040516101609190613859565b60405180910390f35b610171610735565b60405161017e9190613c71565b60405180910390f35b6101a1600480360381019061019c91906130ad565b610861565b6040516101ae9190613c71565b60405180910390f35b6101bf610879565b005b6101c9610fee565b6040516101d69190613859565b60405180910390f35b6101e761108e565b005b61020360048036038101906101fe91906130d6565b6112a9565b6040516102109190613859565b60405180910390f35b610221611432565b60405161022e91906137b4565b60405180910390f35b61023f611456565b005b61025b600480360381019061025691906131ac565b6114de565b60405161026d969594939291906137f8565b60405180910390f35b61027e61154a565b60405161028b9190613c56565b60405180910390f35b61029c61160a565b6040516102a991906137b4565b60405180910390f35b6102cc60048036038101906102c79190613117565b611633565b6040516102d99190613859565b60405180910390f35b6102ea611842565b6040516102f79190613859565b60405180910390f35b6103086118e2565b6040516103159190613c71565b60405180910390f35b610326611b6d565b6040516103339190613c71565b60405180910390f35b610356600480360381019061035191906130ad565b611cd4565b005b6000610362611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661038061160a565b73ffffffffffffffffffffffffffffffffffffffff16146103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cd90613a96565b60405180910390fd5b600360009054906101000a900460ff16610425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041c90613ab6565b60405180910390fd5b60008611610468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045f90613af6565b60405180910390fd5b60148411156104ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a390613b96565b60405180910390fd5b600060085411156105a35760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161051291906137b4565b60206040518083038186803b15801561052a57600080fd5b505afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056291906131d5565b146105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059990613b16565b60405180910390fd5b5b428510156105e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dd90613a36565b60405180910390fd5b84831015610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062090613b76565b60405180910390fd5b8282101561066c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066390613896565b60405180910390fd5b846008819055508260098190555081600a8190555085600681905550836007819055506001905095945050505050565b60006106a6611dcc565b73ffffffffffffffffffffffffffffffffffffffff166106c461160a565b73ffffffffffffffffffffffffffffffffffffffff161461071a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190613a96565b60405180910390fd5b6000600360009054906101000a900460ff1690508091505090565b600061073f611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661075d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146107b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107aa90613a96565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161080c91906137b4565b60206040518083038186803b15801561082457600080fd5b505afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c91906131d5565b905090565b60046020528060005260406000206000915090505481565b600260015414156108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b690613bd6565b60405180910390fd5b600260018190555060001515600360009054906101000a900460ff1615151461091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a16565b60405180910390fd5b6000610927611dd4565b11610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906139f6565b60405180910390fd5b6000600580549050116109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613ad6565b60405180910390fd5b6109b7611dd4565b42116109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613976565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110610a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613956565b60405180910390fd5b6000610bc060058381548110610b54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015460058481548110610ba0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154611dde90919063ffffffff16565b11610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf7906138f6565b60405180910390fd5b6000610c0b82611e3c565b9050600060058381548110610c49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015490506000610c728284611dde90919063ffffffff16565b905060008111610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613a76565b60405180910390fd5b6000610d0e60058681548110610cf6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b9050610d6e8460058781548110610d4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015461204590919063ffffffff16565b60058681548110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550610e1b8360058781548110610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461204590919063ffffffff16565b60058681548110610e55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010181905550610edd610e83620151808361208f90919063ffffffff16565b60058781548110610ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050154611dde90919063ffffffff16565b60058681548110610f17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050181905550610f418260025461204590919063ffffffff16565b600281905550610f9233837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724183604051610fd89190613c71565b60405180910390a2505050505060018081905550565b6000610ff8611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661101661160a565b73ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390613a96565b60405180910390fd5b6001600360006101000a81548160ff0219169083151502179055506001905090565b600260015414156110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613bd6565b60405180910390fd5b60026001819055506110e4611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661110261160a565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90613a96565b60405180910390fd5b600360009054906101000a900460ff166111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90613ab6565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120291906137b4565b60206040518083038186803b15801561121a57600080fd5b505afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125291906131d5565b905061129f33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b5060018081905550565b6000600260015414156112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e890613bd6565b60405180910390fd5b6002600181905550611301611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661131f61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613a96565b60405180910390fd5b60008251116113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906138b6565b60405180910390fd5b60005b82518110156114215761140e838281518110611401577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612190565b808061141990613efc565b9150506113bc565b506001905060018081905550919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61145e611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661147c61160a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613a96565b60405180910390fd5b6114dc60006125d7565b565b600581815481106114ee57600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b611552612efe565b61155a611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661157861160a565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590613a96565b60405180910390fd5b60006040518060a0016040528060085481526020016009548152602001600a548152602001600754815260200160065481525090508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002600154141561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613bd6565b60405180910390fd5b600260018190555061168b611dcc565b73ffffffffffffffffffffffffffffffffffffffff166116a961160a565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613a96565b60405180910390fd5b8151835114611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613c36565b60405180910390fd5b6000835111611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906138b6565b60405180910390fd5b60005b83518110156118305761181d8482815181106117cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110611810577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161269b565b808061182890613efc565b91505061178a565b50600190506001808190555092915050565b600061184c611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661186a61160a565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a96565b60405180910390fd5b6000600360006101000a81548160ff0219169083151502179055506001905090565b6000801515600360009054906101000a900460ff16151514611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090613a16565b60405180910390fd5b6000611943611dd4565b11611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a906139f6565b60405180910390fd5b6000600580549050116119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613ad6565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110611a60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90613976565b60405180910390fd5b611af0611dd4565b4211611b00576000915050611b6a565b611b66611b0c82611e3c565b60058381548110611b46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611dde90919063ffffffff16565b9150505b90565b6000611b77611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611b9561160a565b73ffffffffffffffffffffffffffffffffffffffff1614611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613a96565b60405180910390fd5b6000805b600580549050811015611ccc57611cb760058281548110611c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611ca960058481548110611c88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015485611dde90919063ffffffff16565b611dde90919063ffffffff16565b91508080611cc490613efc565b915050611bef565b508091505090565b611cdc611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611cfa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4790613a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db7906138d6565b60405180910390fd5b611dc9816125d7565b50565b600033905090565b6000600854905090565b6000808284611ded9190613d3b565b905083811015611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990613916565b60405180910390fd5b8091505092915050565b600080611e9460058481548110611e7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b90506000611ef68260058681548110611ed6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016004015461208f90919063ffffffff16565b9050611f00612b58565b421115611f565760058481548110611f41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b60058481548110611f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154811115611ff85760058481548110611fe3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b8092505050919050565b6000828211612014576000905061203f565b61203c6201518061202e858561204590919063ffffffff16565b612b6290919063ffffffff16565b90505b92915050565b600061208783836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250612bac565b905092915050565b6000808314156120a25760009050612104565b600082846120b09190613dc2565b90508284826120bf9190613d91565b146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613a56565b60405180910390fd5b809150505b92915050565b61218b8363a9059cbb60e01b84846040516024016121299291906137cf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c10565b505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005818154811061220e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a490613c16565b60405180910390fd5b61236a600582815481106122ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461235c60058481548110612339577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015460025461204590919063ffffffff16565b61204590919063ffffffff16565b6002819055506000600582815481106123ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060058281548110612437577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160040181905550600060058281548110612488577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060060201600501819055506000600582815481106124d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016003018190555060006005828154811061252a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001018190555060006005828154811061257b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600580549050111561281957600081111561273c576000612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e906139b6565b60405180910390fd5b612818565b6005600081548110612777577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e906139b6565b60405180910390fd5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612880906139d6565b60405180910390fd5b600082116128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c390613b36565b60405180910390fd5b6128d4612cd7565b6128e983600254611dde90919063ffffffff16565b111561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292190613936565b60405180910390fd5b6000612944612937612ce1565b61293f612b58565b612002565b905060008111612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090613bf6565b60405180910390fd5b60006129b860646129aa61299b612ceb565b8761208f90919063ffffffff16565b612b6290919063ffffffff16565b905060006129cf828661204590919063ffffffff16565b905060006129e68483612b6290919063ffffffff16565b905060056040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001888152602001838152602001612a31612ce1565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501555050612af1600160058054905061204590919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b4986600254611dde90919063ffffffff16565b60028190555050505050505050565b6000600a54905090565b6000612ba483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cf5565b905092915050565b6000838311158290612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb9190613874565b60405180910390fd5b5060008385612c039190613e1c565b9050809150509392505050565b6000612c72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d589092919063ffffffff16565b9050600081511115612cd25780806020019051810190612c929190613183565b612cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc890613bb6565b60405180910390fd5b5b505050565b6000600654905090565b6000600954905090565b6000600754905090565b60008083118290612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d339190613874565b60405180910390fd5b5060008385612d4b9190613d91565b9050809150509392505050565b6060612d678484600085612d70565b90509392505050565b606082471015612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac90613996565b60405180910390fd5b612dbe85612e84565b612dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df490613b56565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e26919061379d565b60006040518083038185875af1925050503d8060008114612e63576040519150601f19603f3d011682016040523d82523d6000602084013e612e68565b606091505b5091509150612e78828286612e97565b92505050949350505050565b600080823b905060008111915050919050565b60608315612ea757829050612ef7565b600083511115612eba5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee9190613874565b60405180910390fd5b9392505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000612f40612f3b84613cb1565b613c8c565b90508083825260208201905082856020860282011115612f5f57600080fd5b60005b85811015612f8f5781612f758882613005565b845260208401935060208301925050600181019050612f62565b5050509392505050565b6000612fac612fa784613cdd565b613c8c565b90508083825260208201905082856020860282011115612fcb57600080fd5b60005b85811015612ffb5781612fe18882613083565b845260208401935060208301925050600181019050612fce565b5050509392505050565b60008135905061301481614737565b92915050565b600082601f83011261302b57600080fd5b813561303b848260208601612f2d565b91505092915050565b600082601f83011261305557600080fd5b8135613065848260208601612f99565b91505092915050565b60008151905061307d8161474e565b92915050565b60008135905061309281614765565b92915050565b6000815190506130a781614765565b92915050565b6000602082840312156130bf57600080fd5b60006130cd84828501613005565b91505092915050565b6000602082840312156130e857600080fd5b600082013567ffffffffffffffff81111561310257600080fd5b61310e8482850161301a565b91505092915050565b6000806040838503121561312a57600080fd5b600083013567ffffffffffffffff81111561314457600080fd5b6131508582860161301a565b925050602083013567ffffffffffffffff81111561316d57600080fd5b61317985828601613044565b9150509250929050565b60006020828403121561319557600080fd5b60006131a38482850161306e565b91505092915050565b6000602082840312156131be57600080fd5b60006131cc84828501613083565b91505092915050565b6000602082840312156131e757600080fd5b60006131f584828501613098565b91505092915050565b600080600080600060a0868803121561321657600080fd5b600061322488828901613083565b955050602061323588828901613083565b945050604061324688828901613083565b935050606061325788828901613083565b925050608061326888828901613083565b9150509295509295909350565b61327e81613e50565b82525050565b61328d81613e62565b82525050565b600061329e82613d09565b6132a88185613d1f565b93506132b8818560208601613e98565b80840191505092915050565b60006132cf82613d14565b6132d98185613d2a565b93506132e9818560208601613e98565b6132f281613fd2565b840191505092915050565b600061330a603783613d2a565b915061331582613fe3565b604082019050919050565b600061332d601683613d2a565b915061333882614032565b602082019050919050565b6000613350602683613d2a565b915061335b8261405b565b604082019050919050565b6000613373602283613d2a565b915061337e826140aa565b604082019050919050565b6000613396601b83613d2a565b91506133a1826140f9565b602082019050919050565b60006133b9604083613d2a565b91506133c482614122565b604082019050919050565b60006133dc601b83613d2a565b91506133e782614171565b602082019050919050565b60006133ff601283613d2a565b915061340a8261419a565b602082019050919050565b6000613422602683613d2a565b915061342d826141c3565b604082019050919050565b6000613445601883613d2a565b915061345082614212565b602082019050919050565b6000613468602283613d2a565b91506134738261423b565b604082019050919050565b600061348b601d83613d2a565b91506134968261428a565b602082019050919050565b60006134ae601f83613d2a565b91506134b9826142b3565b602082019050919050565b60006134d1602483613d2a565b91506134dc826142dc565b604082019050919050565b60006134f4602183613d2a565b91506134ff8261432b565b604082019050919050565b6000613517602b83613d2a565b91506135228261437a565b604082019050919050565b600061353a602083613d2a565b9150613545826143c9565b602082019050919050565b600061355d602383613d2a565b9150613568826143f2565b604082019050919050565b6000613580601483613d2a565b915061358b82614441565b602082019050919050565b60006135a3603283613d2a565b91506135ae8261446a565b604082019050919050565b60006135c6605483613d2a565b91506135d1826144b9565b606082019050919050565b60006135e9601583613d2a565b91506135f48261452e565b602082019050919050565b600061360c601d83613d2a565b915061361782614557565b602082019050919050565b600061362f602f83613d2a565b915061363a82614580565b604082019050919050565b6000613652604483613d2a565b915061365d826145cf565b606082019050919050565b6000613675602a83613d2a565b915061368082614644565b604082019050919050565b6000613698601f83613d2a565b91506136a382614693565b602082019050919050565b60006136bb601d83613d2a565b91506136c6826146bc565b602082019050919050565b60006136de601f83613d2a565b91506136e9826146e5565b602082019050919050565b6000613701601983613d2a565b915061370c8261470e565b602082019050919050565b60a08201600082015161372d600085018261377f565b506020820151613740602085018261377f565b506040820151613753604085018261377f565b506060820151613766606085018261377f565b506080820151613779608085018261377f565b50505050565b61378881613e8e565b82525050565b61379781613e8e565b82525050565b60006137a98284613293565b915081905092915050565b60006020820190506137c96000830184613275565b92915050565b60006040820190506137e46000830185613275565b6137f1602083018461378e565b9392505050565b600060c08201905061380d6000830189613275565b61381a602083018861378e565b613827604083018761378e565b613834606083018661378e565b613841608083018561378e565b61384e60a083018461378e565b979650505050505050565b600060208201905061386e6000830184613284565b92915050565b6000602082019050818103600083015261388e81846132c4565b905092915050565b600060208201905081810360008301526138af816132fd565b9050919050565b600060208201905081810360008301526138cf81613320565b9050919050565b600060208201905081810360008301526138ef81613343565b9050919050565b6000602082019050818103600083015261390f81613366565b9050919050565b6000602082019050818103600083015261392f81613389565b9050919050565b6000602082019050818103600083015261394f816133ac565b9050919050565b6000602082019050818103600083015261396f816133cf565b9050919050565b6000602082019050818103600083015261398f816133f2565b9050919050565b600060208201905081810360008301526139af81613415565b9050919050565b600060208201905081810360008301526139cf81613438565b9050919050565b600060208201905081810360008301526139ef8161345b565b9050919050565b60006020820190508181036000830152613a0f8161347e565b9050919050565b60006020820190508181036000830152613a2f816134a1565b9050919050565b60006020820190508181036000830152613a4f816134c4565b9050919050565b60006020820190508181036000830152613a6f816134e7565b9050919050565b60006020820190508181036000830152613a8f8161350a565b9050919050565b60006020820190508181036000830152613aaf8161352d565b9050919050565b60006020820190508181036000830152613acf81613550565b9050919050565b60006020820190508181036000830152613aef81613573565b9050919050565b60006020820190508181036000830152613b0f81613596565b9050919050565b60006020820190508181036000830152613b2f816135b9565b9050919050565b60006020820190508181036000830152613b4f816135dc565b9050919050565b60006020820190508181036000830152613b6f816135ff565b9050919050565b60006020820190508181036000830152613b8f81613622565b9050919050565b60006020820190508181036000830152613baf81613645565b9050919050565b60006020820190508181036000830152613bcf81613668565b9050919050565b60006020820190508181036000830152613bef8161368b565b9050919050565b60006020820190508181036000830152613c0f816136ae565b9050919050565b60006020820190508181036000830152613c2f816136d1565b9050919050565b60006020820190508181036000830152613c4f816136f4565b9050919050565b600060a082019050613c6b6000830184613717565b92915050565b6000602082019050613c86600083018461378e565b92915050565b6000613c96613ca7565b9050613ca28282613ecb565b919050565b6000604051905090565b600067ffffffffffffffff821115613ccc57613ccb613fa3565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cf857613cf7613fa3565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613d4682613e8e565b9150613d5183613e8e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8657613d85613f45565b5b828201905092915050565b6000613d9c82613e8e565b9150613da783613e8e565b925082613db757613db6613f74565b5b828204905092915050565b6000613dcd82613e8e565b9150613dd883613e8e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1157613e10613f45565b5b828202905092915050565b6000613e2782613e8e565b9150613e3283613e8e565b925082821015613e4557613e44613f45565b5b828203905092915050565b6000613e5b82613e6e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015613eb6578082015181840152602081019050613e9b565b83811115613ec5576000848401525b50505050565b613ed482613fd2565b810181811067ffffffffffffffff82111715613ef357613ef2613fa3565b5b80604052505050565b6000613f0782613e8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f3a57613f39613f45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f56657374696e6720456e642074696d652063616e6e6f74206265206561726c6960008201527f6572207468616e20436c69666620456e642074696d652e000000000000000000602082015250565b7f41727261792063616e6e6f7420626520656d7074792e00000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e6365206c65667420746f20636c616960008201527f6d2e000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f43616e6e6f74206164642074686973206465627420616d6f756e74206475652060008201527f746f207468652062616c616e6365206f66207468697320436f6e74726163742e602082015250565b7f436c61696d2072657175657374206973206e6f742076616c69642e0000000000600082015250565b7f52657175657374206e6f742076616c69642e0000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4164647265737320616c726561647920696e206c6973742e0000000000000000600082015250565b7f526563697069656e7420616464726573732063616e6e6f7420626520656d707460008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420696e697469616c697a6564207965742e000000600082015250565b7f436f6e747261637420697320696e2073757370656e6465642073746174652e00600082015250565b7f5447452074696d652063616e6e6f74206265206561726c696572207468616e2060008201527f6e6f772e00000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e636520746f20636c61696d2061742060008201527f746865206d6f6d656e742e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206973206e6f7420696e2073757370656e6465642073746160008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20726563697069656e747320666f756e642e000000000000000000000000600082015250565b7f496e697469616c20436f6e74726163742042616c616e63652073686f756c642060008201527f62652067726561746572207468616e20302e0000000000000000000000000000602082015250565b7f436f6e747261637420616c72656164792068617320746f6b656e7320616e642060008201527f54474520616c7265616479207365742e2043616e6e6f74206368616e6765206460208201527f617465732061742074686973206d6f6d656e742e000000000000000000000000604082015250565b7f546f6b656e20616d6f756e7420696e76616c69642e0000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f436c69666620456e642074696d652063616e6e6f74206265206561726c69657260008201527f207468616e205447452074696d652e0000000000000000000000000000000000602082015250565b7f54474520556e6c6f636b2050657263656e746167652063616e6e6f742062652060008201527f67726561746572207468616e20323025207065722048654320546f6b656e6f6d60208201527f6963732e00000000000000000000000000000000000000000000000000000000604082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f556e65787065637465642076657374696e672064617920636f756e742e000000600082015250565b7f526563697069656e7420696e64657820646f6573206e6f74206d617463682e00600082015250565b7f41727261792073697a657320646f206e6f74206d617463682e00000000000000600082015250565b61474081613e50565b811461474b57600080fd5b50565b61475781613e62565b811461476257600080fd5b50565b61476e81613e8e565b811461477957600080fd5b5056fea264697066735822122013d5aba5ee9bd9f309cf95fb385c22fc9da2e31be5c61b75e32ae8ab2fbc61dd64736f6c63430008020033000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
-----Decoded View---------------
Arg [0] : _hec (address): 0xc7f4debc8072e23fe9259a5c0398326d8efb7f5c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
Deployed ByteCode Sourcemap
38316:3710:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40697:1326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37623:121;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37398:139;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27407:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28568:1616;;;:::i;:::-;;36984:118;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36611:262;;;:::i;:::-;;36179:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27303:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16967:103;;;:::i;:::-;;27464:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;39320:499;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16316:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35594:463;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37198:119;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30281:610;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37824:337;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17225:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40697:1326;40902:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40927:7:::1;;;;;;;;;;;40919:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41019:1;40993:23;:27;40985:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41118:2;41094:20;:26;;41086:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;41225:1;41208:14;;:18;41204:193;;;41295:1;41259:3;41251:23;;;41284:4;41251:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;41243:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;41204:193;41440:15;41415:13;:41;;41407:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41538:13;41516:18;:35;;41508:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41646:18;41622:20;:42;;41614:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41754:13;41737:14;:30;;;;41801:18;41778:20;:41;;;;41855:20;41830:22;:45;;;;41913:23;41886:24;:50;;;;41971:20;41947:21;:44;;;;42011:4;42004:11;;40697:1326:::0;;;;;;;:::o;37623:121::-;37679:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37697:8:::1;37708:7;;;;;;;;;;;37697:18;;37733:3;37726:10;;;37623:121:::0;:::o;37398:139::-;37462:7;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37497:3:::1;37489:23;;;37522:4;37489:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37482:47;;37398:139:::0;:::o;27407:50::-;;;;;;;;;;;;;;;;;:::o;28568:1616::-;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;28637:5:::1;28626:16;;:7;;;;;;;;;;;:16;;;28618:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28717:1;28697:17;:15;:17::i;:::-;:21;28689:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28788:1;28771:7;:14;;;;:18;28763:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;28860:17;:15;:17::i;:::-;28841:15;28833:44;28825:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28913:13;28929;:25;28943:10;28929:25;;;;;;;;;;;;;;;;28913:41;;29003:10;28973:40;;:7;28982:5;28973:16;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:40;;;28965:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;29137:1;29064:70;29100:7;29109:5;29100:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;29064:7;29073:5;29064:16;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;:34;;:70;;;;:::i;:::-;:74;29056:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;29198:30;29231:43;29267:5;29231:34;:43::i;:::-;29198:76;;29285:26;29314:7;29323:5;29314:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;29285:61;;29357:24;29384:46;29411:18;29384:22;:26;;:46;;;;:::i;:::-;29357:73;;29471:1;29452:16;:20;29443:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;29533:23;29559:89;29585:7;29594:5;29585:16;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;29630:15;29559:24;:89::i;:::-;29533:115;;29694:60;29730:22;29694:7;29703:5;29694:16;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;:34;;:60;;;;:::i;:::-;29661:7;29670:5;29661:16;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;:93;;;;29800:58;29838:18;29800:7;29809:5;29800:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;:36;;:58;;;;:::i;:::-;29765:7;29774:5;29765:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;:93;;;;29907:81;29948:38;27145:12;29948:15;:19;;:38;;;;:::i;:::-;29907:7;29916:5;29907:16;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;:39;;:81;;;;:::i;:::-;29869:7;29878:5;29869:16;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;:119;;;;30013:33;30028:16;30013:9;;:13;;:33;;;;:::i;:::-;30001:9;:45;;;;30059:56;30086:10;30098:16;30067:3;30059:26;;;;:56;;;;;:::i;:::-;30146:10;30131:45;;;30158:16;30131:45;;;;;;:::i;:::-;;;;;;;;26635:1;;;;;25829::::0;26783:7;:22;;;;28568:1616::o;36984:118::-;37041:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37068:4:::1;37058:7;;:14;;;;;;;;;;;;;;;;;;37090:4;37083:11;;36984:118:::0;:::o;36611:262::-;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;16547:12:::1;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36693:7:::2;;;;;;;;;;;36685:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36753:13;36777:3;36769:23;;;36802:4;36769:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36753:56;;36820:45;36847:10;36859:5;36828:3;36820:26;;;;:45;;;;;:::i;:::-;16607:1;25829::::0;26783:7;:22;;;;36611:262::o;36179:327::-;36276:4;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;16547:12:::1;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36323:1:::2;36302:11;:18;:22;36293:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36369:9;36364:111;36388:11;:18;36384:1;:22;36364:111;;;36429:34;36447:11;36459:1;36447:14;;;;;;;;;;;;;;;;;;;;;;36429:16;:34::i;:::-;36408:3;;;;;:::i;:::-;;;;36364:111;;;;36494:4;36487:11;;25829:1:::0;26783:7;:22;;;;36179:327;;;:::o;27303:28::-;;;:::o;16967:103::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17032:30:::1;17059:1;17032:18;:30::i;:::-;16967:103::o:0;27464:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39320:499::-;39381:19;;:::i;:::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39414:23:::1;39440:340;;;;;;;;39490:14;;39440:340;;;;39546:20;;39440:340;;;;39610:22;;39440:340;;;;39676:21;;39440:340;;;;39744:24;;39440:340;;::::0;39414:366:::1;;39808:3;39801:10;;;39320:499:::0;:::o;16316:87::-;16362:7;16389:6;;;;;;;;;;;16382:13;;16316:87;:::o;35594:463::-;35720:4;25873:1;26471:7;;:19;;26463:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;25873:1;26604:7;:18;;;;16547:12:::1;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35768:13:::2;:20;35746:11;:18;:42;35737:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35859:1;35838:11;:18;:22;35829:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35905:9;35900:126;35924:11;:18;35920:1;:22;35900:126;;;35965:49;35980:11;35992:1;35980:14;;;;;;;;;;;;;;;;;;;;;;35996:13;36010:1;35996:16;;;;;;;;;;;;;;;;;;;;;;35965:13;:49::i;:::-;35944:3;;;;;:::i;:::-;;;;35900:126;;;;36045:4;36038:11;;25829:1:::0;26783:7;:22;;;;35594:463;;;;:::o;37198:119::-;37254:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37282:5:::1;37272:7;;:15;;;;;;;;;;;;;;;;;;37305:4;37298:11;;37198:119:::0;:::o;30281:610::-;30325:7;30364:5;30353:16;;:7;;;;;;;;;;;:16;;;30345:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30444:1;30424:17;:15;:17::i;:::-;:21;30416:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30515:1;30498:7;:14;;;;:18;30490:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;30554:13;30570;:27;30585:10;30570:27;;;;;;;;;;;;;;;;30554:43;;30662:10;30632:40;;:7;30641:5;30632:16;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:40;;;30624:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30740:17;:15;:17::i;:::-;30720:15;30712:45;30708:72;;30779:1;30772:8;;;;;30708:72;30800:83;30838:43;30874:5;30838:34;:43::i;:::-;30800:7;30809:5;30800:16;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;:36;;:83;;;;:::i;:::-;30793:90;;;30281:610;;:::o;37824:337::-;37885:7;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37905:24:::1;37949:9:::0;37944:174:::1;37968:7;:14;;;;37964:1;:18;37944:174;;;38024:82;38078:7;38086:1;38078:10;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;38024:48;38046:7;38054:1;38046:10;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;38024:16;:20;;:48;;;;:::i;:::-;:52;;:82;;;;:::i;:::-;38005:101;;37984:3;;;;;:::i;:::-;;;;37944:174;;;;38137:16;38130:23;;;37824:337:::0;:::o;17225:201::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17334:1:::1;17314:22;;:8;:22;;;;17306:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17390:28;17409:8;17390:18;:28::i;:::-;17225:201:::0;:::o;15183:98::-;15236:7;15263:10;15256:17;;15183:98;:::o;39835:107::-;39893:7;39920:14;;39913:21;;39835:107;:::o;18608:181::-;18666:7;18686:9;18702:1;18698;:5;;;;:::i;:::-;18686:17;;18727:1;18722;:6;;18714:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;18780:1;18773:8;;;18608:181;;;;:::o;31039:1248::-;31123:7;31636:23;31662:90;31688:7;31697:6;31688:17;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;31734:15;31662:24;:90::i;:::-;31636:116;;31763:30;31796:60;31839:15;31796:7;31805:6;31796:17;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;:41;;:60;;;;:::i;:::-;31763:93;;31983:24;:22;:24::i;:::-;31964:15;31956:51;31952:126;;;32047:7;32056:6;32047:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;32022:56;;31952:126;32121:7;32130:6;32121:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;32096:22;:56;32091:147;;;32195:7;32204:6;32195:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;32170:56;;32091:147;32257:22;32250:29;;;;31039:1248;;;:::o;32445:244::-;32543:7;32580:11;32567:9;:24;32563:51;;32613:1;32606:8;;;;32563:51;32634:47;27145:12;32634:26;32648:11;32634:9;:13;;:26;;;;:::i;:::-;:30;;:47;;;;:::i;:::-;32627:54;;32445:244;;;;;:::o;19501:137::-;19559:7;19586:44;19590:1;19593;19586:44;;;;;;;;;;;;;;;;;:3;:44::i;:::-;19579:51;;19501:137;;;;:::o;20362:471::-;20420:7;20670:1;20665;:6;20661:47;;;20695:1;20688:8;;;;20661:47;20720:9;20736:1;20732;:5;;;;:::i;:::-;20720:17;;20765:1;20760;20756;:5;;;;:::i;:::-;:10;20748:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;20824:1;20817:8;;;20362:471;;;;;:::o;11344:211::-;11461:86;11481:5;11511:23;;;11536:2;11540:5;11488:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11461:19;:86::i;:::-;11344:211;;;:::o;34757:675::-;34824:14;34841:13;:27;34856:10;34841:27;;;;;;;;;;;;;;;;34824:44;;34902:7;34911:6;34902:17;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;34888:41;;:10;:41;;;34879:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34991:89;35045:7;35054:6;35045:17;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;34991:48;35006:7;35015:6;35006:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;34991:9;;:13;;:48;;;;:::i;:::-;:52;;:89;;;;:::i;:::-;34979:9;:101;;;;35131:1;35093:7;35102:6;35093:17;;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;:40;;;;;;;;;;;;;;;;;;35184:1;35144:7;35153:6;35144:17;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;:41;;;;35235:1;35196:7;35205:6;35196:17;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;:40;;;;35282:1;35247:7;35256:6;35247:17;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;:36;;;;35330:1;35294:7;35303:6;35294:17;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:37;;;;35376:1;35342:7;35351:6;35342:17;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:35;;;;35397:13;:27;35412:10;35397:27;;;;;;;;;;;;;;;35390:34;;;34757:675;;:::o;17586:191::-;17660:16;17679:6;;;;;;;;;;;17660:25;;17705:8;17696:6;;:17;;;;;;;;;;;;;;;;;;17760:8;17729:40;;17750:8;17729:40;;;;;;;;;;;;17586:191;;:::o;32837:1809::-;32923:13;32939;:27;32954:10;32939:27;;;;;;;;;;;;;;;;32923:43;;32998:1;32981:7;:14;;;;:18;32977:317;;;33028:1;33020:5;:9;33016:267;;;33071:5;33063:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;33016:267;;;33218:7;33226:1;33218:10;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;33204:34;;:10;:34;;;;33196:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33016:267;32977:317;33337:1;33315:24;;:10;:24;;;;33306:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33414:1;33399:12;:16;33390:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;33492:27;:25;:27::i;:::-;33461;33475:12;33461:9;;:13;;:27;;;;:::i;:::-;:58;;33453:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;33609:23;33635:76;33661:22;:20;:22::i;:::-;33685:24;:22;:24::i;:::-;33635;:76::i;:::-;33609:102;;33860:1;33842:15;:19;33834:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33908:24;33935:51;33982:3;33935:42;33952:24;:22;:24::i;:::-;33935:12;:16;;:42;;;;:::i;:::-;:46;;:51;;;;:::i;:::-;33908:78;;33998:22;34023:34;34040:16;34023:12;:16;;:34;;;;:::i;:::-;33998:59;;34077:28;34108:35;34127:15;34108:14;:18;;:35;;;;:::i;:::-;34077:66;;34156:7;34170:355;;;;;;;;34215:10;34170:355;;;;;;34265:16;34170:355;;;;34319:14;34170:355;;;;34372:12;34170:355;;;;34428:20;34170:355;;;;34491:22;:20;:22::i;:::-;34170:355;;;34156:370;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34567:21;34586:1;34567:7;:14;;;;:18;;:21;;;;:::i;:::-;34539:13;:25;34553:10;34539:25;;;;;;;;;;;;;;;:49;;;;34611:27;34625:12;34611:9;;:13;;:27;;;;:::i;:::-;34599:9;:39;;;;32837:1809;;;;;;;:::o;40210:121::-;40275:7;40301:22;;40294:29;;40210:121;:::o;22020:132::-;22078:7;22105:39;22109:1;22112;22105:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;22098:46;;22020:132;;;;:::o;19927:192::-;20013:7;20046:1;20041;:6;;20049:12;20033:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20073:9;20089:1;20085;:5;;;;:::i;:::-;20073:17;;20110:1;20103:8;;;19927:192;;;;;:::o;13917:716::-;14341:23;14367:69;14395:4;14367:69;;;;;;;;;;;;;;;;;14375:5;14367:27;;;;:69;;;;;:::i;:::-;14341:95;;14471:1;14451:10;:17;:21;14447:179;;;14548:10;14537:30;;;;;;;;;;;;:::i;:::-;14529:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14447:179;13917:716;;;:::o;39950:127::-;40018:7;40045:24;;40038:31;;39950:127;:::o;40085:117::-;40148:7;40174:20;;40167:27;;40085:117;:::o;40339:120::-;40404:7;40430:21;;40423:28;;40339:120;:::o;22640:345::-;22726:7;22825:1;22821;:5;22828:12;22813:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22852:9;22868:1;22864;:5;;;;:::i;:::-;22852:17;;22976:1;22969:8;;;22640:345;;;;;:::o;6293:229::-;6430:12;6462:52;6484:6;6492:4;6498:1;6501:12;6462:21;:52::i;:::-;6455:59;;6293:229;;;;;:::o;7413:510::-;7583:12;7641:5;7616:21;:30;;7608:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7708:18;7719:6;7708:10;:18::i;:::-;7700:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7774:12;7788:23;7815:6;:11;;7834:5;7841:4;7815:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7773:73;;;;7864:51;7881:7;7890:10;7902:12;7864:16;:51::i;:::-;7857:58;;;;7413:510;;;;;;:::o;3487:387::-;3547:4;3755:12;3822:7;3810:20;3802:28;;3865:1;3858:4;:8;3851:15;;;3487:387;;;:::o;10099:712::-;10249:12;10278:7;10274:530;;;10309:10;10302:17;;;;10274:530;10443:1;10423:10;:17;:21;10419:374;;;10621:10;10615:17;10682:15;10669:10;10665:2;10661:19;10654:44;10569:148;10764:12;10757:20;;;;;;;;;;;:::i;:::-;;;;;;;;10099:712;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;670:623::-;;791:81;807:64;864:6;807:64;:::i;:::-;791:81;:::i;:::-;782:90;;892:5;920:6;913:5;906:21;946:4;939:5;935:16;928:23;;971:6;1021:3;1013:4;1005:6;1001:17;996:3;992:27;989:36;986:2;;;1038:1;1035;1028:12;986:2;1066:1;1051:236;1076:6;1073:1;1070:13;1051:236;;;1143:3;1171:37;1204:3;1192:10;1171:37;:::i;:::-;1166:3;1159:50;1238:4;1233:3;1229:14;1222:21;;1272:4;1267:3;1263:14;1256:21;;1111:176;1098:1;1095;1091:9;1086:14;;1051:236;;;1055:14;772:521;;;;;;;:::o;1299:139::-;;1383:6;1370:20;1361:29;;1399:33;1426:5;1399:33;:::i;:::-;1351:87;;;;:::o;1461:303::-;;1581:3;1574:4;1566:6;1562:17;1558:27;1548:2;;1599:1;1596;1589:12;1548:2;1639:6;1626:20;1664:94;1754:3;1746:6;1739:4;1731:6;1727:17;1664:94;:::i;:::-;1655:103;;1538:226;;;;;:::o;1787:303::-;;1907:3;1900:4;1892:6;1888:17;1884:27;1874:2;;1925:1;1922;1915:12;1874:2;1965:6;1952:20;1990:94;2080:3;2072:6;2065:4;2057:6;2053:17;1990:94;:::i;:::-;1981:103;;1864:226;;;;;:::o;2096:137::-;;2181:6;2175:13;2166:22;;2197:30;2221:5;2197:30;:::i;:::-;2156:77;;;;:::o;2239:139::-;;2323:6;2310:20;2301:29;;2339:33;2366:5;2339:33;:::i;:::-;2291:87;;;;:::o;2384:143::-;;2472:6;2466:13;2457:22;;2488:33;2515:5;2488:33;:::i;:::-;2447:80;;;;:::o;2533:262::-;;2641:2;2629:9;2620:7;2616:23;2612:32;2609:2;;;2657:1;2654;2647:12;2609:2;2700:1;2725:53;2770:7;2761:6;2750:9;2746:22;2725:53;:::i;:::-;2715:63;;2671:117;2599:196;;;;:::o;2801:405::-;;2934:2;2922:9;2913:7;2909:23;2905:32;2902:2;;;2950:1;2947;2940:12;2902:2;3021:1;3010:9;3006:17;2993:31;3051:18;3043:6;3040:30;3037:2;;;3083:1;3080;3073:12;3037:2;3111:78;3181:7;3172:6;3161:9;3157:22;3111:78;:::i;:::-;3101:88;;2964:235;2892:314;;;;:::o;3212:693::-;;;3387:2;3375:9;3366:7;3362:23;3358:32;3355:2;;;3403:1;3400;3393:12;3355:2;3474:1;3463:9;3459:17;3446:31;3504:18;3496:6;3493:30;3490:2;;;3536:1;3533;3526:12;3490:2;3564:78;3634:7;3625:6;3614:9;3610:22;3564:78;:::i;:::-;3554:88;;3417:235;3719:2;3708:9;3704:18;3691:32;3750:18;3742:6;3739:30;3736:2;;;3782:1;3779;3772:12;3736:2;3810:78;3880:7;3871:6;3860:9;3856:22;3810:78;:::i;:::-;3800:88;;3662:236;3345:560;;;;;:::o;3911:278::-;;4027:2;4015:9;4006:7;4002:23;3998:32;3995:2;;;4043:1;4040;4033:12;3995:2;4086:1;4111:61;4164:7;4155:6;4144:9;4140:22;4111:61;:::i;:::-;4101:71;;4057:125;3985:204;;;;:::o;4195:262::-;;4303:2;4291:9;4282:7;4278:23;4274:32;4271:2;;;4319:1;4316;4309:12;4271:2;4362:1;4387:53;4432:7;4423:6;4412:9;4408:22;4387:53;:::i;:::-;4377:63;;4333:117;4261:196;;;;:::o;4463:284::-;;4582:2;4570:9;4561:7;4557:23;4553:32;4550:2;;;4598:1;4595;4588:12;4550:2;4641:1;4666:64;4722:7;4713:6;4702:9;4698:22;4666:64;:::i;:::-;4656:74;;4612:128;4540:207;;;;:::o;4753:844::-;;;;;;4929:3;4917:9;4908:7;4904:23;4900:33;4897:2;;;4946:1;4943;4936:12;4897:2;4989:1;5014:53;5059:7;5050:6;5039:9;5035:22;5014:53;:::i;:::-;5004:63;;4960:117;5116:2;5142:53;5187:7;5178:6;5167:9;5163:22;5142:53;:::i;:::-;5132:63;;5087:118;5244:2;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5215:118;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5500:3;5527:53;5572:7;5563:6;5552:9;5548:22;5527:53;:::i;:::-;5517:63;;5471:119;4887:710;;;;;;;;:::o;5603:118::-;5690:24;5708:5;5690:24;:::i;:::-;5685:3;5678:37;5668:53;;:::o;5727:109::-;5808:21;5823:5;5808:21;:::i;:::-;5803:3;5796:34;5786:50;;:::o;5842:373::-;;5974:38;6006:5;5974:38;:::i;:::-;6028:88;6109:6;6104:3;6028:88;:::i;:::-;6021:95;;6125:52;6170:6;6165:3;6158:4;6151:5;6147:16;6125:52;:::i;:::-;6202:6;6197:3;6193:16;6186:23;;5950:265;;;;;:::o;6221:364::-;;6337:39;6370:5;6337:39;:::i;:::-;6392:71;6456:6;6451:3;6392:71;:::i;:::-;6385:78;;6472:52;6517:6;6512:3;6505:4;6498:5;6494:16;6472:52;:::i;:::-;6549:29;6571:6;6549:29;:::i;:::-;6544:3;6540:39;6533:46;;6313:272;;;;;:::o;6591:366::-;;6754:67;6818:2;6813:3;6754:67;:::i;:::-;6747:74;;6830:93;6919:3;6830:93;:::i;:::-;6948:2;6943:3;6939:12;6932:19;;6737:220;;;:::o;6963:366::-;;7126:67;7190:2;7185:3;7126:67;:::i;:::-;7119:74;;7202:93;7291:3;7202:93;:::i;:::-;7320:2;7315:3;7311:12;7304:19;;7109:220;;;:::o;7335:366::-;;7498:67;7562:2;7557:3;7498:67;:::i;:::-;7491:74;;7574:93;7663:3;7574:93;:::i;:::-;7692:2;7687:3;7683:12;7676:19;;7481:220;;;:::o;7707:366::-;;7870:67;7934:2;7929:3;7870:67;:::i;:::-;7863:74;;7946:93;8035:3;7946:93;:::i;:::-;8064:2;8059:3;8055:12;8048:19;;7853:220;;;:::o;8079:366::-;;8242:67;8306:2;8301:3;8242:67;:::i;:::-;8235:74;;8318:93;8407:3;8318:93;:::i;:::-;8436:2;8431:3;8427:12;8420:19;;8225:220;;;:::o;8451:366::-;;8614:67;8678:2;8673:3;8614:67;:::i;:::-;8607:74;;8690:93;8779:3;8690:93;:::i;:::-;8808:2;8803:3;8799:12;8792:19;;8597:220;;;:::o;8823:366::-;;8986:67;9050:2;9045:3;8986:67;:::i;:::-;8979:74;;9062:93;9151:3;9062:93;:::i;:::-;9180:2;9175:3;9171:12;9164:19;;8969:220;;;:::o;9195:366::-;;9358:67;9422:2;9417:3;9358:67;:::i;:::-;9351:74;;9434:93;9523:3;9434:93;:::i;:::-;9552:2;9547:3;9543:12;9536:19;;9341:220;;;:::o;9567:366::-;;9730:67;9794:2;9789:3;9730:67;:::i;:::-;9723:74;;9806:93;9895:3;9806:93;:::i;:::-;9924:2;9919:3;9915:12;9908:19;;9713:220;;;:::o;9939:366::-;;10102:67;10166:2;10161:3;10102:67;:::i;:::-;10095:74;;10178:93;10267:3;10178:93;:::i;:::-;10296:2;10291:3;10287:12;10280:19;;10085:220;;;:::o;10311:366::-;;10474:67;10538:2;10533:3;10474:67;:::i;:::-;10467:74;;10550:93;10639:3;10550:93;:::i;:::-;10668:2;10663:3;10659:12;10652:19;;10457:220;;;:::o;10683:366::-;;10846:67;10910:2;10905:3;10846:67;:::i;:::-;10839:74;;10922:93;11011:3;10922:93;:::i;:::-;11040:2;11035:3;11031:12;11024:19;;10829:220;;;:::o;11055:366::-;;11218:67;11282:2;11277:3;11218:67;:::i;:::-;11211:74;;11294:93;11383:3;11294:93;:::i;:::-;11412:2;11407:3;11403:12;11396:19;;11201:220;;;:::o;11427:366::-;;11590:67;11654:2;11649:3;11590:67;:::i;:::-;11583:74;;11666:93;11755:3;11666:93;:::i;:::-;11784:2;11779:3;11775:12;11768:19;;11573:220;;;:::o;11799:366::-;;11962:67;12026:2;12021:3;11962:67;:::i;:::-;11955:74;;12038:93;12127:3;12038:93;:::i;:::-;12156:2;12151:3;12147:12;12140:19;;11945:220;;;:::o;12171:366::-;;12334:67;12398:2;12393:3;12334:67;:::i;:::-;12327:74;;12410:93;12499:3;12410:93;:::i;:::-;12528:2;12523:3;12519:12;12512:19;;12317:220;;;:::o;12543:366::-;;12706:67;12770:2;12765:3;12706:67;:::i;:::-;12699:74;;12782:93;12871:3;12782:93;:::i;:::-;12900:2;12895:3;12891:12;12884:19;;12689:220;;;:::o;12915:366::-;;13078:67;13142:2;13137:3;13078:67;:::i;:::-;13071:74;;13154:93;13243:3;13154:93;:::i;:::-;13272:2;13267:3;13263:12;13256:19;;13061:220;;;:::o;13287:366::-;;13450:67;13514:2;13509:3;13450:67;:::i;:::-;13443:74;;13526:93;13615:3;13526:93;:::i;:::-;13644:2;13639:3;13635:12;13628:19;;13433:220;;;:::o;13659:366::-;;13822:67;13886:2;13881:3;13822:67;:::i;:::-;13815:74;;13898:93;13987:3;13898:93;:::i;:::-;14016:2;14011:3;14007:12;14000:19;;13805:220;;;:::o;14031:366::-;;14194:67;14258:2;14253:3;14194:67;:::i;:::-;14187:74;;14270:93;14359:3;14270:93;:::i;:::-;14388:2;14383:3;14379:12;14372:19;;14177:220;;;:::o;14403:366::-;;14566:67;14630:2;14625:3;14566:67;:::i;:::-;14559:74;;14642:93;14731:3;14642:93;:::i;:::-;14760:2;14755:3;14751:12;14744:19;;14549:220;;;:::o;14775:366::-;;14938:67;15002:2;14997:3;14938:67;:::i;:::-;14931:74;;15014:93;15103:3;15014:93;:::i;:::-;15132:2;15127:3;15123:12;15116:19;;14921:220;;;:::o;15147:366::-;;15310:67;15374:2;15369:3;15310:67;:::i;:::-;15303:74;;15386:93;15475:3;15386:93;:::i;:::-;15504:2;15499:3;15495:12;15488:19;;15293:220;;;:::o;15519:366::-;;15682:67;15746:2;15741:3;15682:67;:::i;:::-;15675:74;;15758:93;15847:3;15758:93;:::i;:::-;15876:2;15871:3;15867:12;15860:19;;15665:220;;;:::o;15891:366::-;;16054:67;16118:2;16113:3;16054:67;:::i;:::-;16047:74;;16130:93;16219:3;16130:93;:::i;:::-;16248:2;16243:3;16239:12;16232:19;;16037:220;;;:::o;16263:366::-;;16426:67;16490:2;16485:3;16426:67;:::i;:::-;16419:74;;16502:93;16591:3;16502:93;:::i;:::-;16620:2;16615:3;16611:12;16604:19;;16409:220;;;:::o;16635:366::-;;16798:67;16862:2;16857:3;16798:67;:::i;:::-;16791:74;;16874:93;16963:3;16874:93;:::i;:::-;16992:2;16987:3;16983:12;16976:19;;16781:220;;;:::o;17007:366::-;;17170:67;17234:2;17229:3;17170:67;:::i;:::-;17163:74;;17246:93;17335:3;17246:93;:::i;:::-;17364:2;17359:3;17355:12;17348:19;;17153:220;;;:::o;17379:366::-;;17542:67;17606:2;17601:3;17542:67;:::i;:::-;17535:74;;17618:93;17707:3;17618:93;:::i;:::-;17736:2;17731:3;17727:12;17720:19;;17525:220;;;:::o;17845:1108::-;18002:4;17997:3;17993:14;18097:4;18090:5;18086:16;18080:23;18116:63;18173:4;18168:3;18164:14;18150:12;18116:63;:::i;:::-;18017:172;18284:4;18277:5;18273:16;18267:23;18303:63;18360:4;18355:3;18351:14;18337:12;18303:63;:::i;:::-;18199:177;18473:4;18466:5;18462:16;18456:23;18492:63;18549:4;18544:3;18540:14;18526:12;18492:63;:::i;:::-;18386:179;18662:4;18655:5;18651:16;18645:23;18681:63;18738:4;18733:3;18729:14;18715:12;18681:63;:::i;:::-;18575:179;18854:4;18847:5;18843:16;18837:23;18873:63;18930:4;18925:3;18921:14;18907:12;18873:63;:::i;:::-;18764:182;17971:982;;;:::o;18959:108::-;19036:24;19054:5;19036:24;:::i;:::-;19031:3;19024:37;19014:53;;:::o;19073:118::-;19160:24;19178:5;19160:24;:::i;:::-;19155:3;19148:37;19138:53;;:::o;19197:271::-;;19349:93;19438:3;19429:6;19349:93;:::i;:::-;19342:100;;19459:3;19452:10;;19331:137;;;;:::o;19474:222::-;;19605:2;19594:9;19590:18;19582:26;;19618:71;19686:1;19675:9;19671:17;19662:6;19618:71;:::i;:::-;19572:124;;;;:::o;19702:332::-;;19861:2;19850:9;19846:18;19838:26;;19874:71;19942:1;19931:9;19927:17;19918:6;19874:71;:::i;:::-;19955:72;20023:2;20012:9;20008:18;19999:6;19955:72;:::i;:::-;19828:206;;;;;:::o;20040:775::-;;20311:3;20300:9;20296:19;20288:27;;20325:71;20393:1;20382:9;20378:17;20369:6;20325:71;:::i;:::-;20406:72;20474:2;20463:9;20459:18;20450:6;20406:72;:::i;:::-;20488;20556:2;20545:9;20541:18;20532:6;20488:72;:::i;:::-;20570;20638:2;20627:9;20623:18;20614:6;20570:72;:::i;:::-;20652:73;20720:3;20709:9;20705:19;20696:6;20652:73;:::i;:::-;20735;20803:3;20792:9;20788:19;20779:6;20735:73;:::i;:::-;20278:537;;;;;;;;;:::o;20821:210::-;;20946:2;20935:9;20931:18;20923:26;;20959:65;21021:1;21010:9;21006:17;20997:6;20959:65;:::i;:::-;20913:118;;;;:::o;21037:313::-;;21188:2;21177:9;21173:18;21165:26;;21237:9;21231:4;21227:20;21223:1;21212:9;21208:17;21201:47;21265:78;21338:4;21329:6;21265:78;:::i;:::-;21257:86;;21155:195;;;;:::o;21356:419::-;;21560:2;21549:9;21545:18;21537:26;;21609:9;21603:4;21599:20;21595:1;21584:9;21580:17;21573:47;21637:131;21763:4;21637:131;:::i;:::-;21629:139;;21527:248;;;:::o;21781:419::-;;21985:2;21974:9;21970:18;21962:26;;22034:9;22028:4;22024:20;22020:1;22009:9;22005:17;21998:47;22062:131;22188:4;22062:131;:::i;:::-;22054:139;;21952:248;;;:::o;22206:419::-;;22410:2;22399:9;22395:18;22387:26;;22459:9;22453:4;22449:20;22445:1;22434:9;22430:17;22423:47;22487:131;22613:4;22487:131;:::i;:::-;22479:139;;22377:248;;;:::o;22631:419::-;;22835:2;22824:9;22820:18;22812:26;;22884:9;22878:4;22874:20;22870:1;22859:9;22855:17;22848:47;22912:131;23038:4;22912:131;:::i;:::-;22904:139;;22802:248;;;:::o;23056:419::-;;23260:2;23249:9;23245:18;23237:26;;23309:9;23303:4;23299:20;23295:1;23284:9;23280:17;23273:47;23337:131;23463:4;23337:131;:::i;:::-;23329:139;;23227:248;;;:::o;23481:419::-;;23685:2;23674:9;23670:18;23662:26;;23734:9;23728:4;23724:20;23720:1;23709:9;23705:17;23698:47;23762:131;23888:4;23762:131;:::i;:::-;23754:139;;23652:248;;;:::o;23906:419::-;;24110:2;24099:9;24095:18;24087:26;;24159:9;24153:4;24149:20;24145:1;24134:9;24130:17;24123:47;24187:131;24313:4;24187:131;:::i;:::-;24179:139;;24077:248;;;:::o;24331:419::-;;24535:2;24524:9;24520:18;24512:26;;24584:9;24578:4;24574:20;24570:1;24559:9;24555:17;24548:47;24612:131;24738:4;24612:131;:::i;:::-;24604:139;;24502:248;;;:::o;24756:419::-;;24960:2;24949:9;24945:18;24937:26;;25009:9;25003:4;24999:20;24995:1;24984:9;24980:17;24973:47;25037:131;25163:4;25037:131;:::i;:::-;25029:139;;24927:248;;;:::o;25181:419::-;;25385:2;25374:9;25370:18;25362:26;;25434:9;25428:4;25424:20;25420:1;25409:9;25405:17;25398:47;25462:131;25588:4;25462:131;:::i;:::-;25454:139;;25352:248;;;:::o;25606:419::-;;25810:2;25799:9;25795:18;25787:26;;25859:9;25853:4;25849:20;25845:1;25834:9;25830:17;25823:47;25887:131;26013:4;25887:131;:::i;:::-;25879:139;;25777:248;;;:::o;26031:419::-;;26235:2;26224:9;26220:18;26212:26;;26284:9;26278:4;26274:20;26270:1;26259:9;26255:17;26248:47;26312:131;26438:4;26312:131;:::i;:::-;26304:139;;26202:248;;;:::o;26456:419::-;;26660:2;26649:9;26645:18;26637:26;;26709:9;26703:4;26699:20;26695:1;26684:9;26680:17;26673:47;26737:131;26863:4;26737:131;:::i;:::-;26729:139;;26627:248;;;:::o;26881:419::-;;27085:2;27074:9;27070:18;27062:26;;27134:9;27128:4;27124:20;27120:1;27109:9;27105:17;27098:47;27162:131;27288:4;27162:131;:::i;:::-;27154:139;;27052:248;;;:::o;27306:419::-;;27510:2;27499:9;27495:18;27487:26;;27559:9;27553:4;27549:20;27545:1;27534:9;27530:17;27523:47;27587:131;27713:4;27587:131;:::i;:::-;27579:139;;27477:248;;;:::o;27731:419::-;;27935:2;27924:9;27920:18;27912:26;;27984:9;27978:4;27974:20;27970:1;27959:9;27955:17;27948:47;28012:131;28138:4;28012:131;:::i;:::-;28004:139;;27902:248;;;:::o;28156:419::-;;28360:2;28349:9;28345:18;28337:26;;28409:9;28403:4;28399:20;28395:1;28384:9;28380:17;28373:47;28437:131;28563:4;28437:131;:::i;:::-;28429:139;;28327:248;;;:::o;28581:419::-;;28785:2;28774:9;28770:18;28762:26;;28834:9;28828:4;28824:20;28820:1;28809:9;28805:17;28798:47;28862:131;28988:4;28862:131;:::i;:::-;28854:139;;28752:248;;;:::o;29006:419::-;;29210:2;29199:9;29195:18;29187:26;;29259:9;29253:4;29249:20;29245:1;29234:9;29230:17;29223:47;29287:131;29413:4;29287:131;:::i;:::-;29279:139;;29177:248;;;:::o;29431:419::-;;29635:2;29624:9;29620:18;29612:26;;29684:9;29678:4;29674:20;29670:1;29659:9;29655:17;29648:47;29712:131;29838:4;29712:131;:::i;:::-;29704:139;;29602:248;;;:::o;29856:419::-;;30060:2;30049:9;30045:18;30037:26;;30109:9;30103:4;30099:20;30095:1;30084:9;30080:17;30073:47;30137:131;30263:4;30137:131;:::i;:::-;30129:139;;30027:248;;;:::o;30281:419::-;;30485:2;30474:9;30470:18;30462:26;;30534:9;30528:4;30524:20;30520:1;30509:9;30505:17;30498:47;30562:131;30688:4;30562:131;:::i;:::-;30554:139;;30452:248;;;:::o;30706:419::-;;30910:2;30899:9;30895:18;30887:26;;30959:9;30953:4;30949:20;30945:1;30934:9;30930:17;30923:47;30987:131;31113:4;30987:131;:::i;:::-;30979:139;;30877:248;;;:::o;31131:419::-;;31335:2;31324:9;31320:18;31312:26;;31384:9;31378:4;31374:20;31370:1;31359:9;31355:17;31348:47;31412:131;31538:4;31412:131;:::i;:::-;31404:139;;31302:248;;;:::o;31556:419::-;;31760:2;31749:9;31745:18;31737:26;;31809:9;31803:4;31799:20;31795:1;31784:9;31780:17;31773:47;31837:131;31963:4;31837:131;:::i;:::-;31829:139;;31727:248;;;:::o;31981:419::-;;32185:2;32174:9;32170:18;32162:26;;32234:9;32228:4;32224:20;32220:1;32209:9;32205:17;32198:47;32262:131;32388:4;32262:131;:::i;:::-;32254:139;;32152:248;;;:::o;32406:419::-;;32610:2;32599:9;32595:18;32587:26;;32659:9;32653:4;32649:20;32645:1;32634:9;32630:17;32623:47;32687:131;32813:4;32687:131;:::i;:::-;32679:139;;32577:248;;;:::o;32831:419::-;;33035:2;33024:9;33020:18;33012:26;;33084:9;33078:4;33074:20;33070:1;33059:9;33055:17;33048:47;33112:131;33238:4;33112:131;:::i;:::-;33104:139;;33002:248;;;:::o;33256:419::-;;33460:2;33449:9;33445:18;33437:26;;33509:9;33503:4;33499:20;33495:1;33484:9;33480:17;33473:47;33537:131;33663:4;33537:131;:::i;:::-;33529:139;;33427:248;;;:::o;33681:419::-;;33885:2;33874:9;33870:18;33862:26;;33934:9;33928:4;33924:20;33920:1;33909:9;33905:17;33898:47;33962:131;34088:4;33962:131;:::i;:::-;33954:139;;33852:248;;;:::o;34106:343::-;;34297:3;34286:9;34282:19;34274:27;;34311:131;34439:1;34428:9;34424:17;34415:6;34311:131;:::i;:::-;34264:185;;;;:::o;34455:222::-;;34586:2;34575:9;34571:18;34563:26;;34599:71;34667:1;34656:9;34652:17;34643:6;34599:71;:::i;:::-;34553:124;;;;:::o;34683:129::-;;34744:20;;:::i;:::-;34734:30;;34773:33;34801:4;34793:6;34773:33;:::i;:::-;34724:88;;;:::o;34818:75::-;;34884:2;34878:9;34868:19;;34858:35;:::o;34899:311::-;;35066:18;35058:6;35055:30;35052:2;;;35088:18;;:::i;:::-;35052:2;35138:4;35130:6;35126:17;35118:25;;35198:4;35192;35188:15;35180:23;;34981:229;;;:::o;35216:311::-;;35383:18;35375:6;35372:30;35369:2;;;35405:18;;:::i;:::-;35369:2;35455:4;35447:6;35443:17;35435:25;;35515:4;35509;35505:15;35497:23;;35298:229;;;:::o;35533:98::-;;35618:5;35612:12;35602:22;;35591:40;;;:::o;35637:99::-;;35723:5;35717:12;35707:22;;35696:40;;;:::o;35742:147::-;;35880:3;35865:18;;35855:34;;;;:::o;35895:169::-;;36013:6;36008:3;36001:19;36053:4;36048:3;36044:14;36029:29;;35991:73;;;;:::o;36070:305::-;;36129:20;36147:1;36129:20;:::i;:::-;36124:25;;36163:20;36181:1;36163:20;:::i;:::-;36158:25;;36317:1;36249:66;36245:74;36242:1;36239:81;36236:2;;;36323:18;;:::i;:::-;36236:2;36367:1;36364;36360:9;36353:16;;36114:261;;;;:::o;36381:185::-;;36438:20;36456:1;36438:20;:::i;:::-;36433:25;;36472:20;36490:1;36472:20;:::i;:::-;36467:25;;36511:1;36501:2;;36516:18;;:::i;:::-;36501:2;36558:1;36555;36551:9;36546:14;;36423:143;;;;:::o;36572:348::-;;36635:20;36653:1;36635:20;:::i;:::-;36630:25;;36669:20;36687:1;36669:20;:::i;:::-;36664:25;;36857:1;36789:66;36785:74;36782:1;36779:81;36774:1;36767:9;36760:17;36756:105;36753:2;;;36864:18;;:::i;:::-;36753:2;36912:1;36909;36905:9;36894:20;;36620:300;;;;:::o;36926:191::-;;36986:20;37004:1;36986:20;:::i;:::-;36981:25;;37020:20;37038:1;37020:20;:::i;:::-;37015:25;;37059:1;37056;37053:8;37050:2;;;37064:18;;:::i;:::-;37050:2;37109:1;37106;37102:9;37094:17;;36971:146;;;;:::o;37123:96::-;;37189:24;37207:5;37189:24;:::i;:::-;37178:35;;37168:51;;;:::o;37225:90::-;;37302:5;37295:13;37288:21;37277:32;;37267:48;;;:::o;37321:126::-;;37398:42;37391:5;37387:54;37376:65;;37366:81;;;:::o;37453:77::-;;37519:5;37508:16;;37498:32;;;:::o;37536:307::-;37604:1;37614:113;37628:6;37625:1;37622:13;37614:113;;;37713:1;37708:3;37704:11;37698:18;37694:1;37689:3;37685:11;37678:39;37650:2;37647:1;37643:10;37638:15;;37614:113;;;37745:6;37742:1;37739:13;37736:2;;;37825:1;37816:6;37811:3;37807:16;37800:27;37736:2;37585:258;;;;:::o;37849:281::-;37932:27;37954:4;37932:27;:::i;:::-;37924:6;37920:40;38062:6;38050:10;38047:22;38026:18;38014:10;38011:34;38008:62;38005:2;;;38073:18;;:::i;:::-;38005:2;38113:10;38109:2;38102:22;37892:238;;;:::o;38136:233::-;;38198:24;38216:5;38198:24;:::i;:::-;38189:33;;38244:66;38237:5;38234:77;38231:2;;;38314:18;;:::i;:::-;38231:2;38361:1;38354:5;38350:13;38343:20;;38179:190;;;:::o;38375:180::-;38423:77;38420:1;38413:88;38520:4;38517:1;38510:15;38544:4;38541:1;38534:15;38561:180;38609:77;38606:1;38599:88;38706:4;38703:1;38696:15;38730:4;38727:1;38720:15;38747:180;38795:77;38792:1;38785:88;38892:4;38889:1;38882:15;38916:4;38913:1;38906:15;38933:102;;39025:2;39021:7;39016:2;39009:5;39005:14;39001:28;38991:38;;38981:54;;;:::o;39041:242::-;39181:34;39177:1;39169:6;39165:14;39158:58;39250:25;39245:2;39237:6;39233:15;39226:50;39147:136;:::o;39289:172::-;39429:24;39425:1;39417:6;39413:14;39406:48;39395:66;:::o;39467:225::-;39607:34;39603:1;39595:6;39591:14;39584:58;39676:8;39671:2;39663:6;39659:15;39652:33;39573:119;:::o;39698:221::-;39838:34;39834:1;39826:6;39822:14;39815:58;39907:4;39902:2;39894:6;39890:15;39883:29;39804:115;:::o;39925:177::-;40065:29;40061:1;40053:6;40049:14;40042:53;40031:71;:::o;40108:251::-;40248:34;40244:1;40236:6;40232:14;40225:58;40317:34;40312:2;40304:6;40300:15;40293:59;40214:145;:::o;40365:177::-;40505:29;40501:1;40493:6;40489:14;40482:53;40471:71;:::o;40548:168::-;40688:20;40684:1;40676:6;40672:14;40665:44;40654:62;:::o;40722:225::-;40862:34;40858:1;40850:6;40846:14;40839:58;40931:8;40926:2;40918:6;40914:15;40907:33;40828:119;:::o;40953:174::-;41093:26;41089:1;41081:6;41077:14;41070:50;41059:68;:::o;41133:221::-;41273:34;41269:1;41261:6;41257:14;41250:58;41342:4;41337:2;41329:6;41325:15;41318:29;41239:115;:::o;41360:179::-;41500:31;41496:1;41488:6;41484:14;41477:55;41466:73;:::o;41545:181::-;41685:33;41681:1;41673:6;41669:14;41662:57;41651:75;:::o;41732:223::-;41872:34;41868:1;41860:6;41856:14;41849:58;41941:6;41936:2;41928:6;41924:15;41917:31;41838:117;:::o;41961:220::-;42101:34;42097:1;42089:6;42085:14;42078:58;42170:3;42165:2;42157:6;42153:15;42146:28;42067:114;:::o;42187:230::-;42327:34;42323:1;42315:6;42311:14;42304:58;42396:13;42391:2;42383:6;42379:15;42372:38;42293:124;:::o;42423:182::-;42563:34;42559:1;42551:6;42547:14;42540:58;42529:76;:::o;42611:222::-;42751:34;42747:1;42739:6;42735:14;42728:58;42820:5;42815:2;42807:6;42803:15;42796:30;42717:116;:::o;42839:170::-;42979:22;42975:1;42967:6;42963:14;42956:46;42945:64;:::o;43015:237::-;43155:34;43151:1;43143:6;43139:14;43132:58;43224:20;43219:2;43211:6;43207:15;43200:45;43121:131;:::o;43258:308::-;43398:34;43394:1;43386:6;43382:14;43375:58;43467:34;43462:2;43454:6;43450:15;43443:59;43536:22;43531:2;43523:6;43519:15;43512:47;43364:202;:::o;43572:171::-;43712:23;43708:1;43700:6;43696:14;43689:47;43678:65;:::o;43749:179::-;43889:31;43885:1;43877:6;43873:14;43866:55;43855:73;:::o;43934:234::-;44074:34;44070:1;44062:6;44058:14;44051:58;44143:17;44138:2;44130:6;44126:15;44119:42;44040:128;:::o;44174:292::-;44314:34;44310:1;44302:6;44298:14;44291:58;44383:34;44378:2;44370:6;44366:15;44359:59;44452:6;44447:2;44439:6;44435:15;44428:31;44280:186;:::o;44472:229::-;44612:34;44608:1;44600:6;44596:14;44589:58;44681:12;44676:2;44668:6;44664:15;44657:37;44578:123;:::o;44707:181::-;44847:33;44843:1;44835:6;44831:14;44824:57;44813:75;:::o;44894:179::-;45034:31;45030:1;45022:6;45018:14;45011:55;45000:73;:::o;45079:181::-;45219:33;45215:1;45207:6;45203:14;45196:57;45185:75;:::o;45266:175::-;45406:27;45402:1;45394:6;45390:14;45383:51;45372:69;:::o;45447:122::-;45520:24;45538:5;45520:24;:::i;:::-;45513:5;45510:35;45500:2;;45559:1;45556;45549:12;45500:2;45490:79;:::o;45575:116::-;45645:21;45660:5;45645:21;:::i;:::-;45638:5;45635:32;45625:2;;45681:1;45678;45671:12;45625:2;45615:76;:::o;45697:122::-;45770:24;45788:5;45770:24;:::i;:::-;45763:5;45760:35;45750:2;;45809:1;45806;45799:12;45750:2;45740:79;:::o
Swarm Source
ipfs://13d5aba5ee9bd9f309cf95fb385c22fc9da2e31be5c61b75e32ae8ab2fbc61dd
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.