My Name Tag:
Not Available, login to update
[ Download CSV Export ]
OVERVIEW
Community & Marketing Time-lock Contract - 1.Contract Name:
HEC_Community_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_Community_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_Community_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
60a06040526000600360006101000a81548160ff02191690831515021790555060006006556000600755600060085560006009556000600a553480156200004557600080fd5b5060405162004abc38038062004abc83398181016040528101906200006b91906200024e565b806200008c620000806200016b60201b60201c565b6200017360201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ce57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060006002819055506000600360006101000a81548160ff02191690831515021790555050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200016457600080fd5b50620002c8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200024881620002ae565b92915050565b6000602082840312156200026157600080fd5b6000620002718482850162000237565b91505092915050565b600062000287826200028e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002b9816200027a565b8114620002c557600080fd5b50565b60805160601c6147b26200030a600039600081816104bb015281816107b501528181610f4e015281816111ab0152818161125b015261143401526147b26000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063715018a6116100a25780639dd509cb116100715780639dd509cb146102b2578063a6e1d016146102e2578063af38d75714610300578063bf2a1c081461031e578063f2fde38b1461033c57610116565b8063715018a6146102375780637ad71f72146102415780637cc1f867146102765780638da5cb5b1461029457610116565b80634e71d92d116100e95780634e71d92d146101b7578063598f89fc146101c15780635b0a3843146101df578063639ab82f146101e95780636db9a96f1461021957610116565b806310764cd41461011b5780631d1309351461014b5780632fba2c85146101695780633b5784f614610187575b600080fd5b610135600480360381019061013091906131fe565b610358565b6040516101429190613859565b60405180910390f35b61015361069c565b6040516101609190613859565b60405180910390f35b610171610735565b60405161017e9190613c71565b60405180910390f35b6101a1600480360381019061019c91906130ad565b610861565b6040516101ae9190613c71565b60405180910390f35b6101bf610879565b005b6101c9610fee565b6040516101d69190613859565b60405180910390f35b6101e761108e565b005b61020360048036038101906101fe91906130d6565b6112a9565b6040516102109190613859565b60405180910390f35b610221611432565b60405161022e91906137b4565b60405180910390f35b61023f611456565b005b61025b600480360381019061025691906131ac565b6114de565b60405161026d969594939291906137f8565b60405180910390f35b61027e61154a565b60405161028b9190613c56565b60405180910390f35b61029c61160a565b6040516102a991906137b4565b60405180910390f35b6102cc60048036038101906102c79190613117565b611633565b6040516102d99190613859565b60405180910390f35b6102ea611842565b6040516102f79190613859565b60405180910390f35b6103086118e2565b6040516103159190613c71565b60405180910390f35b610326611b6d565b6040516103339190613c71565b60405180910390f35b610356600480360381019061035191906130ad565b611cd4565b005b6000610362611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661038061160a565b73ffffffffffffffffffffffffffffffffffffffff16146103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cd90613a96565b60405180910390fd5b600360009054906101000a900460ff16610425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041c90613ab6565b60405180910390fd5b60008611610468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045f90613af6565b60405180910390fd5b60148411156104ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a390613b96565b60405180910390fd5b600060085411156105a35760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161051291906137b4565b60206040518083038186803b15801561052a57600080fd5b505afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056291906131d5565b146105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059990613b16565b60405180910390fd5b5b428510156105e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105dd90613a36565b60405180910390fd5b84831015610629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062090613b76565b60405180910390fd5b8282101561066c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066390613896565b60405180910390fd5b846008819055508260098190555081600a8190555085600681905550836007819055506001905095945050505050565b60006106a6611dcc565b73ffffffffffffffffffffffffffffffffffffffff166106c461160a565b73ffffffffffffffffffffffffffffffffffffffff161461071a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071190613a96565b60405180910390fd5b6000600360009054906101000a900460ff1690508091505090565b600061073f611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661075d61160a565b73ffffffffffffffffffffffffffffffffffffffff16146107b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107aa90613a96565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161080c91906137b4565b60206040518083038186803b15801561082457600080fd5b505afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c91906131d5565b905090565b60046020528060005260406000206000915090505481565b600260015414156108bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b690613bd6565b60405180910390fd5b600260018190555060001515600360009054906101000a900460ff1615151461091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a16565b60405180910390fd5b6000610927611dd4565b11610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e906139f6565b60405180910390fd5b6000600580549050116109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613ad6565b60405180910390fd5b6109b7611dd4565b42116109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef90613976565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110610a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613956565b60405180910390fd5b6000610bc060058381548110610b54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015460058481548110610ba0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154611dde90919063ffffffff16565b11610c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf7906138f6565b60405180910390fd5b6000610c0b82611e3c565b9050600060058381548110610c49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015490506000610c728284611dde90919063ffffffff16565b905060008111610cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cae90613a76565b60405180910390fd5b6000610d0e60058681548110610cf6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b9050610d6e8460058781548110610d4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015461204590919063ffffffff16565b60058681548110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550610e1b8360058781548110610dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461204590919063ffffffff16565b60058681548110610e55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010181905550610edd610e83620151808361208f90919063ffffffff16565b60058781548110610ebd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050154611dde90919063ffffffff16565b60058681548110610f17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160050181905550610f418260025461204590919063ffffffff16565b600281905550610f9233837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724183604051610fd89190613c71565b60405180910390a2505050505060018081905550565b6000610ff8611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661101661160a565b73ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106390613a96565b60405180910390fd5b6001600360006101000a81548160ff0219169083151502179055506001905090565b600260015414156110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90613bd6565b60405180910390fd5b60026001819055506110e4611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661110261160a565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90613a96565b60405180910390fd5b600360009054906101000a900460ff166111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90613ab6565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161120291906137b4565b60206040518083038186803b15801561121a57600080fd5b505afa15801561122e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125291906131d5565b905061129f33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661210a9092919063ffffffff16565b5060018081905550565b6000600260015414156112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e890613bd6565b60405180910390fd5b6002600181905550611301611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661131f61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90613a96565b60405180910390fd5b60008251116113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906138b6565b60405180910390fd5b60005b82518110156114215761140e838281518110611401577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151612190565b808061141990613efc565b9150506113bc565b506001905060018081905550919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61145e611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661147c61160a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613a96565b60405180910390fd5b6114dc60006125d7565b565b600581815481106114ee57600080fd5b90600052602060002090600602016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154905086565b611552612efe565b61155a611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661157861160a565b73ffffffffffffffffffffffffffffffffffffffff16146115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590613a96565b60405180910390fd5b60006040518060a0016040528060085481526020016009548152602001600a548152602001600754815260200160065481525090508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006002600154141561167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613bd6565b60405180910390fd5b600260018190555061168b611dcc565b73ffffffffffffffffffffffffffffffffffffffff166116a961160a565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613a96565b60405180910390fd5b8151835114611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613c36565b60405180910390fd5b6000835111611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177e906138b6565b60405180910390fd5b60005b83518110156118305761181d8482815181106117cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848381518110611810577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161269b565b808061182890613efc565b91505061178a565b50600190506001808190555092915050565b600061184c611dcc565b73ffffffffffffffffffffffffffffffffffffffff1661186a61160a565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b790613a96565b60405180910390fd5b6000600360006101000a81548160ff0219169083151502179055506001905090565b6000801515600360009054906101000a900460ff16151514611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090613a16565b60405180910390fd5b6000611943611dd4565b11611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a906139f6565b60405180910390fd5b6000600580549050116119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290613ad6565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff1660058281548110611a60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90613976565b60405180910390fd5b611af0611dd4565b4211611b00576000915050611b6a565b611b66611b0c82611e3c565b60058381548110611b46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611dde90919063ffffffff16565b9150505b90565b6000611b77611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611b9561160a565b73ffffffffffffffffffffffffffffffffffffffff1614611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be290613a96565b60405180910390fd5b6000805b600580549050811015611ccc57611cb760058281548110611c39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160010154611ca960058481548110611c88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015485611dde90919063ffffffff16565b611dde90919063ffffffff16565b91508080611cc490613efc565b915050611bef565b508091505090565b611cdc611dcc565b73ffffffffffffffffffffffffffffffffffffffff16611cfa61160a565b73ffffffffffffffffffffffffffffffffffffffff1614611d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4790613a96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db7906138d6565b60405180910390fd5b611dc9816125d7565b50565b600033905090565b6000600854905090565b6000808284611ded9190613d3b565b905083811015611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2990613916565b60405180910390fd5b8091505092915050565b600080611e9460058481548110611e7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016005015442612002565b90506000611ef68260058681548110611ed6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016004015461208f90919063ffffffff16565b9050611f00612b58565b421115611f565760058481548110611f41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b60058481548110611f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020154811115611ff85760058481548110611fe3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015490505b8092505050919050565b6000828211612014576000905061203f565b61203c6201518061202e858561204590919063ffffffff16565b612b6290919063ffffffff16565b90505b92915050565b600061208783836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250612bac565b905092915050565b6000808314156120a25760009050612104565b600082846120b09190613dc2565b90508284826120bf9190613d91565b146120ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f690613a56565b60405180910390fd5b809150505b92915050565b61218b8363a9059cbb60e01b84846040516024016121299291906137cf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612c10565b505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506005818154811061220e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a490613c16565b60405180910390fd5b61236a600582815481106122ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001015461235c60058481548110612339577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016002015460025461204590919063ffffffff16565b61204590919063ffffffff16565b6002819055506000600582815481106123ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060058281548110612437577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160040181905550600060058281548110612488577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060060201600501819055506000600582815481106124d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016003018190555060006005828154811061252a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600602016001018190555060006005828154811061257b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160020181905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600580549050111561281957600081111561273c576000612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272e906139b6565b60405180910390fd5b612818565b6005600081548110612777577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906006020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280e906139b6565b60405180910390fd5b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612889576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612880906139d6565b60405180910390fd5b600082116128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c390613b36565b60405180910390fd5b6128d4612cd7565b6128e983600254611dde90919063ffffffff16565b111561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292190613936565b60405180910390fd5b6000612944612937612ce1565b61293f612b58565b612002565b905060008111612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090613bf6565b60405180910390fd5b60006129b860646129aa61299b612ceb565b8761208f90919063ffffffff16565b612b6290919063ffffffff16565b905060006129cf828661204590919063ffffffff16565b905060006129e68483612b6290919063ffffffff16565b905060056040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001888152602001838152602001612a31612ce1565b815250908060018154018082558091505060019003906000526020600020906006020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501555050612af1600160058054905061204590919063ffffffff16565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612b4986600254611dde90919063ffffffff16565b60028190555050505050505050565b6000600a54905090565b6000612ba483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612cf5565b905092915050565b6000838311158290612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb9190613874565b60405180910390fd5b5060008385612c039190613e1c565b9050809150509392505050565b6000612c72826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612d589092919063ffffffff16565b9050600081511115612cd25780806020019051810190612c929190613183565b612cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc890613bb6565b60405180910390fd5b5b505050565b6000600654905090565b6000600954905090565b6000600754905090565b60008083118290612d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d339190613874565b60405180910390fd5b5060008385612d4b9190613d91565b9050809150509392505050565b6060612d678484600085612d70565b90509392505050565b606082471015612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac90613996565b60405180910390fd5b612dbe85612e84565b612dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df490613b56565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e26919061379d565b60006040518083038185875af1925050503d8060008114612e63576040519150601f19603f3d011682016040523d82523d6000602084013e612e68565b606091505b5091509150612e78828286612e97565b92505050949350505050565b600080823b905060008111915050919050565b60608315612ea757829050612ef7565b600083511115612eba5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eee9190613874565b60405180910390fd5b9392505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000612f40612f3b84613cb1565b613c8c565b90508083825260208201905082856020860282011115612f5f57600080fd5b60005b85811015612f8f5781612f758882613005565b845260208401935060208301925050600181019050612f62565b5050509392505050565b6000612fac612fa784613cdd565b613c8c565b90508083825260208201905082856020860282011115612fcb57600080fd5b60005b85811015612ffb5781612fe18882613083565b845260208401935060208301925050600181019050612fce565b5050509392505050565b60008135905061301481614737565b92915050565b600082601f83011261302b57600080fd5b813561303b848260208601612f2d565b91505092915050565b600082601f83011261305557600080fd5b8135613065848260208601612f99565b91505092915050565b60008151905061307d8161474e565b92915050565b60008135905061309281614765565b92915050565b6000815190506130a781614765565b92915050565b6000602082840312156130bf57600080fd5b60006130cd84828501613005565b91505092915050565b6000602082840312156130e857600080fd5b600082013567ffffffffffffffff81111561310257600080fd5b61310e8482850161301a565b91505092915050565b6000806040838503121561312a57600080fd5b600083013567ffffffffffffffff81111561314457600080fd5b6131508582860161301a565b925050602083013567ffffffffffffffff81111561316d57600080fd5b61317985828601613044565b9150509250929050565b60006020828403121561319557600080fd5b60006131a38482850161306e565b91505092915050565b6000602082840312156131be57600080fd5b60006131cc84828501613083565b91505092915050565b6000602082840312156131e757600080fd5b60006131f584828501613098565b91505092915050565b600080600080600060a0868803121561321657600080fd5b600061322488828901613083565b955050602061323588828901613083565b945050604061324688828901613083565b935050606061325788828901613083565b925050608061326888828901613083565b9150509295509295909350565b61327e81613e50565b82525050565b61328d81613e62565b82525050565b600061329e82613d09565b6132a88185613d1f565b93506132b8818560208601613e98565b80840191505092915050565b60006132cf82613d14565b6132d98185613d2a565b93506132e9818560208601613e98565b6132f281613fd2565b840191505092915050565b600061330a603783613d2a565b915061331582613fe3565b604082019050919050565b600061332d601683613d2a565b915061333882614032565b602082019050919050565b6000613350602683613d2a565b915061335b8261405b565b604082019050919050565b6000613373602283613d2a565b915061337e826140aa565b604082019050919050565b6000613396601b83613d2a565b91506133a1826140f9565b602082019050919050565b60006133b9604083613d2a565b91506133c482614122565b604082019050919050565b60006133dc601b83613d2a565b91506133e782614171565b602082019050919050565b60006133ff601283613d2a565b915061340a8261419a565b602082019050919050565b6000613422602683613d2a565b915061342d826141c3565b604082019050919050565b6000613445601883613d2a565b915061345082614212565b602082019050919050565b6000613468602283613d2a565b91506134738261423b565b604082019050919050565b600061348b601d83613d2a565b91506134968261428a565b602082019050919050565b60006134ae601f83613d2a565b91506134b9826142b3565b602082019050919050565b60006134d1602483613d2a565b91506134dc826142dc565b604082019050919050565b60006134f4602183613d2a565b91506134ff8261432b565b604082019050919050565b6000613517602b83613d2a565b91506135228261437a565b604082019050919050565b600061353a602083613d2a565b9150613545826143c9565b602082019050919050565b600061355d602383613d2a565b9150613568826143f2565b604082019050919050565b6000613580601483613d2a565b915061358b82614441565b602082019050919050565b60006135a3603283613d2a565b91506135ae8261446a565b604082019050919050565b60006135c6605483613d2a565b91506135d1826144b9565b606082019050919050565b60006135e9601583613d2a565b91506135f48261452e565b602082019050919050565b600061360c601d83613d2a565b915061361782614557565b602082019050919050565b600061362f602f83613d2a565b915061363a82614580565b604082019050919050565b6000613652604483613d2a565b915061365d826145cf565b606082019050919050565b6000613675602a83613d2a565b915061368082614644565b604082019050919050565b6000613698601f83613d2a565b91506136a382614693565b602082019050919050565b60006136bb601d83613d2a565b91506136c6826146bc565b602082019050919050565b60006136de601f83613d2a565b91506136e9826146e5565b602082019050919050565b6000613701601983613d2a565b915061370c8261470e565b602082019050919050565b60a08201600082015161372d600085018261377f565b506020820151613740602085018261377f565b506040820151613753604085018261377f565b506060820151613766606085018261377f565b506080820151613779608085018261377f565b50505050565b61378881613e8e565b82525050565b61379781613e8e565b82525050565b60006137a98284613293565b915081905092915050565b60006020820190506137c96000830184613275565b92915050565b60006040820190506137e46000830185613275565b6137f1602083018461378e565b9392505050565b600060c08201905061380d6000830189613275565b61381a602083018861378e565b613827604083018761378e565b613834606083018661378e565b613841608083018561378e565b61384e60a083018461378e565b979650505050505050565b600060208201905061386e6000830184613284565b92915050565b6000602082019050818103600083015261388e81846132c4565b905092915050565b600060208201905081810360008301526138af816132fd565b9050919050565b600060208201905081810360008301526138cf81613320565b9050919050565b600060208201905081810360008301526138ef81613343565b9050919050565b6000602082019050818103600083015261390f81613366565b9050919050565b6000602082019050818103600083015261392f81613389565b9050919050565b6000602082019050818103600083015261394f816133ac565b9050919050565b6000602082019050818103600083015261396f816133cf565b9050919050565b6000602082019050818103600083015261398f816133f2565b9050919050565b600060208201905081810360008301526139af81613415565b9050919050565b600060208201905081810360008301526139cf81613438565b9050919050565b600060208201905081810360008301526139ef8161345b565b9050919050565b60006020820190508181036000830152613a0f8161347e565b9050919050565b60006020820190508181036000830152613a2f816134a1565b9050919050565b60006020820190508181036000830152613a4f816134c4565b9050919050565b60006020820190508181036000830152613a6f816134e7565b9050919050565b60006020820190508181036000830152613a8f8161350a565b9050919050565b60006020820190508181036000830152613aaf8161352d565b9050919050565b60006020820190508181036000830152613acf81613550565b9050919050565b60006020820190508181036000830152613aef81613573565b9050919050565b60006020820190508181036000830152613b0f81613596565b9050919050565b60006020820190508181036000830152613b2f816135b9565b9050919050565b60006020820190508181036000830152613b4f816135dc565b9050919050565b60006020820190508181036000830152613b6f816135ff565b9050919050565b60006020820190508181036000830152613b8f81613622565b9050919050565b60006020820190508181036000830152613baf81613645565b9050919050565b60006020820190508181036000830152613bcf81613668565b9050919050565b60006020820190508181036000830152613bef8161368b565b9050919050565b60006020820190508181036000830152613c0f816136ae565b9050919050565b60006020820190508181036000830152613c2f816136d1565b9050919050565b60006020820190508181036000830152613c4f816136f4565b9050919050565b600060a082019050613c6b6000830184613717565b92915050565b6000602082019050613c86600083018461378e565b92915050565b6000613c96613ca7565b9050613ca28282613ecb565b919050565b6000604051905090565b600067ffffffffffffffff821115613ccc57613ccb613fa3565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613cf857613cf7613fa3565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000613d4682613e8e565b9150613d5183613e8e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d8657613d85613f45565b5b828201905092915050565b6000613d9c82613e8e565b9150613da783613e8e565b925082613db757613db6613f74565b5b828204905092915050565b6000613dcd82613e8e565b9150613dd883613e8e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e1157613e10613f45565b5b828202905092915050565b6000613e2782613e8e565b9150613e3283613e8e565b925082821015613e4557613e44613f45565b5b828203905092915050565b6000613e5b82613e6e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015613eb6578082015181840152602081019050613e9b565b83811115613ec5576000848401525b50505050565b613ed482613fd2565b810181811067ffffffffffffffff82111715613ef357613ef2613fa3565b5b80604052505050565b6000613f0782613e8e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f3a57613f39613f45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f56657374696e6720456e642074696d652063616e6e6f74206265206561726c6960008201527f6572207468616e20436c69666620456e642074696d652e000000000000000000602082015250565b7f41727261792063616e6e6f7420626520656d7074792e00000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e6365206c65667420746f20636c616960008201527f6d2e000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f43616e6e6f74206164642074686973206465627420616d6f756e74206475652060008201527f746f207468652062616c616e6365206f66207468697320436f6e74726163742e602082015250565b7f436c61696d2072657175657374206973206e6f742076616c69642e0000000000600082015250565b7f52657175657374206e6f742076616c69642e0000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4164647265737320616c726561647920696e206c6973742e0000000000000000600082015250565b7f526563697069656e7420616464726573732063616e6e6f7420626520656d707460008201527f792e000000000000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206e6f7420696e697469616c697a6564207965742e000000600082015250565b7f436f6e747261637420697320696e2073757370656e6465642073746174652e00600082015250565b7f5447452074696d652063616e6e6f74206265206561726c696572207468616e2060008201527f6e6f772e00000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f5468657265206973206e6f2062616c616e636520746f20636c61696d2061742060008201527f746865206d6f6d656e742e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206973206e6f7420696e2073757370656e6465642073746160008201527f74652e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20726563697069656e747320666f756e642e000000000000000000000000600082015250565b7f496e697469616c20436f6e74726163742042616c616e63652073686f756c642060008201527f62652067726561746572207468616e20302e0000000000000000000000000000602082015250565b7f436f6e747261637420616c72656164792068617320746f6b656e7320616e642060008201527f54474520616c7265616479207365742e2043616e6e6f74206368616e6765206460208201527f617465732061742074686973206d6f6d656e742e000000000000000000000000604082015250565b7f546f6b656e20616d6f756e7420696e76616c69642e0000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f436c69666620456e642074696d652063616e6e6f74206265206561726c69657260008201527f207468616e205447452074696d652e0000000000000000000000000000000000602082015250565b7f54474520556e6c6f636b2050657263656e746167652063616e6e6f742062652060008201527f67726561746572207468616e20323025207065722048654320546f6b656e6f6d60208201527f6963732e00000000000000000000000000000000000000000000000000000000604082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f556e65787065637465642076657374696e672064617920636f756e742e000000600082015250565b7f526563697069656e7420696e64657820646f6573206e6f74206d617463682e00600082015250565b7f41727261792073697a657320646f206e6f74206d617463682e00000000000000600082015250565b61474081613e50565b811461474b57600080fd5b50565b61475781613e62565b811461476257600080fd5b50565b61476e81613e8e565b811461477957600080fd5b5056fea26469706673582212201858a6a73cc4052ab49598308409d742ef38a319848ce39b5eedecdd3bbaa46d64736f6c63430008020033000000000000000000000000c7f4debc8072e23fe9259a5c0398326d8efb7f5c
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:3715:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40702: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;:::-;;;;;;;;39325: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;:::-;;40702:1326;40907:4;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40932:7:::1;;;;;;;;;;;40924:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41024:1;40998:23;:27;40990:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41123:2;41099:20;:26;;41091:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;41230:1;41213:14;;:18;41209:193;;;41300:1;41264:3;41256:23;;;41289:4;41256:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;41248:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;41209:193;41445:15;41420:13;:41;;41412:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;41543:13;41521:18;:35;;41513:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41651:18;41627:20;:42;;41619:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41759:13;41742:14;:30;;;;41806:18;41783:20;:41;;;;41860:20;41835:22;:45;;;;41918:23;41891:24;:50;;;;41976:20;41952:21;:44;;;;42016:4;42009:11;;40702: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;39325:499::-;39386:19;;:::i;:::-;16547:12;:10;:12::i;:::-;16536:23;;:7;:5;:7::i;:::-;:23;;;16528:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39419:23:::1;39445:340;;;;;;;;39495:14;;39445:340;;;;39551:20;;39445:340;;;;39615:22;;39445:340;;;;39681:21;;39445:340;;;;39749:24;;39445:340;;::::0;39419:366:::1;;39813:3;39806:10;;;39325: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;39840:107::-;39898:7;39925:14;;39918:21;;39840: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;40215:121::-;40280:7;40306:22;;40299:29;;40215: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;39955:127::-;40023:7;40050:24;;40043:31;;39955:127;:::o;40090:117::-;40153:7;40179:20;;40172:27;;40090:117;:::o;40344:120::-;40409:7;40435:21;;40428:28;;40344: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;17855:1108::-;18012:4;18007:3;18003:14;18107:4;18100:5;18096:16;18090:23;18126:63;18183:4;18178:3;18174:14;18160:12;18126:63;:::i;:::-;18027:172;18294:4;18287:5;18283:16;18277:23;18313:63;18370:4;18365:3;18361:14;18347:12;18313:63;:::i;:::-;18209:177;18483:4;18476:5;18472:16;18466:23;18502:63;18559:4;18554:3;18550:14;18536:12;18502:63;:::i;:::-;18396:179;18672:4;18665:5;18661:16;18655:23;18691:63;18748:4;18743:3;18739:14;18725:12;18691:63;:::i;:::-;18585:179;18864:4;18857:5;18853:16;18847:23;18883:63;18940:4;18935:3;18931:14;18917:12;18883:63;:::i;:::-;18774:182;17981:982;;;:::o;18969:108::-;19046:24;19064:5;19046:24;:::i;:::-;19041:3;19034:37;19024:53;;:::o;19083:118::-;19170:24;19188:5;19170:24;:::i;:::-;19165:3;19158:37;19148:53;;:::o;19207:271::-;;19359:93;19448:3;19439:6;19359:93;:::i;:::-;19352:100;;19469:3;19462:10;;19341:137;;;;:::o;19484:222::-;;19615:2;19604:9;19600:18;19592:26;;19628:71;19696:1;19685:9;19681:17;19672:6;19628:71;:::i;:::-;19582:124;;;;:::o;19712:332::-;;19871:2;19860:9;19856:18;19848:26;;19884:71;19952:1;19941:9;19937:17;19928:6;19884:71;:::i;:::-;19965:72;20033:2;20022:9;20018:18;20009:6;19965:72;:::i;:::-;19838:206;;;;;:::o;20050:775::-;;20321:3;20310:9;20306:19;20298:27;;20335:71;20403:1;20392:9;20388:17;20379:6;20335:71;:::i;:::-;20416:72;20484:2;20473:9;20469:18;20460:6;20416:72;:::i;:::-;20498;20566:2;20555:9;20551:18;20542:6;20498:72;:::i;:::-;20580;20648:2;20637:9;20633:18;20624:6;20580:72;:::i;:::-;20662:73;20730:3;20719:9;20715:19;20706:6;20662:73;:::i;:::-;20745;20813:3;20802:9;20798:19;20789:6;20745:73;:::i;:::-;20288:537;;;;;;;;;:::o;20831:210::-;;20956:2;20945:9;20941:18;20933:26;;20969:65;21031:1;21020:9;21016:17;21007:6;20969:65;:::i;:::-;20923:118;;;;:::o;21047:313::-;;21198:2;21187:9;21183:18;21175:26;;21247:9;21241:4;21237:20;21233:1;21222:9;21218:17;21211:47;21275:78;21348:4;21339:6;21275:78;:::i;:::-;21267:86;;21165:195;;;;:::o;21366:419::-;;21570:2;21559:9;21555:18;21547:26;;21619:9;21613:4;21609:20;21605:1;21594:9;21590:17;21583:47;21647:131;21773:4;21647:131;:::i;:::-;21639:139;;21537:248;;;:::o;21791:419::-;;21995:2;21984:9;21980:18;21972:26;;22044:9;22038:4;22034:20;22030:1;22019:9;22015:17;22008:47;22072:131;22198:4;22072:131;:::i;:::-;22064:139;;21962:248;;;:::o;22216:419::-;;22420:2;22409:9;22405:18;22397:26;;22469:9;22463:4;22459:20;22455:1;22444:9;22440:17;22433:47;22497:131;22623:4;22497:131;:::i;:::-;22489:139;;22387:248;;;:::o;22641:419::-;;22845:2;22834:9;22830:18;22822:26;;22894:9;22888:4;22884:20;22880:1;22869:9;22865:17;22858:47;22922:131;23048:4;22922:131;:::i;:::-;22914:139;;22812:248;;;:::o;23066:419::-;;23270:2;23259:9;23255:18;23247:26;;23319:9;23313:4;23309:20;23305:1;23294:9;23290:17;23283:47;23347:131;23473:4;23347:131;:::i;:::-;23339:139;;23237:248;;;:::o;23491:419::-;;23695:2;23684:9;23680:18;23672:26;;23744:9;23738:4;23734:20;23730:1;23719:9;23715:17;23708:47;23772:131;23898:4;23772:131;:::i;:::-;23764:139;;23662:248;;;:::o;23916:419::-;;24120:2;24109:9;24105:18;24097:26;;24169:9;24163:4;24159:20;24155:1;24144:9;24140:17;24133:47;24197:131;24323:4;24197:131;:::i;:::-;24189:139;;24087:248;;;:::o;24341:419::-;;24545:2;24534:9;24530:18;24522:26;;24594:9;24588:4;24584:20;24580:1;24569:9;24565:17;24558:47;24622:131;24748:4;24622:131;:::i;:::-;24614:139;;24512:248;;;:::o;24766:419::-;;24970:2;24959:9;24955:18;24947:26;;25019:9;25013:4;25009:20;25005:1;24994:9;24990:17;24983:47;25047:131;25173:4;25047:131;:::i;:::-;25039:139;;24937:248;;;:::o;25191:419::-;;25395:2;25384:9;25380:18;25372:26;;25444:9;25438:4;25434:20;25430:1;25419:9;25415:17;25408:47;25472:131;25598:4;25472:131;:::i;:::-;25464:139;;25362:248;;;:::o;25616:419::-;;25820:2;25809:9;25805:18;25797:26;;25869:9;25863:4;25859:20;25855:1;25844:9;25840:17;25833:47;25897:131;26023:4;25897:131;:::i;:::-;25889:139;;25787:248;;;:::o;26041:419::-;;26245:2;26234:9;26230:18;26222:26;;26294:9;26288:4;26284:20;26280:1;26269:9;26265:17;26258:47;26322:131;26448:4;26322:131;:::i;:::-;26314:139;;26212:248;;;:::o;26466:419::-;;26670:2;26659:9;26655:18;26647:26;;26719:9;26713:4;26709:20;26705:1;26694:9;26690:17;26683:47;26747:131;26873:4;26747:131;:::i;:::-;26739:139;;26637:248;;;:::o;26891:419::-;;27095:2;27084:9;27080:18;27072:26;;27144:9;27138:4;27134:20;27130:1;27119:9;27115:17;27108:47;27172:131;27298:4;27172:131;:::i;:::-;27164:139;;27062:248;;;:::o;27316:419::-;;27520:2;27509:9;27505:18;27497:26;;27569:9;27563:4;27559:20;27555:1;27544:9;27540:17;27533:47;27597:131;27723:4;27597:131;:::i;:::-;27589:139;;27487:248;;;:::o;27741:419::-;;27945:2;27934:9;27930:18;27922:26;;27994:9;27988:4;27984:20;27980:1;27969:9;27965:17;27958:47;28022:131;28148:4;28022:131;:::i;:::-;28014:139;;27912:248;;;:::o;28166:419::-;;28370:2;28359:9;28355:18;28347:26;;28419:9;28413:4;28409:20;28405:1;28394:9;28390:17;28383:47;28447:131;28573:4;28447:131;:::i;:::-;28439:139;;28337:248;;;:::o;28591:419::-;;28795:2;28784:9;28780:18;28772:26;;28844:9;28838:4;28834:20;28830:1;28819:9;28815:17;28808:47;28872:131;28998:4;28872:131;:::i;:::-;28864:139;;28762:248;;;:::o;29016:419::-;;29220:2;29209:9;29205:18;29197:26;;29269:9;29263:4;29259:20;29255:1;29244:9;29240:17;29233:47;29297:131;29423:4;29297:131;:::i;:::-;29289:139;;29187:248;;;:::o;29441:419::-;;29645:2;29634:9;29630:18;29622:26;;29694:9;29688:4;29684:20;29680:1;29669:9;29665:17;29658:47;29722:131;29848:4;29722:131;:::i;:::-;29714:139;;29612:248;;;:::o;29866:419::-;;30070:2;30059:9;30055:18;30047:26;;30119:9;30113:4;30109:20;30105:1;30094:9;30090:17;30083:47;30147:131;30273:4;30147:131;:::i;:::-;30139:139;;30037:248;;;:::o;30291:419::-;;30495:2;30484:9;30480:18;30472:26;;30544:9;30538:4;30534:20;30530:1;30519:9;30515:17;30508:47;30572:131;30698:4;30572:131;:::i;:::-;30564:139;;30462:248;;;:::o;30716:419::-;;30920:2;30909:9;30905:18;30897:26;;30969:9;30963:4;30959:20;30955:1;30944:9;30940:17;30933:47;30997:131;31123:4;30997:131;:::i;:::-;30989:139;;30887:248;;;:::o;31141:419::-;;31345:2;31334:9;31330:18;31322:26;;31394:9;31388:4;31384:20;31380:1;31369:9;31365:17;31358:47;31422:131;31548:4;31422:131;:::i;:::-;31414:139;;31312:248;;;:::o;31566:419::-;;31770:2;31759:9;31755:18;31747:26;;31819:9;31813:4;31809:20;31805:1;31794:9;31790:17;31783:47;31847:131;31973:4;31847:131;:::i;:::-;31839:139;;31737:248;;;:::o;31991:419::-;;32195:2;32184:9;32180:18;32172:26;;32244:9;32238:4;32234:20;32230:1;32219:9;32215:17;32208:47;32272:131;32398:4;32272:131;:::i;:::-;32264:139;;32162:248;;;:::o;32416:419::-;;32620:2;32609:9;32605:18;32597:26;;32669:9;32663:4;32659:20;32655:1;32644:9;32640:17;32633:47;32697:131;32823:4;32697:131;:::i;:::-;32689:139;;32587:248;;;:::o;32841:419::-;;33045:2;33034:9;33030:18;33022:26;;33094:9;33088:4;33084:20;33080:1;33069:9;33065:17;33058:47;33122:131;33248:4;33122:131;:::i;:::-;33114:139;;33012:248;;;:::o;33266:419::-;;33470:2;33459:9;33455:18;33447:26;;33519:9;33513:4;33509:20;33505:1;33494:9;33490:17;33483:47;33547:131;33673:4;33547:131;:::i;:::-;33539:139;;33437:248;;;:::o;33691:419::-;;33895:2;33884:9;33880:18;33872:26;;33944:9;33938:4;33934:20;33930:1;33919:9;33915:17;33908:47;33972:131;34098:4;33972:131;:::i;:::-;33964:139;;33862:248;;;:::o;34116:343::-;;34307:3;34296:9;34292:19;34284:27;;34321:131;34449:1;34438:9;34434:17;34425:6;34321:131;:::i;:::-;34274:185;;;;:::o;34465:222::-;;34596:2;34585:9;34581:18;34573:26;;34609:71;34677:1;34666:9;34662:17;34653:6;34609:71;:::i;:::-;34563:124;;;;:::o;34693:129::-;;34754:20;;:::i;:::-;34744:30;;34783:33;34811:4;34803:6;34783:33;:::i;:::-;34734:88;;;:::o;34828:75::-;;34894:2;34888:9;34878:19;;34868:35;:::o;34909:311::-;;35076:18;35068:6;35065:30;35062:2;;;35098:18;;:::i;:::-;35062:2;35148:4;35140:6;35136:17;35128:25;;35208:4;35202;35198:15;35190:23;;34991:229;;;:::o;35226:311::-;;35393:18;35385:6;35382:30;35379:2;;;35415:18;;:::i;:::-;35379:2;35465:4;35457:6;35453:17;35445:25;;35525:4;35519;35515:15;35507:23;;35308:229;;;:::o;35543:98::-;;35628:5;35622:12;35612:22;;35601:40;;;:::o;35647:99::-;;35733:5;35727:12;35717:22;;35706:40;;;:::o;35752:147::-;;35890:3;35875:18;;35865:34;;;;:::o;35905:169::-;;36023:6;36018:3;36011:19;36063:4;36058:3;36054:14;36039:29;;36001:73;;;;:::o;36080:305::-;;36139:20;36157:1;36139:20;:::i;:::-;36134:25;;36173:20;36191:1;36173:20;:::i;:::-;36168:25;;36327:1;36259:66;36255:74;36252:1;36249:81;36246:2;;;36333:18;;:::i;:::-;36246:2;36377:1;36374;36370:9;36363:16;;36124:261;;;;:::o;36391:185::-;;36448:20;36466:1;36448:20;:::i;:::-;36443:25;;36482:20;36500:1;36482:20;:::i;:::-;36477:25;;36521:1;36511:2;;36526:18;;:::i;:::-;36511:2;36568:1;36565;36561:9;36556:14;;36433:143;;;;:::o;36582:348::-;;36645:20;36663:1;36645:20;:::i;:::-;36640:25;;36679:20;36697:1;36679:20;:::i;:::-;36674:25;;36867:1;36799:66;36795:74;36792:1;36789:81;36784:1;36777:9;36770:17;36766:105;36763:2;;;36874:18;;:::i;:::-;36763:2;36922:1;36919;36915:9;36904:20;;36630:300;;;;:::o;36936:191::-;;36996:20;37014:1;36996:20;:::i;:::-;36991:25;;37030:20;37048:1;37030:20;:::i;:::-;37025:25;;37069:1;37066;37063:8;37060:2;;;37074:18;;:::i;:::-;37060:2;37119:1;37116;37112:9;37104:17;;36981:146;;;;:::o;37133:96::-;;37199:24;37217:5;37199:24;:::i;:::-;37188:35;;37178:51;;;:::o;37235:90::-;;37312:5;37305:13;37298:21;37287:32;;37277:48;;;:::o;37331:126::-;;37408:42;37401:5;37397:54;37386:65;;37376:81;;;:::o;37463:77::-;;37529:5;37518:16;;37508:32;;;:::o;37546:307::-;37614:1;37624:113;37638:6;37635:1;37632:13;37624:113;;;37723:1;37718:3;37714:11;37708:18;37704:1;37699:3;37695:11;37688:39;37660:2;37657:1;37653:10;37648:15;;37624:113;;;37755:6;37752:1;37749:13;37746:2;;;37835:1;37826:6;37821:3;37817:16;37810:27;37746:2;37595:258;;;;:::o;37859:281::-;37942:27;37964:4;37942:27;:::i;:::-;37934:6;37930:40;38072:6;38060:10;38057:22;38036:18;38024:10;38021:34;38018:62;38015:2;;;38083:18;;:::i;:::-;38015:2;38123:10;38119:2;38112:22;37902:238;;;:::o;38146:233::-;;38208:24;38226:5;38208:24;:::i;:::-;38199:33;;38254:66;38247:5;38244:77;38241:2;;;38324:18;;:::i;:::-;38241:2;38371:1;38364:5;38360:13;38353:20;;38189:190;;;:::o;38385:180::-;38433:77;38430:1;38423:88;38530:4;38527:1;38520:15;38554:4;38551:1;38544:15;38571:180;38619:77;38616:1;38609:88;38716:4;38713:1;38706:15;38740:4;38737:1;38730:15;38757:180;38805:77;38802:1;38795:88;38902:4;38899:1;38892:15;38926:4;38923:1;38916:15;38943:102;;39035:2;39031:7;39026:2;39019:5;39015:14;39011:28;39001:38;;38991:54;;;:::o;39051:242::-;39191:34;39187:1;39179:6;39175:14;39168:58;39260:25;39255:2;39247:6;39243:15;39236:50;39157:136;:::o;39299:172::-;39439:24;39435:1;39427:6;39423:14;39416:48;39405:66;:::o;39477:225::-;39617:34;39613:1;39605:6;39601:14;39594:58;39686:8;39681:2;39673:6;39669:15;39662:33;39583:119;:::o;39708:221::-;39848:34;39844:1;39836:6;39832:14;39825:58;39917:4;39912:2;39904:6;39900:15;39893:29;39814:115;:::o;39935:177::-;40075:29;40071:1;40063:6;40059:14;40052:53;40041:71;:::o;40118:251::-;40258:34;40254:1;40246:6;40242:14;40235:58;40327:34;40322:2;40314:6;40310:15;40303:59;40224:145;:::o;40375:177::-;40515:29;40511:1;40503:6;40499:14;40492:53;40481:71;:::o;40558:168::-;40698:20;40694:1;40686:6;40682:14;40675:44;40664:62;:::o;40732:225::-;40872:34;40868:1;40860:6;40856:14;40849:58;40941:8;40936:2;40928:6;40924:15;40917:33;40838:119;:::o;40963:174::-;41103:26;41099:1;41091:6;41087:14;41080:50;41069:68;:::o;41143:221::-;41283:34;41279:1;41271:6;41267:14;41260:58;41352:4;41347:2;41339:6;41335:15;41328:29;41249:115;:::o;41370:179::-;41510:31;41506:1;41498:6;41494:14;41487:55;41476:73;:::o;41555:181::-;41695:33;41691:1;41683:6;41679:14;41672:57;41661:75;:::o;41742:223::-;41882:34;41878:1;41870:6;41866:14;41859:58;41951:6;41946:2;41938:6;41934:15;41927:31;41848:117;:::o;41971:220::-;42111:34;42107:1;42099:6;42095:14;42088:58;42180:3;42175:2;42167:6;42163:15;42156:28;42077:114;:::o;42197:230::-;42337:34;42333:1;42325:6;42321:14;42314:58;42406:13;42401:2;42393:6;42389:15;42382:38;42303:124;:::o;42433:182::-;42573:34;42569:1;42561:6;42557:14;42550:58;42539:76;:::o;42621:222::-;42761:34;42757:1;42749:6;42745:14;42738:58;42830:5;42825:2;42817:6;42813:15;42806:30;42727:116;:::o;42849:170::-;42989:22;42985:1;42977:6;42973:14;42966:46;42955:64;:::o;43025:237::-;43165:34;43161:1;43153:6;43149:14;43142:58;43234:20;43229:2;43221:6;43217:15;43210:45;43131:131;:::o;43268:308::-;43408:34;43404:1;43396:6;43392:14;43385:58;43477:34;43472:2;43464:6;43460:15;43453:59;43546:22;43541:2;43533:6;43529:15;43522:47;43374:202;:::o;43582:171::-;43722:23;43718:1;43710:6;43706:14;43699:47;43688:65;:::o;43759:179::-;43899:31;43895:1;43887:6;43883:14;43876:55;43865:73;:::o;43944:234::-;44084:34;44080:1;44072:6;44068:14;44061:58;44153:17;44148:2;44140:6;44136:15;44129:42;44050:128;:::o;44184:292::-;44324:34;44320:1;44312:6;44308:14;44301:58;44393:34;44388:2;44380:6;44376:15;44369:59;44462:6;44457:2;44449:6;44445:15;44438:31;44290:186;:::o;44482:229::-;44622:34;44618:1;44610:6;44606:14;44599:58;44691:12;44686:2;44678:6;44674:15;44667:37;44588:123;:::o;44717:181::-;44857:33;44853:1;44845:6;44841:14;44834:57;44823:75;:::o;44904:179::-;45044:31;45040:1;45032:6;45028:14;45021:55;45010:73;:::o;45089:181::-;45229:33;45225:1;45217:6;45213:14;45206:57;45195:75;:::o;45276:175::-;45416:27;45412:1;45404:6;45400:14;45393:51;45382:69;:::o;45457:122::-;45530:24;45548:5;45530:24;:::i;:::-;45523:5;45520:35;45510:2;;45569:1;45566;45559:12;45510:2;45500:79;:::o;45585:116::-;45655:21;45670:5;45655:21;:::i;:::-;45648:5;45645:32;45635:2;;45691:1;45688;45681:12;45635:2;45625:76;:::o;45707:122::-;45780:24;45798:5;45780:24;:::i;:::-;45773:5;45770:35;45760:2;;45819:1;45816;45809:12;45760:2;45750:79;:::o
Swarm Source
ipfs://1858a6a73cc4052ab49598308409d742ef38a319848ce39b5eedecdd3bbaa46d
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.