Feature Tip: Add private address tag to any address under My Name Tag !
Overview
Max Total Supply
300,504 YTG
Holders
200 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Unissou
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; import './UnissouDAO.sol'; import './UnissouDApp.sol'; /// @title Unissou /// /// @notice This is the main contract /// /// @dev Inehrit {UnissouDAO} and {UnissouDApp} /// contract Unissou is UnissouDAO, UnissouDApp { /// @notice Declare a public constant of type string /// /// @return The smart contract author /// string public constant CREATOR = "unissou.com"; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol library Address { function isContract( address account ) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } 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"); } function functionCall( address target, bytes memory data ) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } 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"); } 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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /// @title Burneable /// /// @notice This contract covers everything related /// to the burn functions /// contract Burneable { /// @dev Declare a private bool {_burningEnabled} /// bool private _burningEnabled; /// @dev Declare a public constant of type bytes32 /// /// @return The bytes32 string of the role /// bytes32 public constant ROLE_BURNER = keccak256("BURNER"); /// @dev Declare two events to expose when burning /// is enabled or disabled, take the event's sender /// as argument /// event BurningEnabled(address indexed _from); event BurningDisabled(address indexed _from); /// @dev Verify if the sender can burn, if yes, /// enable burning /// /// Requirements: /// {_hasRole} should be true /// {_amount} should be superior to 0 /// {_burningEnabled} should be true /// modifier isBurneable( uint256 _amount, bool _hasRole ) { require( _hasRole, "BC:500" ); require( _amount > 0, "BC:30" ); _enableBurning(); require( burningEnabled(), "BC:210" ); _; } /// @dev By default, burning is disabled /// constructor() internal { _burningEnabled = false; } /// @notice Expose the state of {_burningEnabled} /// /// @return The state as a bool /// function burningEnabled() public view returns (bool) { return _burningEnabled; } /// @dev Enable burning by setting {_burningEnabled} /// to true, then emit the related event /// function _enableBurning() internal virtual { _burningEnabled = true; emit BurningEnabled(msg.sender); } /// @dev Disable burning by setting {_burningEnabled} /// to false, then emit the related event /// function _disableBurning() internal virtual { _burningEnabled = false; emit BurningDisabled(msg.sender); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/EnumerableSet.sol library EnumerableSet { struct Set { bytes32[] _values; mapping (bytes32 => uint256) _indexes; } function _add( Set storage set, bytes32 value ) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); set._indexes[value] = set._values.length; return true; } else { return false; } } function _remove( Set storage set, bytes32 value ) private returns (bool) { uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; bytes32 lastvalue = set._values[lastIndex]; set._values[toDeleteIndex] = lastvalue; set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based set._values.pop(); delete set._indexes[value]; return true; } else { return false; } } function _contains( Set storage set, bytes32 value ) private view returns (bool) { return set._indexes[value] != 0; } function _length( Set storage set ) private view returns (uint256) { return set._values.length; } function _at( Set storage set, uint256 index ) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } struct AddressSet { Set _inner; } function add( AddressSet storage set, address value ) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } function remove( AddressSet storage set, address value ) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } function contains( AddressSet storage set, address value ) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } function length( AddressSet storage set ) internal view returns (uint256) { return _length(set._inner); } function at( AddressSet storage set, uint256 index ) internal view returns (address) { return address(uint256(_at(set._inner, index))); } struct UintSet { Set _inner; } function add( UintSet storage set, uint256 value ) internal returns (bool) { return _add(set._inner, bytes32(value)); } function remove( UintSet storage set, uint256 value ) internal returns (bool) { return _remove(set._inner, bytes32(value)); } function contains( UintSet storage set, uint256 value ) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } function length( UintSet storage set ) internal view returns (uint256) { return _length(set._inner); } function at( UintSet storage set, uint256 index ) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol abstract contract ERC20 is IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _initialSupply; uint256 private _totalSupply; uint256 private _totalSupplyCap; string private _name; string private _symbol; uint8 private _decimals; constructor ( string memory name, string memory symbol, uint256 totalSupplyCap, uint256 initialSupply ) public { _decimals = 8; _name = name; _symbol = symbol; _totalSupplyCap = totalSupplyCap; _initialSupply = initialSupply; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function initialSupply() public view override returns (uint256) { return _initialSupply; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function totalSupplyCap() public view override returns (uint256) { return _totalSupplyCap; } function balanceOf( address account ) public view override returns (uint256) { return _balances[account]; } function transfer( address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve( address spender, uint256 amount ) public virtual override returns (bool) { _approve(msg.sender, spender, (amount * (10**8))); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub((amount * (10**8)), "ERC20:490")); return true; } function increaseAllowance( address spender, uint256 addedValue ) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add((addedValue * (10**8)))); return true; } function decreaseAllowance( address spender, uint256 subtractedValue ) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub((subtractedValue * (10**8)), "ERC20:495")); return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require( sender != address(0), "ERC20:410" ); require( recipient != address(0), "ERC20:420" ); require( amount > 0, "ERC20:480" ); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20:470"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint( address account, uint256 amount ) internal virtual { require( account != address(0), "ERC20:120" ); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } function _burn( address account, uint256 amount ) internal virtual { require( account != address(0), "ERC20:220" ); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20:230"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal virtual { require( owner != address(0), "ERC20:450" ); require( spender != address(0), "ERC20:460" ); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _setupDecimals( uint8 decimals_ ) internal { _decimals = decimals_; } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol interface IERC20 { function initialSupply() external view returns (uint256); function totalSupply() external view returns (uint256); function totalSupplyCap() external view returns (uint256); function balanceOf( address account ) external view returns (uint256); function transfer( address recipient, uint256 amount ) external returns (bool); function allowance( address owner, address spender ) external view returns (uint256); function approve( address spender, uint256 amount ) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer( address indexed from, address indexed to, uint256 value ); event Approval( address indexed owner, address indexed spender, uint256 value ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /// @title Minteable /// /// @notice This contract covers everything related /// to the mint functions /// contract Minteable { /// @dev Declare a private bool {_mintingEnabled} /// bool private _mintingEnabled; /// @dev Declare a public constant of type bytes32 /// /// @return The bytes32 string of the role /// bytes32 public constant ROLE_MINTER = keccak256("MINTER"); /// @dev Declare two events to expose when minting /// is enabled or disabled, take the event's sender /// as argument /// event MintingEnabled(address indexed _from); event MintingDisabled(address indexed _from); /// @dev Verify if the sender can mint, if yes, /// enable minting /// /// Requirements: /// {_hasRole} should be true /// {_amount} should be superior to 0 /// {_mintingEnabled} should be true /// modifier isMinteable( uint256 _amount, bool _hasRole ) { require( _hasRole, "MC:500" ); require( _amount > 0, "MC:30" ); _enableMinting(); require( mintingEnabled(), "MC:110" ); _; } /// @dev By default, minting is disabled /// constructor() internal { _mintingEnabled = false; } /// @notice Expose the state of {_mintingEnabled} /// /// @return The state as a bool /// function mintingEnabled() public view returns (bool) { return _mintingEnabled; } /// @dev Enable minting by setting {_mintingEnabled} /// to true, then emit the related event /// function _enableMinting() internal virtual { _mintingEnabled = true; emit MintingEnabled(msg.sender); } /// @dev Disable minting by setting {_mintingEnabled} /// to false, then emit the related event /// function _disableMinting() internal virtual { _mintingEnabled = false; emit MintingDisabled(msg.sender); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import './Roleplay.sol'; /// @title Pauseable /// /// @notice This contract covers everything related /// to the pause functions /// /// @dev Inehrit {Roleplay} /// contract Pauseable is Roleplay { /// @dev Declare a private bool {_paused} /// bool private _paused; /// @dev Declare two events to expose when pause /// is enabled or disabled, take the event's sender /// as argument /// event Paused(address indexed _from); event Unpaused(address indexed _from); /// @dev Verify if the contract is not paused /// /// Requirements: /// {_paused} should be false /// modifier whenNotPaused() { require( !_paused, "PC:300" ); _; } /// @dev Verify if the contract is paused /// /// Requirements: /// {_paused} should be true /// modifier whenPaused() { require( _paused, "PC:310" ); _; } /// @dev By default, pause is disabled /// constructor () internal { _paused = false; } /// @notice Expose the state of {_paused} /// /// @return The state as a bool /// function paused() public view returns (bool) { return _paused; } /// @dev Enable pause by setting {_paused} /// to true, then emit the related event /// function pause() public virtual whenNotPaused() onlyOwner() { _paused = true; emit Paused(msg.sender); } /// @dev Disable pause by setting {_paused} /// to false, then emit the related event /// function unpause() public virtual whenPaused() onlyOwner() { _paused = false; emit Unpaused(msg.sender); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "./EnumerableSet.sol"; /// @title Roleplay /// /// @notice This contract covers most functions about /// role and permission's managment /// abstract contract Roleplay { using EnumerableSet for EnumerableSet.AddressSet; /// @dev Structure declaration of {RoleData} data model /// struct RoleData { EnumerableSet.AddressSet members; bytes32 ownerRole; } mapping (bytes32 => RoleData) private _roles; /// @dev Declare a public constant of type bytes32 /// /// @return The bytes32 string of the role /// bytes32 public constant ROLE_OWNER = 0x00; /// @dev Declare a public constant of type bytes32 /// /// @return The bytes32 string of the role /// bytes32 public constant ROLE_MANAGER = keccak256("MANAGER"); /// @dev Declare two events to expose role /// modifications /// event RoleGranted(bytes32 indexed _role, address indexed _from, address indexed _sender); event RoleRevoked(bytes32 indexed role, address indexed _from, address indexed _sender); /// @dev Verify if the sender have Owner's role /// /// Requirements: /// {_hasRole()} should be true /// modifier onlyOwner() { require( hasRole(ROLE_OWNER, msg.sender), "RPC:500" ); _; } /// @notice This function verify is the {_account} /// has role {_role} /// /// @param _role - The bytes32 string of the role /// @param _account - The address to verify /// /// @return true/false depending the result /// function hasRole( bytes32 _role, address _account ) public view returns (bool) { return _roles[_role].members.contains(_account); } /// @notice Expose the length of members[] for /// a given {_role} /// /// @param _role - The bytes32 string of the role /// /// @return - The length of members /// function getRoleMembersLength( bytes32 _role ) public view returns (uint256) { return _roles[_role].members.length(); } /// @notice Expose the member address for /// a given {_role} at the {_id} index /// /// @param _id - Index to watch for /// @param _role - The bytes32 string of the role /// /// @return - The address of the member at {_id} index /// function exposeRoleMember( bytes32 _role, uint256 _id ) public view returns (address) { return _roles[_role].members.at(_id); } /// @notice This function allow the current Owner /// to transfer his ownership /// /// @dev Requirements: /// See {Roleplay::onlyOwner()} /// /// @param _to - Represent address of the receiver /// function transferOwnerRole( address _to ) public virtual onlyOwner() { _grantRole(ROLE_OWNER, _to); _revokeRole(ROLE_OWNER, msg.sender); } /// @notice This function allow the current Owner /// to give the Manager Role to {_to} address /// /// @dev Requirements: /// See {Roleplay::onlyOwner()} /// /// @param _to - Represent address of the receiver /// function grantManagerRole( address _to ) public virtual onlyOwner() { _grantRole(ROLE_MANAGER, _to); } /// @notice This function allow a Manager to grant /// role to a given address, it can't grant Owner role /// /// @dev Requirements: /// {_hasRole()} should be true /// {_role} should be different of ROLE_OWNER /// /// @param _role - The bytes32 string of the role /// @param _to - Represent address of the receiver /// function grantRole( bytes32 _role, address _to ) public virtual { require( hasRole(ROLE_MANAGER, msg.sender), "RPC:510" ); require( _role != ROLE_OWNER, "RPC:520" ); if (!hasRole(ROLE_OWNER, msg.sender)) { require( _role == keccak256("CHAIRPERSON"), "RPC:530" ); } _grantRole(_role, _to); } /// @notice This function allow a Manager to revoke /// role to a given address, it can't revoke Owner role /// /// @dev Requirements: /// {_hasRole()} should be true /// {_role} should be different of ROLE_OWNER /// /// @param _role - The bytes32 string of the role /// @param _to - Represent address of the receiver /// function revokeRole( bytes32 _role, address _to ) public virtual { require( hasRole(ROLE_MANAGER, msg.sender), "RPC:550" ); require( _role != ROLE_OWNER, "RPC:540" ); if (!hasRole(ROLE_OWNER, msg.sender)) { require( _role == keccak256("CHAIRPERSON"), "RPC:530" ); } _revokeRole(_role, _to); } /// @notice This function allow anyone to revoke his /// own role, even an Owner, use it carefully! /// /// @param _role - The bytes32 string of the role /// function renounceRole( bytes32 _role ) public virtual { require( _role != ROLE_OWNER, "RPC:540" ); require( hasRole(_role, msg.sender), "RPC:570" ); _revokeRole(_role, msg.sender); } function _setupRole( bytes32 _role, address _to ) internal virtual { _grantRole(_role, _to); } function _grantRole( bytes32 _role, address _to ) private { if (_roles[_role].members.add(_to)) { emit RoleGranted(_role, _to, msg.sender); } } function _revokeRole( bytes32 _role, address _to ) private { if (_roles[_role].members.remove(_to)) { emit RoleRevoked(_role, _to, msg.sender); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /// Know more: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol library SafeMath { function add( uint256 a, uint256 b ) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub( uint256 a, uint256 b ) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul( uint256 a, uint256 b ) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div( uint256 a, uint256 b ) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod( uint256 a, uint256 b ) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; import './Roleplay.sol'; /// @title Stakeable /// /// @notice This contract covers most functions about /// staking and rewards /// abstract contract Stakeable is Roleplay { /// @dev Declare an internal variable of type uint256 /// uint256 internal _totalStakedSupply; /// @dev Declare an internal variable of type uint256 /// uint256 internal _maxRewardRatio; /// @dev Structure declaration of {Stakeholder} data model /// struct Stakeholder { address owner; uint256 stake; uint256 availableReward; uint256 totalRewardEarned; uint256 totalRewardSpent; uint256 createdAt; uint256 lastRewardCalculatedAt; } /// @dev Declare two events to expose when stake /// or unstake is requested, take the event's /// sender as argument and the requested amount /// event Staked(address indexed _from, uint256 _amount); event Unstaked(address indexed _from, uint256 _amount); /// @dev Declare an array of {Stakeholder} /// Stakeholder[] stakeholders; /// @dev Verify if the amount is superior to 0 /// /// Requirements: /// {_amount} should be superior to 0 /// /// @param _amount - Represent the requested amount /// modifier isAmountNotZero(uint256 _amount) { require( _amount > 0, "SC:630" ); _; } /// @dev Verify if the amount is a valid amount /// /// Requirements: /// {_amount} should be inferior or equal to 10 /// /// @param _amount - Represent the requested amount /// @param _balance - Represent the sender balance /// modifier isAmountValid(uint256 _amount, uint256 _balance) { require( (_amount * (10**8)) <= _balance, "SC:640" ); _; } /// @dev Verify if the amount is a valid amount to unstake /// /// Requirements: /// {_amount} should be inferior or equal to staked value /// /// @param _amount - Represent the requested amount /// modifier isAbleToUnstake(uint256 _amount) { Stakeholder memory stakeholder = exposeStakeholder(msg.sender); require( _amount <= stakeholder.stake, "SC:640" ); _; } constructor() public { _maxRewardRatio = 10; } /// @notice Expose the total staked supply /// /// @return The uint256 value of {_totalStakedSupply} /// function totalStakedSupply() public view returns (uint256) { return _totalStakedSupply; } /// @notice Expose the max reward ratio /// /// @return The uint256 value of {_maxRewardRatio} /// function maxRewardRatio() public view returns (uint256) { return _maxRewardRatio; } /// @notice Expose every Stakeholders /// /// @return A tuple of Stakeholders /// function exposeStakeholders() public view returns (Stakeholder[] memory) { return stakeholders; } /// @notice Expose a Stakeholder from the Owner address /// /// @param _owner - Represent the address of the stakeholder owner /// /// @return A tuple of Stakeholder /// function exposeStakeholder( address _owner ) public view returns (Stakeholder memory) { uint256 i = 0; uint256 len = stakeholders.length; while (i < len) { if (stakeholders[i].owner == _owner) { return stakeholders[i]; } i++; } } /// @notice Set the {_maxRewardRatio} /// /// @dev Only owner can use this function /// /// @param _amount - Represent the requested ratio /// function setMaxRewardRatio( uint256 _amount ) public virtual onlyOwner() { _maxRewardRatio = _amount; } /// @notice Create a new {Stakeholder} /// /// @dev Owner is the sender /// /// @param _owner - Represent the owner of the Stakeholder /// function _createStakeholder( address _owner ) internal virtual { stakeholders.push(Stakeholder({ owner: _owner, stake: 0, createdAt: now, availableReward: 0, totalRewardEarned: 0, totalRewardSpent: 0, lastRewardCalculatedAt: 0 })); } /// @notice This function compute the reward gained from staking /// UnissouToken /// /// @dev The calculation is pretty simple, a {Stakeholder} /// holds the date of the {Stakeholder}'s creation. If the /// reward hasn't been computed since the creation, the /// algorithm will calculate them based on the number of /// days passed since the creation of the stakeholding. /// Then the calculation's date will be saved onto the /// {Stakeholder} and when {_computeReward} will be called /// again, the reward calculation will take this date in /// consideration to compute the reward. /// /// The actual ratio is 1 Stake = 1 Reward. /// With a maximum of 10 tokens per stake, /// you can obtain a total of 10 rewards per day /// /// @param _id - Represent the Stakeholder index /// function _computeReward( uint256 _id ) internal virtual { uint256 stake = stakeholders[_id].stake; uint256 lastCalculatedReward = stakeholders[_id].lastRewardCalculatedAt; uint256 createdAt = stakeholders[_id].createdAt; if (lastCalculatedReward == 0) { if (createdAt < now) { if ((now - createdAt) >= 1 days) { stakeholders[_id].availableReward += (((now - createdAt) / 1 days) * ( stake <= _maxRewardRatio ? stake : _maxRewardRatio )); stakeholders[_id].totalRewardEarned += (((now - createdAt) / 1 days) * ( stake <= _maxRewardRatio ? stake : _maxRewardRatio )); stakeholders[_id].lastRewardCalculatedAt = now; return; } } } if (lastCalculatedReward != 0) { if (lastCalculatedReward < now) { if ((now - lastCalculatedReward) >= 1 days) { stakeholders[_id].availableReward += (((now - lastCalculatedReward) / 1 days) * ( stake <= _maxRewardRatio ? stake : _maxRewardRatio )); stakeholders[_id].totalRewardEarned += (((now - lastCalculatedReward) / 1 days) * ( stake <= _maxRewardRatio ? stake : _maxRewardRatio )); stakeholders[_id].lastRewardCalculatedAt = now; return; } } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; import './Voteable.sol'; import './UnissouDApp.sol'; /// @title UnissouDAO /// /// @notice This contract covers everything related /// to the organization of Unissou /// /// @dev Inehrit {Voteable} and {UnissouToken} /// abstract contract UnissouDAO is Voteable, UnissouToken { /// @notice ROLE_CHAIRPERSON is granted to the /// original contract deployer /// /// @dev See {Roleplay::grantRole()} /// constructor() public { grantRole(ROLE_CHAIRPERSON, msg.sender); } /// @notice This function allows the sender to vote /// for a proposal, the vote can be positive or negative. /// The sender has to complete the requirements to be /// able to vote for a proposal. /// /// @dev Depending on the value of {_isPositiveVote}, add a /// *positive/negative* vote to the proposal, identified /// by its {_id}, then push the sender address into the /// voters pool of the proposal /// /// Requirements: /// See {Voteable::isValidVoter()} /// See {Voteable::isVoteEnabled()} /// /// @param _id - Represent the proposal id /// @param _isPositiveVote - Represent the vote type /// function voteForProposal( uint256 _id, bool _isPositiveVote ) public virtual isValidVoter( _id, balanceOf(msg.sender) ) isVoteEnabled( _id ) { if (_isPositiveVote) { proposals[_id].positiveVote += 1; proposals[_id].positiveVoters.push(msg.sender); } if (!_isPositiveVote) { proposals[_id].negativeVote += 1; proposals[_id].negativeVoters.push(msg.sender); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; import './Stakeable.sol'; import './Roleplay.sol'; import './UnissouToken.sol'; /// @title UnissouDApp /// /// @notice This contract covers everything related /// to the DApp of Unissou /// /// @dev Inehrit {Stakeable} and {UnissouToken} /// abstract contract UnissouDApp is Roleplay, Stakeable, UnissouToken { /// @notice This function allows the sender to stake /// an amount (maximum 10) of UnissouToken, when the /// token is staked, it is burned from the circulating /// supply and placed into the staking pool /// /// @dev The function iterate through {stakeholders} to /// know if the sender is already a stakeholder. If the /// sender is already a stakeholder, then the requested amount /// is staked into the pool and then burned from the sender wallet. /// If the sender isn't a stakeholer, a new stakeholder is created, /// and then the function is recall to stake the requested amount /// /// Requirements: /// See {Stakeable::isAmountValid()} /// /// @param _amount - Represent the amount of token to be staked /// function stake( uint256 _amount ) public virtual isAmountValid( _amount, balanceOf(msg.sender) ) isAmountNotZero( _amount ) { uint256 i = 0; bool isStakeholder = false; uint256 len = stakeholders.length; while (i < len) { if (stakeholders[i].owner == msg.sender) { isStakeholder = true; break; } i++; } if (isStakeholder) { stakeholders[i].stake += _amount; _burn(msg.sender, (_amount * (10**8))); _totalStakedSupply += (_amount * (10**8)); emit Staked(msg.sender, _amount); } if (!isStakeholder) { _createStakeholder(msg.sender); stake(_amount); } } /// @notice This function unstacks the sender staked /// balance depending on the requested {_amount}, if the /// {_amount} exceeded the staked supply of the sender, /// the whole staked supply of the sender will be unstacked /// and withdrawn to the sender wallet without exceeding it. /// /// @dev Like stake() function do, this function iterate /// over the stakeholders to identify if the sender is one /// of them, in the case of the sender is identified as a /// stakeholder, then the {_amount} is minted to the sender /// wallet and sub from the staked supply. /// /// Requirements: /// See {Stakeable::isAmountNotZero} /// See {Stakeable::isAbleToUnstake} /// /// @param _amount - Represent the amount of token to be unstack /// function unstake( uint256 _amount ) public virtual isAmountNotZero( _amount ) isAbleToUnstake( _amount ) { uint256 i = 0; bool isStakeholder = false; uint256 len = stakeholders.length; while (i < len) { if (stakeholders[i].owner == msg.sender) { isStakeholder = true; break; } i++; } require( isStakeholder, "SC:650" ); if (isStakeholder) { if (_amount <= stakeholders[i].stake) { stakeholders[i].stake -= _amount; _mint(msg.sender, (_amount * (10**8))); _totalStakedSupply -= (_amount * (10**8)); emit Unstaked(msg.sender, _amount); } } } /// @notice This function allows the sender to compute /// his reward earned by staking {UnissouToken}. When you /// request a withdraw, the function updates the reward's /// value of the sender stakeholding onto the Ethereum /// blockchain, allowing him to spend the reward for NFTs. /// /// @dev The same principe as other functions is applied here, /// iteration over stakeholders, when found, execute the action. /// See {Stakeable::_computeReward()} /// function withdraw() public virtual { uint256 i = 0; bool isStakeholder = false; uint256 len = stakeholders.length; while (i < len) { if (stakeholders[i].owner == msg.sender) { isStakeholder = true; break; } i++; } require( isStakeholder, "SC:650" ); if (isStakeholder) { _computeReward(i); } } /// @notice This function allows the owner to spend {_amount} /// of the target rewards gained from his stake. /// /// @dev To reduce the potential numbers of transaction, the /// {_computeReward()} function is also executed into this function. /// /// @param _amount - Represent the amount of reward to spend /// @param _target - Represent the address of the stakeholder owner /// function spend( uint256 _amount, address _target ) public virtual onlyOwner() { uint256 i = 0; bool isStakeholder = false; uint256 len = stakeholders.length; while (i < len) { if (stakeholders[i].owner == _target) { isStakeholder = true; break; } i++; } require( isStakeholder, "SC:650" ); if (isStakeholder) { _computeReward(i); require( _amount <= stakeholders[i].availableReward, "SC:660" ); stakeholders[i].availableReward -= _amount; stakeholders[i].totalRewardSpent += _amount; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import './ERC20.sol'; import './Roleplay.sol'; import './Pauseable.sol'; import './Minteable.sol'; import './Burneable.sol'; /// @title UnissouToken /// /// @notice This contract covers everything related /// to the Unissou ERC20 /// /// @dev Inehrit {ERC20}, {Roleplay}, {Pauseable}, /// {Minteable} and {Burneable} /// abstract contract UnissouToken is ERC20, Roleplay, Pauseable, Minteable, Burneable { /// @notice Original contract's deployer are granted /// with Owner role and Manager role and the initial /// supply are minted onto his wallet. /// /// @dev See {ERC20} /// constructor() public ERC20( "Unissou", "YTG", 384400 * (10**8), 96100 * (10**8) ) { _setupRole(ROLE_OWNER, msg.sender); _setupRole(ROLE_MANAGER, msg.sender); _mint(msg.sender, initialSupply()); } /// @notice This function allows to transfer tokens to multiple /// addresses in only one transaction, that help to reduce fees. /// The amount cannot be dynamic and is constant for all transfer /// /// @param _receivers - Represent an array of address /// @param _amount - Represent the amount of token to transfer /// function transferBatch( address[] memory _receivers, uint256 _amount ) public virtual { uint256 i = 0; uint256 len = _receivers.length; require( balanceOf(msg.sender) >= (_amount * len), "UT:470" ); while (i < len) { transfer(_receivers[i], _amount); i++; } } /// @notice This function allows the sender to mint /// an {_amount} of token unless the {_amount} /// exceed the total supply cap /// /// @dev Once the minting is down, minting is disabled /// /// Requirements: /// See {Minteable::isMinteable()} /// /// @param _amount - Represent the amount of token /// to be minted /// function mint( uint256 _amount ) public virtual isMinteable( _amount, hasRole(ROLE_MINTER, msg.sender) ) { _mint(msg.sender, _amount); _disableMinting(); } /// @notice This function allows the sender to mint /// an {_amount} of token directly onto the address {_to} /// unless the {_amount} exceed the total supply cap /// /// @dev Once the minting is down, minting is disabled /// /// Requirements: /// See {Minteable::isMinteable()} /// /// @param _to - Represent the token's receiver /// @param _amount - Represent the amount of token /// to be minted /// function mintTo( address _to, uint256 _amount ) public virtual isMinteable( _amount, hasRole(ROLE_MINTER, msg.sender) ) { _mint(_to, _amount); _disableMinting(); } /// @notice This function allows the sender to burn /// an {_amount} of token /// /// @dev Once the burning is down, burning is disabled /// /// Requirements: /// See {Burneable::isBurneable()} /// /// @param _amount - Represent the amount of token /// to be burned /// function burn( uint256 _amount ) public virtual isBurneable( _amount, hasRole(ROLE_BURNER, msg.sender) ) { _burn(msg.sender, _amount); _disableBurning(); } /// @notice This function allows the sender to burn /// an {_amount} of token directly from the address {_from} /// only if the token allowance is superior or equal /// to the requested {_amount} /// /// @dev Once the burning is down, burning is disabled /// /// Requirements: /// See {Burneable::isBurneable()} /// /// @param _from - Represent the token's receiver /// @param _amount - Represent the amount of token /// to be burned /// function burnFrom( address _from, uint256 _amount ) public virtual isBurneable( _amount, hasRole(ROLE_BURNER, msg.sender) ) { uint256 decreasedAllowance = allowance(_from, msg.sender).sub(_amount); _approve(_from, msg.sender, decreasedAllowance); _burn(_from, _amount); _disableBurning(); } /// @notice This function does verification before /// any token transfer. The actual verification are: /// - If the total supply don't exceed the total /// supply cap (for example, when token are minted), /// - If the token's transfer are not paused /// function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { require( totalSupply().add(amount) <= totalSupplyCap(), "UT:20" ); } require( !paused(), "UT:400" ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; import './Roleplay.sol'; /// @title Voteable /// /// @notice This contract covers most functions about /// proposals and votings /// /// @dev Inehrit {Roleplay} /// abstract contract Voteable is Roleplay { /// @dev Declare an internal variable of type uint256 /// uint256 internal _minVoteBalance; /// @dev Structure declaration of {Proposal} data model /// struct Proposal { address creator; string name; string metadataURI; bool votingEnabled; uint256 positiveVote; uint256 negativeVote; address[] positiveVoters; address[] negativeVoters; } /// @dev Declare a public constant of type bytes32 /// /// @return The bytes32 string of the role /// bytes32 public constant ROLE_CHAIRPERSON = keccak256("CHAIRPERSON"); /// @dev Declare an array of {Proposal} /// Proposal[] proposals; /// @dev Verify if the sender have the chairperson role /// /// Requirements: /// {_hasRole} should be true /// modifier isChairperson() { require( hasRole(ROLE_CHAIRPERSON, msg.sender), "VC:500" ); _; } /// @dev Verify if the sender is a valid voter /// /// Requirements: /// {_balance} should be superior to 1 /// {_voter} should haven't already voted /// /// @param _id - Represent the proposal index /// @param _balance - Represent the sender balance /// modifier isValidVoter( uint256 _id, uint256 _balance ) { require( _balance >= (_minVoteBalance * (10**8)), "VC:1010" ); bool positiveVote = _checkSenderHasVoted(proposals[_id].positiveVoters, msg.sender); bool negativeVote = _checkSenderHasVoted(proposals[_id].negativeVoters, msg.sender); require( !positiveVote && !negativeVote, "VC:1020" ); _; } /// @dev Verify if the proposal have voting enabled /// /// Requirements: /// {proposals[_id]} should have voting enabled /// /// @param _id - Represent the proposal index /// modifier isVoteEnabled( uint256 _id ) { require( proposals[_id].votingEnabled, "VC:1030" ); _; } constructor() public { _minVoteBalance = 100; } /// @notice Expose the min balance required to vote /// /// @return The uint256 value of {_minVoteBalance} /// function minVoteBalance() public view returns (uint256) { return _minVoteBalance; } /// @notice Set the {_minVoteBalance} /// /// @dev Only owner can use this function /// /// @param _amount - Represent the requested ratio /// function setMinVoteBalance( uint256 _amount ) public virtual onlyOwner() { _minVoteBalance = _amount; } /// @notice Allow a chairperson to create a new {Proposal} /// /// @dev Sender should be a chairperson /// /// Requirements: /// See {Voteable::isChairperson()} /// /// @param _name - Represent the Proposal name /// @param _uri - Represent the Proposal metadata uri /// @param _enable - Represent if vote is enable/disable /// function createProposal( string memory _name, string memory _uri, bool _enable ) public virtual isChairperson() { proposals.push( Proposal({ creator: msg.sender, name: _name, metadataURI: _uri, votingEnabled: _enable, positiveVote: 0, negativeVote: 0, positiveVoters: new address[](0), negativeVoters: new address[](0) }) ); } /// @notice Allow a chairperson to enable/disable voting /// for a proposal /// /// @dev Sender should be a chairperson /// /// Requirements: /// See {Voteable::isChairperson()} /// /// @param _id - Represent a proposal index /// function enableProposal( uint256 _id ) public virtual isChairperson() { proposals[_id].votingEnabled ? proposals[_id].votingEnabled = false : proposals[_id].votingEnabled = true; } /// @notice Expose all proposals /// /// @return A tuple of Proposal /// function exposeProposals() public view returns (Proposal[] memory) { return proposals; } /// @notice Verify if the sender have already voted /// for a proposal /// /// @dev The function iterate hover the {_voters} /// to know if the sender have already voted /// /// @param _voters - Represent the positive/negative /// voters of a proposal /// function _checkSenderHasVoted( address[] memory _voters, address _voter ) private pure returns (bool) { uint256 i = 0; bool voted = false; uint256 len = _voters.length; while (i < len) { if (_voters[i] == _voter) { voted = true; break; } i++; } return voted; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"BurningDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"BurningEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"MintingDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"MintingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"CREATOR","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_BURNER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_CHAIRPERSON","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_MINTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_OWNER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burningEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"createProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"enableProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exposeProposals","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"},{"internalType":"bool","name":"votingEnabled","type":"bool"},{"internalType":"uint256","name":"positiveVote","type":"uint256"},{"internalType":"uint256","name":"negativeVote","type":"uint256"},{"internalType":"address[]","name":"positiveVoters","type":"address[]"},{"internalType":"address[]","name":"negativeVoters","type":"address[]"}],"internalType":"struct Voteable.Proposal[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"exposeRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"exposeStakeholder","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"availableReward","type":"uint256"},{"internalType":"uint256","name":"totalRewardEarned","type":"uint256"},{"internalType":"uint256","name":"totalRewardSpent","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"lastRewardCalculatedAt","type":"uint256"}],"internalType":"struct Stakeable.Stakeholder","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exposeStakeholders","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"availableReward","type":"uint256"},{"internalType":"uint256","name":"totalRewardEarned","type":"uint256"},{"internalType":"uint256","name":"totalRewardSpent","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"lastRewardCalculatedAt","type":"uint256"}],"internalType":"struct Stakeable.Stakeholder[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"}],"name":"getRoleMembersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"grantManagerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRewardRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minVoteBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_role","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxRewardRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMinVoteBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_target","type":"address"}],"name":"spend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOwnerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_isPositiveVote","type":"bool"}],"name":"voteForProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600781526020017f556e6973736f75000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f59544700000000000000000000000000000000000000000000000000000000008152506522f6028b90006508bd80a2e4006008600760006101000a81548160ff021916908360ff1602179055508360059080519060200190620000c092919062000896565b508260069080519060200190620000d992919062000896565b508160048190555080600281905550505050506064600981905550600a600c819055506000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506000600e60026101000a81548160ff021916908315150217905550620001626000801b33620001ed60201b60201c565b620001947faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c33620001ed60201b60201c565b620001b533620001a96200020360201b60201c565b6200020d60201b60201c565b620001e77f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38233620003bc60201b60201c565b62000c41565b620001ff82826200050f60201b60201c565b5050565b6000600254905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000280576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002779062000ba3565b60405180910390fd5b6200029460008383620005a460201b60201c565b620002b081600354620006c860201b62002fff1790919060201c565b6003819055506200030e816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620006c860201b62002fff1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003b0919062000c09565b60405180910390a35050565b620003ee7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336200072060201b60201c565b62000430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004279062000b3d565b60405180910390fd5b6000801b82141562000479576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004709062000be7565b60405180910390fd5b6200048e6000801b336200072060201b60201c565b620004f9577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214620004f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ef9062000b1b565b60405180910390fd5b5b6200050b82826200050f60201b60201c565b5050565b6200053e81600860008581526020019081526020016000206000016200075960201b620030541790919060201c565b15620005a0573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b620005bc8383836200079160201b620030841760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200067057620006026200079660201b60201c565b6200062b8262000617620007a060201b60201c565b620006c860201b62002fff1790919060201c565b11156200066f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006669062000b5f565b60405180910390fd5b5b62000680620007aa60201b60201c565b15620006c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006ba9062000bc5565b60405180910390fd5b505050565b60008082840190508381101562000716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070d9062000b81565b60405180910390fd5b8091505092915050565b6000620007518260086000868152602001908152602001600020600001620007c160201b620030891790919060201c565b905092915050565b600062000789836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620007f960201b60201c565b905092915050565b505050565b6000600454905090565b6000600354905090565b6000600e60009054906101000a900460ff16905090565b6000620007f1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200087360201b60201c565b905092915050565b60006200080d83836200087360201b60201c565b620008685782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200086d565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620008d957805160ff19168380011785556200090a565b828001600101855582156200090a579182015b8281111562000909578251825591602001919060010190620008ec565b5b5090506200091991906200091d565b5090565b5b80821115620009385760008160009055506001016200091e565b5090565b60006200094b60078362000c26565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006200098d60078362000c26565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000620009cf60058362000c26565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000a11601b8362000c26565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600062000a5360098362000c26565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000a9560068362000c26565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600062000ad760078362000c26565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b62000b158162000c37565b82525050565b6000602082019050818103600083015262000b36816200093c565b9050919050565b6000602082019050818103600083015262000b58816200097e565b9050919050565b6000602082019050818103600083015262000b7a81620009c0565b9050919050565b6000602082019050818103600083015262000b9c8162000a02565b9050919050565b6000602082019050818103600083015262000bbe8162000a44565b9050919050565b6000602082019050818103600083015262000be08162000a86565b9050919050565b6000602082019050818103600083015262000c028162000ac8565b9050919050565b600060208201905062000c20600083018462000b0a565b92915050565b600082825260208201905092915050565b6000819050919050565b615e308062000c516000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806379cc67901161019d578063a694fc3a116100e9578063d547741f116100a2578063e4fbb6091161007c578063e4fbb6091461091b578063ed7c1b2014610939578063f5b944eb14610955578063fefaef3f146109735761030c565b8063d547741f146108b3578063dd62ed3e146108cf578063e487948d146108ff5761030c565b8063a694fc3a146107dd578063a89e0b89146107f9578063a9059cbb14610829578063bb102aea14610859578063bcdc3cfc14610877578063c6d4831a146108955761030c565b806391d14854116101565780639aded223116101305780639aded223146107435780639fd6db1214610773578063a0712d6814610791578063a457c2d7146107ad5761030c565b806391d14854146106d757806392afc33a1461070757806395d89b41146107255761030c565b806379cc67901461063d5780637cca542914610659578063806e085e146106775780638456cb59146106935780638ad682af1461069d5780638bb9c5bf146106bb5761030c565b8063395093511161025c57806354ff02d8116102155780636505e8e8116101ef5780636505e8e8146105b75780636d50838e146105d357806370a08231146105ef57806372ddc50e1461061f5761030c565b806354ff02d81461055d5780635a5c313e1461057b5780635c975abb146105995761030c565b806339509351146104c35780633ccfd60b146104f35780633f4ba83a146104fd57806342966c6814610507578063449a52f8146105235780634d7547151461053f5761030c565b806326e885e3116102c95780632f2ff15d116102a35780632f2ff15d1461043b578063313ce56714610457578063378dc3dc146104755780633884e621146104935761030c565b806326e885e3146103e75780632cdd626b146104035780632e17de781461041f5761030c565b806306fdde0314610311578063095ea7b31461032f5780630a8503bc1461035f57806318160ddd1461037d5780631e9f59db1461039b57806323b872dd146103b7575b600080fd5b61031961098f565b60405161032691906156c0565b60405180910390f35b610349600480360381019061034491906146b4565b610a31565b604051610356919061568a565b60405180910390f35b610367610a4e565b6040516103749190615668565b60405180910390f35b610385610b3f565b6040516103929190615b5d565b60405180910390f35b6103b560048036038101906103b0919061488d565b610b49565b005b6103d160048036038101906103cc9190614665565b610d43565b6040516103de919061568a565b60405180910390f35b61040160048036038101906103fc9190614600565b610e31565b005b61041d60048036038101906104189190614864565b610eaa565b005b61043960048036038101906104349190614864565b610f00565b005b6104556004803603810190610450919061476d565b611153565b005b61045f611284565b60405161046c9190615b78565b60405180910390f35b61047d61129b565b60405161048a9190615b5d565b60405180910390f35b6104ad60048036038101906104a89190614744565b6112a5565b6040516104ba9190615b5d565b60405180910390f35b6104dd60048036038101906104d891906146b4565b6112cc565b6040516104ea919061568a565b60405180910390f35b6104fb611377565b005b61050561146a565b005b610521600480360381019061051c9190614864565b611565565b005b61053d600480360381019061053891906146b4565b611679565b005b61054761178e565b604051610554919061568a565b60405180910390f35b6105656117a5565b60405161057291906156a5565b60405180910390f35b6105836117c9565b60405161059091906156a5565b60405180910390f35b6105a16117ed565b6040516105ae919061568a565b60405180910390f35b6105d160048036038101906105cc91906148c9565b611804565b005b6105ed60048036038101906105e89190614864565b611bde565b005b61060960048036038101906106049190614600565b611ced565b6040516106169190615b5d565b60405180910390f35b610627611d35565b6040516106349190615b5d565b60405180910390f35b610657600480360381019061065291906146b4565b611d3f565b005b610661611e80565b60405161066e9190615b5d565b60405180910390f35b610691600480360381019061068c91906146f0565b611e8a565b005b61069b611f18565b005b6106a5612014565b6040516106b291906156a5565b60405180910390f35b6106d560048036038101906106d09190614744565b61201b565b005b6106f160048036038101906106ec919061476d565b6120b7565b6040516106fe919061568a565b60405180910390f35b61070f6120e9565b60405161071c91906156a5565b60405180910390f35b61072d61210d565b60405161073a91906156c0565b60405180910390f35b61075d600480360381019061075891906147a9565b6121af565b60405161076a919061562b565b60405180910390f35b61077b6121e1565b604051610788919061568a565b60405180910390f35b6107ab60048036038101906107a69190614864565b6121f8565b005b6107c760048036038101906107c291906146b4565b61230c565b6040516107d4919061568a565b60405180910390f35b6107f760048036038101906107f29190614864565b6123ee565b005b610813600480360381019061080e9190614600565b6125eb565b6040516108209190615b42565b60405180910390f35b610843600480360381019061083e91906146b4565b61274f565b604051610850919061568a565b60405180910390f35b610861612766565b60405161086e9190615b5d565b60405180910390f35b61087f612770565b60405161088c9190615b5d565b60405180910390f35b61089d61277a565b6040516108aa9190615646565b60405180910390f35b6108cd60048036038101906108c8919061476d565b612abf565b005b6108e960048036038101906108e49190614629565b612bf0565b6040516108f69190615b5d565b60405180910390f35b61091960048036038101906109149190614864565b612c77565b005b610923612ccd565b60405161093091906156c0565b60405180910390f35b610953600480360381019061094e9190614600565b612d06565b005b61095d612d6f565b60405161096a91906156a5565b60405180910390f35b61098d600480360381019061098891906147e5565b612d93565b005b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b6000610a4433846305f5e10085026130b9565b6001905092915050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015610b3657838290600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081526020019060010190610a72565b50505050905090565b6000600354905090565b610b566000801b336120b7565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906158a2565b60405180910390fd5b6000806000600d8054905090505b80831015610c33578373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610bcf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c265760019150610c33565b8280600101935050610ba3565b81610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615782565b60405180910390fd5b8115610d3c57610c8283613284565b600d8381548110610c8f57fe5b906000526020600020906007020160020154851115610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90615a42565b60405180910390fd5b84600d8481548110610cf157fe5b90600052602060002090600702016002016000828254039250508190555084600d8481548110610d1d57fe5b9060005260206000209060070201600401600082825401925050819055505b5050505050565b6000610d508484846134c3565b610e268433610e216305f5e10086026040518060400160405280600981526020017f45524332303a3439300000000000000000000000000000000000000000000000815250600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b600190509392505050565b610e3e6000801b336120b7565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906158a2565b60405180910390fd5b610ea77faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c82613813565b50565b610eb76000801b336120b7565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906158a2565b60405180910390fd5b8060098190555050565b8060008111610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906157e2565b60405180910390fd5b81610f4d614320565b610f56336125eb565b90508060200151821115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615922565b60405180910390fd5b6000806000600d8054905090505b8083101561103d573373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610fd957fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611030576001915061103d565b8280600101935050610fad565b8161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490615782565b60405180910390fd5b811561114a57600d838154811061109057fe5b90600052602060002090600702016001015487116111495786600d84815481106110b657fe5b9060005260206000209060070201600101600082825403925050819055506110e4336305f5e10089026138a0565b6305f5e1008702600b600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75886040516111409190615b5d565b60405180910390a25b5b50505050505050565b61117d7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b6111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390615762565b60405180910390fd5b6000801b821415611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906159a2565b60405180910390fd5b61120f6000801b336120b7565b611276577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c906156e2565b60405180910390fd5b5b6112808282613813565b5050565b6000600760009054906101000a900460ff16905090565b6000600254905090565b60006112c560086000848152602001908152602001600020600001613a34565b9050919050565b600061136d33846113686305f5e1008602600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6130b9565b6001905092915050565b6000806000600d8054905090505b80831015611415573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106113b157fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156114085760019150611415565b8280600101935050611385565b81611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90615782565b60405180910390fd5b81156114655761146483613284565b5b505050565b600e60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090615ac2565b60405180910390fd5b6114c66000801b336120b7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906158a2565b60405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b806115907f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b806115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c790615702565b60405180910390fd5b60008211611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90615a02565b60405180910390fd5b61161b613a49565b61162361178e565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990615822565b60405180910390fd5b61166c3384613aa9565b611674613c74565b505050565b806116a47ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b806116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db906159e2565b60405180910390fd5b60008211611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615aa2565b60405180910390fd5b61172f613cd4565b6117376121e1565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90615942565b60405180910390fd5b61178084846138a0565b611788613d34565b50505050565b6000600e60029054906101000a900460ff16905090565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38281565b6000600e60009054906101000a900460ff16905090565b8161180e33611ced565b6305f5e10060095402811015611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090615882565b60405180910390fd5b6000611907600a848154811061186b57fe5b90600052602060002090600802016006018054806020026020016040519081016040528092919081815260200182805480156118fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116118b2575b505050505033613d94565b905060006119b7600a858154811061191b57fe5b90600052602060002090600802016007018054806020026020016040519081016040528092919081815260200182805480156119ac57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611962575b505050505033613d94565b9050811580156119c5575080155b611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906158c2565b60405180910390fd5b85600a8181548110611a1257fe5b906000526020600020906008020160030160009054906101000a900460ff16611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790615b22565b60405180910390fd5b8515611b23576001600a8881548110611a8557fe5b906000526020600020906008020160040160008282540192505081905550600a8781548110611ab057fe5b9060005260206000209060080201600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b85611bd5576001600a8881548110611b3757fe5b906000526020600020906008020160050160008282540192505081905550600a8781548110611b6257fe5b9060005260206000209060080201600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505050505050565b611c087f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90615ae2565b60405180910390fd5b600a8181548110611c5457fe5b906000526020600020906008020160030160009054906101000a900460ff16611cb2576001600a8281548110611c8657fe5b906000526020600020906008020160030160006101000a81548160ff0219169083151502179055611ce9565b6000600a8281548110611cc157fe5b906000526020600020906008020160030160006101000a81548160ff02191690831515021790555b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600954905090565b80611d6a7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b80611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190615702565b60405180910390fd5b60008211611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615a02565b60405180910390fd5b611df5613a49565b611dfd61178e565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390615822565b60405180910390fd5b6000611e5a84611e4c8733612bf0565b613e1490919063ffffffff16565b9050611e678533836130b9565b611e718585613aa9565b611e79613c74565b5050505050565b6000600c54905090565b60008083519050808302611e9d33611ced565b1015611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590615842565b60405180910390fd5b5b80821015611f1257611f04848381518110611ef657fe5b60200260200101518461274f565b508180600101925050611edf565b50505050565b600e60009054906101000a900460ff1615611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615982565b60405180910390fd5b611f756000801b336120b7565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906158a2565b60405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000801b81565b6000801b811415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890615742565b60405180910390fd5b61206b81336120b7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a1906159c2565b60405180910390fd5b6120b48133613e5e565b50565b60006120e1826008600086815260200190815260200160002060000161308990919063ffffffff16565b905092915050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a55780601f1061217a576101008083540402835291602001916121a5565b820191906000526020600020905b81548152906001019060200180831161218857829003601f168201915b5050505050905090565b60006121d98260086000868152602001908152602001600020600001613eeb90919063ffffffff16565b905092915050565b6000600e60019054906101000a900460ff16905090565b806122237ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b80612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906159e2565b60405180910390fd5b600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90615aa2565b60405180910390fd5b6122ae613cd4565b6122b66121e1565b6122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec90615942565b60405180910390fd5b6122ff33846138a0565b612307613d34565b505050565b60006123e433846123df6305f5e10086026040518060400160405280600981526020017f45524332303a3439350000000000000000000000000000000000000000000000815250600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b6001905092915050565b806123f833611ced565b806305f5e10083021115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615922565b60405180910390fd5b8260008111612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c906157e2565b60405180910390fd5b6000806000600d8054905090505b80831015612523573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106124bf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125165760019150612523565b8280600101935050612493565b81156125ca5786600d848154811061253757fe5b906000526020600020906007020160010160008282540192505081905550612565336305f5e1008902613aa9565b6305f5e1008702600b600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516125c19190615b5d565b60405180910390a25b816125e2576125d833613f05565b6125e1876123ee565b5b50505050505050565b6125f3614320565b600080600d8054905090505b80821015612747578373ffffffffffffffffffffffffffffffffffffffff16600d838154811061262b57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561273a57600d828154811061268657fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509250505061274a565b81806001019250506125ff565b50505b919050565b600061275c3384846134c3565b6001905092915050565b6000600454905090565b6000600b54905090565b6060600a805480602002602001604051908101604052809291908181526020016000905b82821015612ab65783829060005260206000209060080201604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128b15780601f10612886576101008083540402835291602001916128b1565b820191906000526020600020905b81548152906001019060200180831161289457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b505050505081526020016003820160009054906101000a900460ff16151515158152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129c6575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612a9e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612a54575b5050505050815250508152602001906001019061279e565b50505050905090565b612ae97faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615a22565b60405180910390fd5b6000801b821415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590615742565b60405180910390fd5b612b7b6000801b336120b7565b612be2577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd8906156e2565b60405180910390fd5b5b612bec8282613e5e565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c846000801b336120b7565b612cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cba906158a2565b60405180910390fd5b80600c8190555050565b6040518060400160405280600b81526020017f756e6973736f752e636f6d00000000000000000000000000000000000000000081525081565b612d136000801b336120b7565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d49906158a2565b60405180910390fd5b612d5f6000801b82613813565b612d6c6000801b33613e5e565b50565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b612dbd7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390615ae2565b60405180910390fd5b600a6040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183151581526020016000815260200160008152602001600067ffffffffffffffff81118015612e6057600080fd5b50604051908082528060200260200182016040528015612e8f5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015612ead57600080fd5b50604051908082528060200260200182016040528015612edc5781602001602082028036833780820191505090505b50815250908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612f6c929190614373565b506040820151816002019080519060200190612f89929190614373565b5060608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a0820151816005015560c0820151816006019080519060200190612fda9291906143f3565b5060e0820151816007019080519060200190612ff79291906143f3565b505050505050565b60008082840190508381101561304a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304190615802565b60405180910390fd5b8091505092915050565b600061307c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614006565b905092915050565b505050565b60006130b1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614076565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090615902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613199576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613190906158e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132779190615b5d565b60405180910390a3505050565b6000600d828154811061329357fe5b90600052602060002090600702016001015490506000600d83815481106132b657fe5b90600052602060002090600702016006015490506000600d84815481106132d957fe5b906000526020600020906007020160050154905060008214156133d557428110156133d45762015180814203106133d357600c5483111561331c57600c5461331e565b825b620151808242038161332c57fe5b0402600d858154811061333b57fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561336b57600c5461336d565b825b620151808242038161337b57fe5b0402600d858154811061338a57fe5b90600052602060002090600702016003016000828254019250508190555042600d85815481106133b657fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b600082146134bc57428210156134bb5762015180824203106134ba57600c5483111561340357600c54613405565b825b620151808342038161341357fe5b0402600d858154811061342257fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561345257600c54613454565b825b620151808342038161346257fe5b0402600d858154811061347157fe5b90600052602060002090600702016003016000828254019250508190555042600d858154811061349d57fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b5050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a90615a82565b60405180910390fd5b600081116135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd906157a2565b60405180910390fd5b6135f1838383614099565b613679816040518060400160405280600981526020017f45524332303a34373000000000000000000000000000000000000000000000008152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137ab9190615b5d565b60405180910390a3505050565b6000838311158290613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f791906156c0565b60405180910390fd5b5060008385039050809150509392505050565b61383b816008600085815260200190815260200160002060000161305490919063ffffffff16565b1561389c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615862565b60405180910390fd5b61391c60008383614099565b61393181600354612fff90919063ffffffff16565b600381905550613988816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a289190615b5d565b60405180910390a35050565b6000613a428260000161418a565b9050919050565b6001600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f0846bb88ff3b4abf3ada7790ae6fc103385a19b2aed99f8e450648b9e1374a3660405160405180910390a2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1090615a62565b60405180910390fd5b613b2582600083614099565b613bad816040518060400160405280600981526020017f45524332303a32333000000000000000000000000000000000000000000000008152506000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0481600354613e1490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c689190615b5d565b60405180910390a35050565b6000600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fc21bebfeff90d942c9009e0eca370a1ab9ddc28e67af48c2a213e3e9ad65fe0860405160405180910390a2565b6001600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f04fe8ec10fc27a3eb74bc6484c1010613b3354832dd9c927827d71388ee2677a60405160405180910390a2565b6000600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f340bf1b235fa0bbed4b1b74504c172953a38e3ef4bd71a7042fd2a0057455b7360405160405180910390a2565b60008060009050600080855190505b80831015613e08578473ffffffffffffffffffffffffffffffffffffffff16868481518110613dce57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415613dfb5760019150613e08565b8280600101935050613da3565b81935050505092915050565b6000613e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b8565b905092915050565b613e86816008600085815260200190815260200160002060000161419b90919063ffffffff16565b15613ee7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613efa83600001836141cb565b60001c905092915050565b600d6040518060e001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020014281526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050565b60006140128383614076565b61406b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614070565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6140a4838383613084565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561413d576140e1612766565b6140fb826140ed610b3f565b612fff90919063ffffffff16565b111561413c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614133906157c2565b60405180910390fd5b5b6141456117ed565b15614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c90615962565b60405180910390fd5b505050565b600081600001805490509050919050565b60006141c3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614238565b905092915050565b600081836000018054905011614216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420d90615722565b60405180910390fd5b82600001828154811061422557fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114614314576000600182039050600060018660000180549050039050600086600001828154811061428357fe5b90600052602060002001549050808760000184815481106142a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806142d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061431a565b60009150505b92915050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143b457805160ff19168380011785556143e2565b828001600101855582156143e2579182015b828111156143e15782518255916020019190600101906143c6565b5b5090506143ef919061447d565b5090565b82805482825590600052602060002090810192821561446c579160200282015b8281111561446b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614413565b5b509050614479919061449a565b5090565b5b8082111561449657600081600090555060010161447e565b5090565b5b808211156144d157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161449b565b5090565b6000813590506144e481615d9e565b92915050565b600082601f8301126144fb57600080fd5b813561450e61450982615bc0565b615b93565b9150818183526020840193506020810190508385602084028201111561453357600080fd5b60005b83811015614563578161454988826144d5565b845260208401935060208301925050600181019050614536565b5050505092915050565b60008135905061457c81615db5565b92915050565b60008135905061459181615dcc565b92915050565b600082601f8301126145a857600080fd5b81356145bb6145b682615be8565b615b93565b915080825260208301602083018583830111156145d757600080fd5b6145e2838284615d4b565b50505092915050565b6000813590506145fa81615de3565b92915050565b60006020828403121561461257600080fd5b6000614620848285016144d5565b91505092915050565b6000806040838503121561463c57600080fd5b600061464a858286016144d5565b925050602061465b858286016144d5565b9150509250929050565b60008060006060848603121561467a57600080fd5b6000614688868287016144d5565b9350506020614699868287016144d5565b92505060406146aa868287016145eb565b9150509250925092565b600080604083850312156146c757600080fd5b60006146d5858286016144d5565b92505060206146e6858286016145eb565b9150509250929050565b6000806040838503121561470357600080fd5b600083013567ffffffffffffffff81111561471d57600080fd5b614729858286016144ea565b925050602061473a858286016145eb565b9150509250929050565b60006020828403121561475657600080fd5b600061476484828501614582565b91505092915050565b6000806040838503121561478057600080fd5b600061478e85828601614582565b925050602061479f858286016144d5565b9150509250929050565b600080604083850312156147bc57600080fd5b60006147ca85828601614582565b92505060206147db858286016145eb565b9150509250929050565b6000806000606084860312156147fa57600080fd5b600084013567ffffffffffffffff81111561481457600080fd5b61482086828701614597565b935050602084013567ffffffffffffffff81111561483d57600080fd5b61484986828701614597565b925050604061485a8682870161456d565b9150509250925092565b60006020828403121561487657600080fd5b6000614884848285016145eb565b91505092915050565b600080604083850312156148a057600080fd5b60006148ae858286016145eb565b92505060206148bf858286016144d5565b9150509250929050565b600080604083850312156148dc57600080fd5b60006148ea858286016145eb565b92505060206148fb8582860161456d565b9150509250929050565b60006149118383614949565b60208301905092915050565b6000614929838361541d565b905092915050565b600061493d83836154e2565b60e08301905092915050565b61495281615cec565b82525050565b61496181615cec565b82525050565b600061497282615c44565b61497c8185615c97565b935061498783615c14565b8060005b838110156149b857815161499f8882614905565b97506149aa83615c70565b92505060018101905061498b565b5085935050505092915050565b60006149d082615c4f565b6149da8185615ca8565b9350836020820285016149ec85615c24565b8060005b85811015614a285784840389528151614a09858261491d565b9450614a1483615c7d565b925060208a019950506001810190506149f0565b50829750879550505050505092915050565b6000614a4582615c5a565b614a4f8185615cb9565b9350614a5a83615c34565b8060005b83811015614a8b578151614a728882614931565b9750614a7d83615c8a565b925050600181019050614a5e565b5085935050505092915050565b614aa181615cfe565b82525050565b614ab081615cfe565b82525050565b614abf81615d0a565b82525050565b6000614ad082615c65565b614ada8185615cca565b9350614aea818560208601615d5a565b614af381615d8d565b840191505092915050565b6000614b0982615c65565b614b138185615cdb565b9350614b23818560208601615d5a565b614b2c81615d8d565b840191505092915050565b6000614b44600783615cdb565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b84600683615cdb565b91507f42433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bc4602283615cdb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c2a600783615cdb565b91507f5250433a353430000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c6a600783615cdb565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614caa600683615cdb565b91507f53433a36353000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614cea600983615cdb565b91507f45524332303a34383000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2a600583615cdb565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d6a600683615cdb565b91507f53433a36333000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614daa601b83615cdb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614dea600683615cdb565b91507f42433a32313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e2a600683615cdb565b91507f55543a34373000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e6a600983615cdb565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eaa600783615cdb565b91507f56433a31303130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eea600783615cdb565b91507f5250433a353030000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f2a600783615cdb565b91507f56433a31303230000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f6a600983615cdb565b91507f45524332303a34363000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614faa600983615cdb565b91507f45524332303a34353000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fea600683615cdb565b91507f53433a36343000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061502a600683615cdb565b91507f4d433a31313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061506a600683615cdb565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150aa600683615cdb565b91507f50433a33303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150ea600783615cdb565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061512a600783615cdb565b91507f5250433a353730000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061516a600683615cdb565b91507f4d433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151aa600583615cdb565b91507f42433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151ea600783615cdb565b91507f5250433a353530000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061522a600683615cdb565b91507f53433a36363000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061526a600983615cdb565b91507f45524332303a32323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152aa600983615cdb565b91507f45524332303a34323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152ea600583615cdb565b91507f4d433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061532a600683615cdb565b91507f50433a33313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061536a600683615cdb565b91507f56433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153aa600983615cdb565b91507f45524332303a34313000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153ea600783615cdb565b91507f56433a31303330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000610100830160008301516154366000860182614949565b506020830151848203602086015261544e8282614ac5565b915050604083015184820360408601526154688282614ac5565b915050606083015161547d6060860182614a98565b50608083015161549060808601826155fe565b5060a08301516154a360a08601826155fe565b5060c083015184820360c08601526154bb8282614967565b91505060e083015184820360e08601526154d58282614967565b9150508091505092915050565b60e0820160008201516154f86000850182614949565b50602082015161550b60208501826155fe565b50604082015161551e60408501826155fe565b50606082015161553160608501826155fe565b50608082015161554460808501826155fe565b5060a082015161555760a08501826155fe565b5060c082015161556a60c08501826155fe565b50505050565b60e0820160008201516155866000850182614949565b50602082015161559960208501826155fe565b5060408201516155ac60408501826155fe565b5060608201516155bf60608501826155fe565b5060808201516155d260808501826155fe565b5060a08201516155e560a08501826155fe565b5060c08201516155f860c08501826155fe565b50505050565b61560781615d34565b82525050565b61561681615d34565b82525050565b61562581615d3e565b82525050565b60006020820190506156406000830184614958565b92915050565b6000602082019050818103600083015261566081846149c5565b905092915050565b600060208201905081810360008301526156828184614a3a565b905092915050565b600060208201905061569f6000830184614aa7565b92915050565b60006020820190506156ba6000830184614ab6565b92915050565b600060208201905081810360008301526156da8184614afe565b905092915050565b600060208201905081810360008301526156fb81614b37565b9050919050565b6000602082019050818103600083015261571b81614b77565b9050919050565b6000602082019050818103600083015261573b81614bb7565b9050919050565b6000602082019050818103600083015261575b81614c1d565b9050919050565b6000602082019050818103600083015261577b81614c5d565b9050919050565b6000602082019050818103600083015261579b81614c9d565b9050919050565b600060208201905081810360008301526157bb81614cdd565b9050919050565b600060208201905081810360008301526157db81614d1d565b9050919050565b600060208201905081810360008301526157fb81614d5d565b9050919050565b6000602082019050818103600083015261581b81614d9d565b9050919050565b6000602082019050818103600083015261583b81614ddd565b9050919050565b6000602082019050818103600083015261585b81614e1d565b9050919050565b6000602082019050818103600083015261587b81614e5d565b9050919050565b6000602082019050818103600083015261589b81614e9d565b9050919050565b600060208201905081810360008301526158bb81614edd565b9050919050565b600060208201905081810360008301526158db81614f1d565b9050919050565b600060208201905081810360008301526158fb81614f5d565b9050919050565b6000602082019050818103600083015261591b81614f9d565b9050919050565b6000602082019050818103600083015261593b81614fdd565b9050919050565b6000602082019050818103600083015261595b8161501d565b9050919050565b6000602082019050818103600083015261597b8161505d565b9050919050565b6000602082019050818103600083015261599b8161509d565b9050919050565b600060208201905081810360008301526159bb816150dd565b9050919050565b600060208201905081810360008301526159db8161511d565b9050919050565b600060208201905081810360008301526159fb8161515d565b9050919050565b60006020820190508181036000830152615a1b8161519d565b9050919050565b60006020820190508181036000830152615a3b816151dd565b9050919050565b60006020820190508181036000830152615a5b8161521d565b9050919050565b60006020820190508181036000830152615a7b8161525d565b9050919050565b60006020820190508181036000830152615a9b8161529d565b9050919050565b60006020820190508181036000830152615abb816152dd565b9050919050565b60006020820190508181036000830152615adb8161531d565b9050919050565b60006020820190508181036000830152615afb8161535d565b9050919050565b60006020820190508181036000830152615b1b8161539d565b9050919050565b60006020820190508181036000830152615b3b816153dd565b9050919050565b600060e082019050615b576000830184615570565b92915050565b6000602082019050615b72600083018461560d565b92915050565b6000602082019050615b8d600083018461561c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615bb657600080fd5b8060405250919050565b600067ffffffffffffffff821115615bd757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115615bff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615cf782615d14565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615d78578082015181840152602081019050615d5d565b83811115615d87576000848401525b50505050565b6000601f19601f8301169050919050565b615da781615cec565b8114615db257600080fd5b50565b615dbe81615cfe565b8114615dc957600080fd5b50565b615dd581615d0a565b8114615de057600080fd5b50565b615dec81615d34565b8114615df757600080fd5b5056fea2646970667358221220ba2fad7ffcf3442a88d6c70a050b97bd7e084781fe1f72ae119f153f4077855664736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806379cc67901161019d578063a694fc3a116100e9578063d547741f116100a2578063e4fbb6091161007c578063e4fbb6091461091b578063ed7c1b2014610939578063f5b944eb14610955578063fefaef3f146109735761030c565b8063d547741f146108b3578063dd62ed3e146108cf578063e487948d146108ff5761030c565b8063a694fc3a146107dd578063a89e0b89146107f9578063a9059cbb14610829578063bb102aea14610859578063bcdc3cfc14610877578063c6d4831a146108955761030c565b806391d14854116101565780639aded223116101305780639aded223146107435780639fd6db1214610773578063a0712d6814610791578063a457c2d7146107ad5761030c565b806391d14854146106d757806392afc33a1461070757806395d89b41146107255761030c565b806379cc67901461063d5780637cca542914610659578063806e085e146106775780638456cb59146106935780638ad682af1461069d5780638bb9c5bf146106bb5761030c565b8063395093511161025c57806354ff02d8116102155780636505e8e8116101ef5780636505e8e8146105b75780636d50838e146105d357806370a08231146105ef57806372ddc50e1461061f5761030c565b806354ff02d81461055d5780635a5c313e1461057b5780635c975abb146105995761030c565b806339509351146104c35780633ccfd60b146104f35780633f4ba83a146104fd57806342966c6814610507578063449a52f8146105235780634d7547151461053f5761030c565b806326e885e3116102c95780632f2ff15d116102a35780632f2ff15d1461043b578063313ce56714610457578063378dc3dc146104755780633884e621146104935761030c565b806326e885e3146103e75780632cdd626b146104035780632e17de781461041f5761030c565b806306fdde0314610311578063095ea7b31461032f5780630a8503bc1461035f57806318160ddd1461037d5780631e9f59db1461039b57806323b872dd146103b7575b600080fd5b61031961098f565b60405161032691906156c0565b60405180910390f35b610349600480360381019061034491906146b4565b610a31565b604051610356919061568a565b60405180910390f35b610367610a4e565b6040516103749190615668565b60405180910390f35b610385610b3f565b6040516103929190615b5d565b60405180910390f35b6103b560048036038101906103b0919061488d565b610b49565b005b6103d160048036038101906103cc9190614665565b610d43565b6040516103de919061568a565b60405180910390f35b61040160048036038101906103fc9190614600565b610e31565b005b61041d60048036038101906104189190614864565b610eaa565b005b61043960048036038101906104349190614864565b610f00565b005b6104556004803603810190610450919061476d565b611153565b005b61045f611284565b60405161046c9190615b78565b60405180910390f35b61047d61129b565b60405161048a9190615b5d565b60405180910390f35b6104ad60048036038101906104a89190614744565b6112a5565b6040516104ba9190615b5d565b60405180910390f35b6104dd60048036038101906104d891906146b4565b6112cc565b6040516104ea919061568a565b60405180910390f35b6104fb611377565b005b61050561146a565b005b610521600480360381019061051c9190614864565b611565565b005b61053d600480360381019061053891906146b4565b611679565b005b61054761178e565b604051610554919061568a565b60405180910390f35b6105656117a5565b60405161057291906156a5565b60405180910390f35b6105836117c9565b60405161059091906156a5565b60405180910390f35b6105a16117ed565b6040516105ae919061568a565b60405180910390f35b6105d160048036038101906105cc91906148c9565b611804565b005b6105ed60048036038101906105e89190614864565b611bde565b005b61060960048036038101906106049190614600565b611ced565b6040516106169190615b5d565b60405180910390f35b610627611d35565b6040516106349190615b5d565b60405180910390f35b610657600480360381019061065291906146b4565b611d3f565b005b610661611e80565b60405161066e9190615b5d565b60405180910390f35b610691600480360381019061068c91906146f0565b611e8a565b005b61069b611f18565b005b6106a5612014565b6040516106b291906156a5565b60405180910390f35b6106d560048036038101906106d09190614744565b61201b565b005b6106f160048036038101906106ec919061476d565b6120b7565b6040516106fe919061568a565b60405180910390f35b61070f6120e9565b60405161071c91906156a5565b60405180910390f35b61072d61210d565b60405161073a91906156c0565b60405180910390f35b61075d600480360381019061075891906147a9565b6121af565b60405161076a919061562b565b60405180910390f35b61077b6121e1565b604051610788919061568a565b60405180910390f35b6107ab60048036038101906107a69190614864565b6121f8565b005b6107c760048036038101906107c291906146b4565b61230c565b6040516107d4919061568a565b60405180910390f35b6107f760048036038101906107f29190614864565b6123ee565b005b610813600480360381019061080e9190614600565b6125eb565b6040516108209190615b42565b60405180910390f35b610843600480360381019061083e91906146b4565b61274f565b604051610850919061568a565b60405180910390f35b610861612766565b60405161086e9190615b5d565b60405180910390f35b61087f612770565b60405161088c9190615b5d565b60405180910390f35b61089d61277a565b6040516108aa9190615646565b60405180910390f35b6108cd60048036038101906108c8919061476d565b612abf565b005b6108e960048036038101906108e49190614629565b612bf0565b6040516108f69190615b5d565b60405180910390f35b61091960048036038101906109149190614864565b612c77565b005b610923612ccd565b60405161093091906156c0565b60405180910390f35b610953600480360381019061094e9190614600565b612d06565b005b61095d612d6f565b60405161096a91906156a5565b60405180910390f35b61098d600480360381019061098891906147e5565b612d93565b005b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b6000610a4433846305f5e10085026130b9565b6001905092915050565b6060600d805480602002602001604051908101604052809291908181526020016000905b82821015610b3657838290600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152505081526020019060010190610a72565b50505050905090565b6000600354905090565b610b566000801b336120b7565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c906158a2565b60405180910390fd5b6000806000600d8054905090505b80831015610c33578373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610bcf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610c265760019150610c33565b8280600101935050610ba3565b81610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90615782565b60405180910390fd5b8115610d3c57610c8283613284565b600d8381548110610c8f57fe5b906000526020600020906007020160020154851115610ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cda90615a42565b60405180910390fd5b84600d8481548110610cf157fe5b90600052602060002090600702016002016000828254039250508190555084600d8481548110610d1d57fe5b9060005260206000209060070201600401600082825401925050819055505b5050505050565b6000610d508484846134c3565b610e268433610e216305f5e10086026040518060400160405280600981526020017f45524332303a3439300000000000000000000000000000000000000000000000815250600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b600190509392505050565b610e3e6000801b336120b7565b610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e74906158a2565b60405180910390fd5b610ea77faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c82613813565b50565b610eb76000801b336120b7565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906158a2565b60405180910390fd5b8060098190555050565b8060008111610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b906157e2565b60405180910390fd5b81610f4d614320565b610f56336125eb565b90508060200151821115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690615922565b60405180910390fd5b6000806000600d8054905090505b8083101561103d573373ffffffffffffffffffffffffffffffffffffffff16600d8481548110610fd957fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611030576001915061103d565b8280600101935050610fad565b8161107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107490615782565b60405180910390fd5b811561114a57600d838154811061109057fe5b90600052602060002090600702016001015487116111495786600d84815481106110b657fe5b9060005260206000209060070201600101600082825403925050819055506110e4336305f5e10089026138a0565b6305f5e1008702600b600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75886040516111409190615b5d565b60405180910390a25b5b50505050505050565b61117d7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b6111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390615762565b60405180910390fd5b6000801b821415611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f9906159a2565b60405180910390fd5b61120f6000801b336120b7565b611276577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126c906156e2565b60405180910390fd5b5b6112808282613813565b5050565b6000600760009054906101000a900460ff16905090565b6000600254905090565b60006112c560086000848152602001908152602001600020600001613a34565b9050919050565b600061136d33846113686305f5e1008602600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6130b9565b6001905092915050565b6000806000600d8054905090505b80831015611415573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106113b157fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156114085760019150611415565b8280600101935050611385565b81611455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144c90615782565b60405180910390fd5b81156114655761146483613284565b5b505050565b600e60009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b090615ac2565b60405180910390fd5b6114c66000801b336120b7565b611505576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fc906158a2565b60405180910390fd5b6000600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60405160405180910390a2565b806115907f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b806115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c790615702565b60405180910390fd5b60008211611613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160a90615a02565b60405180910390fd5b61161b613a49565b61162361178e565b611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990615822565b60405180910390fd5b61166c3384613aa9565b611674613c74565b505050565b806116a47ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b806116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db906159e2565b60405180910390fd5b60008211611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615aa2565b60405180910390fd5b61172f613cd4565b6117376121e1565b611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90615942565b60405180910390fd5b61178084846138a0565b611788613d34565b50505050565b6000600e60029054906101000a900460ff16905090565b7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c881565b7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b38281565b6000600e60009054906101000a900460ff16905090565b8161180e33611ced565b6305f5e10060095402811015611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090615882565b60405180910390fd5b6000611907600a848154811061186b57fe5b90600052602060002090600802016006018054806020026020016040519081016040528092919081815260200182805480156118fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116118b2575b505050505033613d94565b905060006119b7600a858154811061191b57fe5b90600052602060002090600802016007018054806020026020016040519081016040528092919081815260200182805480156119ac57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611962575b505050505033613d94565b9050811580156119c5575080155b611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb906158c2565b60405180910390fd5b85600a8181548110611a1257fe5b906000526020600020906008020160030160009054906101000a900460ff16611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790615b22565b60405180910390fd5b8515611b23576001600a8881548110611a8557fe5b906000526020600020906008020160040160008282540192505081905550600a8781548110611ab057fe5b9060005260206000209060080201600601339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b85611bd5576001600a8881548110611b3757fe5b906000526020600020906008020160050160008282540192505081905550600a8781548110611b6257fe5b9060005260206000209060080201600701339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505050505050565b611c087f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90615ae2565b60405180910390fd5b600a8181548110611c5457fe5b906000526020600020906008020160030160009054906101000a900460ff16611cb2576001600a8281548110611c8657fe5b906000526020600020906008020160030160006101000a81548160ff0219169083151502179055611ce9565b6000600a8281548110611cc157fe5b906000526020600020906008020160030160006101000a81548160ff02191690831515021790555b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600954905090565b80611d6a7f9667e80708b6eeeb0053fa0cca44e028ff548e2a9f029edfeac87c118b08b7c8336120b7565b80611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190615702565b60405180910390fd5b60008211611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490615a02565b60405180910390fd5b611df5613a49565b611dfd61178e565b611e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3390615822565b60405180910390fd5b6000611e5a84611e4c8733612bf0565b613e1490919063ffffffff16565b9050611e678533836130b9565b611e718585613aa9565b611e79613c74565b5050505050565b6000600c54905090565b60008083519050808302611e9d33611ced565b1015611ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed590615842565b60405180910390fd5b5b80821015611f1257611f04848381518110611ef657fe5b60200260200101518461274f565b508180600101925050611edf565b50505050565b600e60009054906101000a900460ff1615611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615982565b60405180910390fd5b611f756000801b336120b7565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906158a2565b60405180910390fd5b6001600e60006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860405160405180910390a2565b6000801b81565b6000801b811415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890615742565b60405180910390fd5b61206b81336120b7565b6120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a1906159c2565b60405180910390fd5b6120b48133613e5e565b50565b60006120e1826008600086815260200190815260200160002060000161308990919063ffffffff16565b905092915050565b7ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc981565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121a55780601f1061217a576101008083540402835291602001916121a5565b820191906000526020600020905b81548152906001019060200180831161218857829003601f168201915b5050505050905090565b60006121d98260086000868152602001908152602001600020600001613eeb90919063ffffffff16565b905092915050565b6000600e60019054906101000a900460ff16905090565b806122237ff0887ba65ee2024ea881d91b74c2450ef19e1557f03bed3ea9f16b037cbe2dc9336120b7565b80612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906159e2565b60405180910390fd5b600082116122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90615aa2565b60405180910390fd5b6122ae613cd4565b6122b66121e1565b6122f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ec90615942565b60405180910390fd5b6122ff33846138a0565b612307613d34565b505050565b60006123e433846123df6305f5e10086026040518060400160405280600981526020017f45524332303a3439350000000000000000000000000000000000000000000000815250600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6130b9565b6001905092915050565b806123f833611ced565b806305f5e10083021115612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890615922565b60405180910390fd5b8260008111612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c906157e2565b60405180910390fd5b6000806000600d8054905090505b80831015612523573373ffffffffffffffffffffffffffffffffffffffff16600d84815481106124bf57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125165760019150612523565b8280600101935050612493565b81156125ca5786600d848154811061253757fe5b906000526020600020906007020160010160008282540192505081905550612565336305f5e1008902613aa9565b6305f5e1008702600b600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d886040516125c19190615b5d565b60405180910390a25b816125e2576125d833613f05565b6125e1876123ee565b5b50505050505050565b6125f3614320565b600080600d8054905090505b80821015612747578373ffffffffffffffffffffffffffffffffffffffff16600d838154811061262b57fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561273a57600d828154811061268657fe5b90600052602060002090600702016040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815250509250505061274a565b81806001019250506125ff565b50505b919050565b600061275c3384846134c3565b6001905092915050565b6000600454905090565b6000600b54905090565b6060600a805480602002602001604051908101604052809291908181526020016000905b82821015612ab65783829060005260206000209060080201604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128b15780601f10612886576101008083540402835291602001916128b1565b820191906000526020600020905b81548152906001019060200180831161289457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129535780601f1061292857610100808354040283529160200191612953565b820191906000526020600020905b81548152906001019060200180831161293657829003601f168201915b505050505081526020016003820160009054906101000a900460ff16151515158152602001600482015481526020016005820154815260200160068201805480602002602001604051908101604052809291908181526020018280548015612a1057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116129c6575b5050505050815260200160078201805480602002602001604051908101604052809291908181526020018280548015612a9e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612a54575b5050505050815250508152602001906001019061279e565b50505050905090565b612ae97faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c336120b7565b612b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1f90615a22565b60405180910390fd5b6000801b821415612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6590615742565b60405180910390fd5b612b7b6000801b336120b7565b612be2577f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b3828214612be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd8906156e2565b60405180910390fd5b5b612bec8282613e5e565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c846000801b336120b7565b612cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cba906158a2565b60405180910390fd5b80600c8190555050565b6040518060400160405280600b81526020017f756e6973736f752e636f6d00000000000000000000000000000000000000000081525081565b612d136000801b336120b7565b612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d49906158a2565b60405180910390fd5b612d5f6000801b82613813565b612d6c6000801b33613e5e565b50565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b612dbd7f4c4ab3370eb55f38b43a5c45cbf25d8e05d81b67c6e00b33e59d1610de63b382336120b7565b612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390615ae2565b60405180910390fd5b600a6040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200183151581526020016000815260200160008152602001600067ffffffffffffffff81118015612e6057600080fd5b50604051908082528060200260200182016040528015612e8f5781602001602082028036833780820191505090505b508152602001600067ffffffffffffffff81118015612ead57600080fd5b50604051908082528060200260200182016040528015612edc5781602001602082028036833780820191505090505b50815250908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612f6c929190614373565b506040820151816002019080519060200190612f89929190614373565b5060608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a0820151816005015560c0820151816006019080519060200190612fda9291906143f3565b5060e0820151816007019080519060200190612ff79291906143f3565b505050505050565b60008082840190508381101561304a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304190615802565b60405180910390fd5b8091505092915050565b600061307c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614006565b905092915050565b505050565b60006130b1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614076565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312090615902565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613199576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613190906158e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516132779190615b5d565b60405180910390a3505050565b6000600d828154811061329357fe5b90600052602060002090600702016001015490506000600d83815481106132b657fe5b90600052602060002090600702016006015490506000600d84815481106132d957fe5b906000526020600020906007020160050154905060008214156133d557428110156133d45762015180814203106133d357600c5483111561331c57600c5461331e565b825b620151808242038161332c57fe5b0402600d858154811061333b57fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561336b57600c5461336d565b825b620151808242038161337b57fe5b0402600d858154811061338a57fe5b90600052602060002090600702016003016000828254019250508190555042600d85815481106133b657fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b600082146134bc57428210156134bb5762015180824203106134ba57600c5483111561340357600c54613405565b825b620151808342038161341357fe5b0402600d858154811061342257fe5b906000526020600020906007020160020160008282540192505081905550600c5483111561345257600c54613454565b825b620151808342038161346257fe5b0402600d858154811061347157fe5b90600052602060002090600702016003016000828254019250508190555042600d858154811061349d57fe5b9060005260206000209060070201600601819055505050506134c0565b5b5b5050505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a90615b02565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359a90615a82565b60405180910390fd5b600081116135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd906157a2565b60405180910390fd5b6135f1838383614099565b613679816040518060400160405280600981526020017f45524332303a34373000000000000000000000000000000000000000000000008152506000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516137ab9190615b5d565b60405180910390a3505050565b6000838311158290613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f791906156c0565b60405180910390fd5b5060008385039050809150509392505050565b61383b816008600085815260200190815260200160002060000161305490919063ffffffff16565b1561389c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390790615862565b60405180910390fd5b61391c60008383614099565b61393181600354612fff90919063ffffffff16565b600381905550613988816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fff90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a289190615b5d565b60405180910390a35050565b6000613a428260000161418a565b9050919050565b6001600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f0846bb88ff3b4abf3ada7790ae6fc103385a19b2aed99f8e450648b9e1374a3660405160405180910390a2565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b1090615a62565b60405180910390fd5b613b2582600083614099565b613bad816040518060400160405280600981526020017f45524332303a32333000000000000000000000000000000000000000000000008152506000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137b89092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0481600354613e1490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c689190615b5d565b60405180910390a35050565b6000600e60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167fc21bebfeff90d942c9009e0eca370a1ab9ddc28e67af48c2a213e3e9ad65fe0860405160405180910390a2565b6001600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f04fe8ec10fc27a3eb74bc6484c1010613b3354832dd9c927827d71388ee2677a60405160405180910390a2565b6000600e60016101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f340bf1b235fa0bbed4b1b74504c172953a38e3ef4bd71a7042fd2a0057455b7360405160405180910390a2565b60008060009050600080855190505b80831015613e08578473ffffffffffffffffffffffffffffffffffffffff16868481518110613dce57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415613dfb5760019150613e08565b8280600101935050613da3565b81935050505092915050565b6000613e5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137b8565b905092915050565b613e86816008600085815260200190815260200160002060000161419b90919063ffffffff16565b15613ee7573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000613efa83600001836141cb565b60001c905092915050565b600d6040518060e001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020014281526020016000815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050565b60006140128383614076565b61406b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614070565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6140a4838383613084565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561413d576140e1612766565b6140fb826140ed610b3f565b612fff90919063ffffffff16565b111561413c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614133906157c2565b60405180910390fd5b5b6141456117ed565b15614185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161417c90615962565b60405180910390fd5b505050565b600081600001805490509050919050565b60006141c3836000018373ffffffffffffffffffffffffffffffffffffffff1660001b614238565b905092915050565b600081836000018054905011614216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161420d90615722565b60405180910390fd5b82600001828154811061422557fe5b9060005260206000200154905092915050565b60008083600101600084815260200190815260200160002054905060008114614314576000600182039050600060018660000180549050039050600086600001828154811061428357fe5b90600052602060002001549050808760000184815481106142a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806142d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061431a565b60009150505b92915050565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106143b457805160ff19168380011785556143e2565b828001600101855582156143e2579182015b828111156143e15782518255916020019190600101906143c6565b5b5090506143ef919061447d565b5090565b82805482825590600052602060002090810192821561446c579160200282015b8281111561446b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614413565b5b509050614479919061449a565b5090565b5b8082111561449657600081600090555060010161447e565b5090565b5b808211156144d157600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161449b565b5090565b6000813590506144e481615d9e565b92915050565b600082601f8301126144fb57600080fd5b813561450e61450982615bc0565b615b93565b9150818183526020840193506020810190508385602084028201111561453357600080fd5b60005b83811015614563578161454988826144d5565b845260208401935060208301925050600181019050614536565b5050505092915050565b60008135905061457c81615db5565b92915050565b60008135905061459181615dcc565b92915050565b600082601f8301126145a857600080fd5b81356145bb6145b682615be8565b615b93565b915080825260208301602083018583830111156145d757600080fd5b6145e2838284615d4b565b50505092915050565b6000813590506145fa81615de3565b92915050565b60006020828403121561461257600080fd5b6000614620848285016144d5565b91505092915050565b6000806040838503121561463c57600080fd5b600061464a858286016144d5565b925050602061465b858286016144d5565b9150509250929050565b60008060006060848603121561467a57600080fd5b6000614688868287016144d5565b9350506020614699868287016144d5565b92505060406146aa868287016145eb565b9150509250925092565b600080604083850312156146c757600080fd5b60006146d5858286016144d5565b92505060206146e6858286016145eb565b9150509250929050565b6000806040838503121561470357600080fd5b600083013567ffffffffffffffff81111561471d57600080fd5b614729858286016144ea565b925050602061473a858286016145eb565b9150509250929050565b60006020828403121561475657600080fd5b600061476484828501614582565b91505092915050565b6000806040838503121561478057600080fd5b600061478e85828601614582565b925050602061479f858286016144d5565b9150509250929050565b600080604083850312156147bc57600080fd5b60006147ca85828601614582565b92505060206147db858286016145eb565b9150509250929050565b6000806000606084860312156147fa57600080fd5b600084013567ffffffffffffffff81111561481457600080fd5b61482086828701614597565b935050602084013567ffffffffffffffff81111561483d57600080fd5b61484986828701614597565b925050604061485a8682870161456d565b9150509250925092565b60006020828403121561487657600080fd5b6000614884848285016145eb565b91505092915050565b600080604083850312156148a057600080fd5b60006148ae858286016145eb565b92505060206148bf858286016144d5565b9150509250929050565b600080604083850312156148dc57600080fd5b60006148ea858286016145eb565b92505060206148fb8582860161456d565b9150509250929050565b60006149118383614949565b60208301905092915050565b6000614929838361541d565b905092915050565b600061493d83836154e2565b60e08301905092915050565b61495281615cec565b82525050565b61496181615cec565b82525050565b600061497282615c44565b61497c8185615c97565b935061498783615c14565b8060005b838110156149b857815161499f8882614905565b97506149aa83615c70565b92505060018101905061498b565b5085935050505092915050565b60006149d082615c4f565b6149da8185615ca8565b9350836020820285016149ec85615c24565b8060005b85811015614a285784840389528151614a09858261491d565b9450614a1483615c7d565b925060208a019950506001810190506149f0565b50829750879550505050505092915050565b6000614a4582615c5a565b614a4f8185615cb9565b9350614a5a83615c34565b8060005b83811015614a8b578151614a728882614931565b9750614a7d83615c8a565b925050600181019050614a5e565b5085935050505092915050565b614aa181615cfe565b82525050565b614ab081615cfe565b82525050565b614abf81615d0a565b82525050565b6000614ad082615c65565b614ada8185615cca565b9350614aea818560208601615d5a565b614af381615d8d565b840191505092915050565b6000614b0982615c65565b614b138185615cdb565b9350614b23818560208601615d5a565b614b2c81615d8d565b840191505092915050565b6000614b44600783615cdb565b91507f5250433a353330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614b84600683615cdb565b91507f42433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614bc4602283615cdb565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c2a600783615cdb565b91507f5250433a353430000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614c6a600783615cdb565b91507f5250433a353130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614caa600683615cdb565b91507f53433a36353000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614cea600983615cdb565b91507f45524332303a34383000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d2a600583615cdb565b91507f55543a32300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614d6a600683615cdb565b91507f53433a36333000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614daa601b83615cdb565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614dea600683615cdb565b91507f42433a32313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e2a600683615cdb565b91507f55543a34373000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614e6a600983615cdb565b91507f45524332303a31323000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eaa600783615cdb565b91507f56433a31303130000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614eea600783615cdb565b91507f5250433a353030000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f2a600783615cdb565b91507f56433a31303230000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614f6a600983615cdb565b91507f45524332303a34363000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614faa600983615cdb565b91507f45524332303a34353000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614fea600683615cdb565b91507f53433a36343000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061502a600683615cdb565b91507f4d433a31313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061506a600683615cdb565b91507f55543a34303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150aa600683615cdb565b91507f50433a33303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006150ea600783615cdb565b91507f5250433a353230000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061512a600783615cdb565b91507f5250433a353730000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061516a600683615cdb565b91507f4d433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151aa600583615cdb565b91507f42433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006151ea600783615cdb565b91507f5250433a353530000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061522a600683615cdb565b91507f53433a36363000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061526a600983615cdb565b91507f45524332303a32323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152aa600983615cdb565b91507f45524332303a34323000000000000000000000000000000000000000000000006000830152602082019050919050565b60006152ea600583615cdb565b91507f4d433a33300000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061532a600683615cdb565b91507f50433a33313000000000000000000000000000000000000000000000000000006000830152602082019050919050565b600061536a600683615cdb565b91507f56433a35303000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153aa600983615cdb565b91507f45524332303a34313000000000000000000000000000000000000000000000006000830152602082019050919050565b60006153ea600783615cdb565b91507f56433a31303330000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000610100830160008301516154366000860182614949565b506020830151848203602086015261544e8282614ac5565b915050604083015184820360408601526154688282614ac5565b915050606083015161547d6060860182614a98565b50608083015161549060808601826155fe565b5060a08301516154a360a08601826155fe565b5060c083015184820360c08601526154bb8282614967565b91505060e083015184820360e08601526154d58282614967565b9150508091505092915050565b60e0820160008201516154f86000850182614949565b50602082015161550b60208501826155fe565b50604082015161551e60408501826155fe565b50606082015161553160608501826155fe565b50608082015161554460808501826155fe565b5060a082015161555760a08501826155fe565b5060c082015161556a60c08501826155fe565b50505050565b60e0820160008201516155866000850182614949565b50602082015161559960208501826155fe565b5060408201516155ac60408501826155fe565b5060608201516155bf60608501826155fe565b5060808201516155d260808501826155fe565b5060a08201516155e560a08501826155fe565b5060c08201516155f860c08501826155fe565b50505050565b61560781615d34565b82525050565b61561681615d34565b82525050565b61562581615d3e565b82525050565b60006020820190506156406000830184614958565b92915050565b6000602082019050818103600083015261566081846149c5565b905092915050565b600060208201905081810360008301526156828184614a3a565b905092915050565b600060208201905061569f6000830184614aa7565b92915050565b60006020820190506156ba6000830184614ab6565b92915050565b600060208201905081810360008301526156da8184614afe565b905092915050565b600060208201905081810360008301526156fb81614b37565b9050919050565b6000602082019050818103600083015261571b81614b77565b9050919050565b6000602082019050818103600083015261573b81614bb7565b9050919050565b6000602082019050818103600083015261575b81614c1d565b9050919050565b6000602082019050818103600083015261577b81614c5d565b9050919050565b6000602082019050818103600083015261579b81614c9d565b9050919050565b600060208201905081810360008301526157bb81614cdd565b9050919050565b600060208201905081810360008301526157db81614d1d565b9050919050565b600060208201905081810360008301526157fb81614d5d565b9050919050565b6000602082019050818103600083015261581b81614d9d565b9050919050565b6000602082019050818103600083015261583b81614ddd565b9050919050565b6000602082019050818103600083015261585b81614e1d565b9050919050565b6000602082019050818103600083015261587b81614e5d565b9050919050565b6000602082019050818103600083015261589b81614e9d565b9050919050565b600060208201905081810360008301526158bb81614edd565b9050919050565b600060208201905081810360008301526158db81614f1d565b9050919050565b600060208201905081810360008301526158fb81614f5d565b9050919050565b6000602082019050818103600083015261591b81614f9d565b9050919050565b6000602082019050818103600083015261593b81614fdd565b9050919050565b6000602082019050818103600083015261595b8161501d565b9050919050565b6000602082019050818103600083015261597b8161505d565b9050919050565b6000602082019050818103600083015261599b8161509d565b9050919050565b600060208201905081810360008301526159bb816150dd565b9050919050565b600060208201905081810360008301526159db8161511d565b9050919050565b600060208201905081810360008301526159fb8161515d565b9050919050565b60006020820190508181036000830152615a1b8161519d565b9050919050565b60006020820190508181036000830152615a3b816151dd565b9050919050565b60006020820190508181036000830152615a5b8161521d565b9050919050565b60006020820190508181036000830152615a7b8161525d565b9050919050565b60006020820190508181036000830152615a9b8161529d565b9050919050565b60006020820190508181036000830152615abb816152dd565b9050919050565b60006020820190508181036000830152615adb8161531d565b9050919050565b60006020820190508181036000830152615afb8161535d565b9050919050565b60006020820190508181036000830152615b1b8161539d565b9050919050565b60006020820190508181036000830152615b3b816153dd565b9050919050565b600060e082019050615b576000830184615570565b92915050565b6000602082019050615b72600083018461560d565b92915050565b6000602082019050615b8d600083018461561c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615bb657600080fd5b8060405250919050565b600067ffffffffffffffff821115615bd757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115615bff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615cf782615d14565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615d78578082015181840152602081019050615d5d565b83811115615d87576000848401525b50505050565b6000601f19601f8301169050919050565b615da781615cec565b8114615db257600080fd5b50565b615dbe81615cfe565b8114615dc957600080fd5b50565b615dd581615d0a565b8114615de057600080fd5b50565b615dec81615d34565b8114615df757600080fd5b5056fea2646970667358221220ba2fad7ffcf3442a88d6c70a050b97bd7e084781fe1f72ae119f153f4077855664736f6c634300060c0033
Deployed Bytecode Sourcemap
264:205:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;920:77:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2769:105:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1269:94:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4584:630:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2111:296:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3007:114:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2624:115:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2620:687:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3465:385:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1086:77:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1167:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1872:131:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2411:225:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3792:387:12;;;:::i;:::-;;1527:118:6;;;:::i;:::-;;2999:181:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2510:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1371:88:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;388:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;796:67:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1139:72:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1222:428:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3774:200:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1471:119:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2374:91:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3650:328:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2584:91:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1223:321:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1311:116:6;;;:::i;:::-;;599:41:7;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4755:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1542:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;388:57:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1001:81:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2258:143:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1371:88:5;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1896:181:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2640:248:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1158:682:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3060:279:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1594:172:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1367:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2376:97:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4059:96:14;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4196:387:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1770:155:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3498:115:9;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;420:46:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2619:154:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;755:59;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3092:426:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;920:77:2;959:13;987:5;980:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;920:77;:::o;1929:178::-;2024:4;2036:49;2045:10;2057:7;2077:5;2067:6;:16;2036:8;:49::i;:::-;2098:4;2091:11;;1929:178;;;;:::o;2769:105:9:-;2822:20;2857:12;2850:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2769:105;:::o;1269:94:2:-;1324:7;1346:12;;1339:19;;1269:94;:::o;4584:630:12:-;1233:31:7;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4678:9:12::1;4697:18:::0;4729:11:::1;4743:12;:19;;;;4729:33;;4768:133;4779:3;4775:1;:7;4768:133;;;4821:7;4796:32;;:12;4809:1;4796:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:32;;;4792:92;;;4856:4;4840:20;;4870:5;;4792:92;4891:3;;;;;;;4768:133;;;4922:13;4907:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4968:13;4964:246;;;4991:17;5006:1;4991:14;:17::i;:::-;5044:12;5057:1;5044:15;;;;;;;;;;;;;;;;;;:31;;;5033:7;:42;;5016:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;5145:7;5110:12;5123:1;5110:15;;;;;;;;;;;;;;;;;;:31;;;:42;;;;;;;;;;;5196:7;5160:12;5173:1;5160:15;;;;;;;;;;;;;;;;;;:32;;;:43;;;;;;;;;;;4964:246;1293:1:7;;;4584:630:12::0;;:::o;2111:296:2:-;2233:4;2245:36;2255:6;2263:9;2274:6;2245:9;:36::i;:::-;2287:98;2296:6;2304:10;2316:68;2363:5;2353:6;:16;2316:68;;;;;;;;;;;;;;;;;:11;:19;2328:6;2316:19;;;;;;;;;;;;;;;:31;2336:10;2316:31;;;;;;;;;;;;;;;;:35;;:68;;;;;:::i;:::-;2287:8;:98::i;:::-;2398:4;2391:11;;2111:296;;;;;:::o;3007:114:7:-;1233:31;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3087:29:::1;794:20;3112:3;3087:10;:29::i;:::-;3007:114:::0;:::o;2624:115:14:-;1233:31:7;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2727:7:14::1;2709:15;:25;;;;2624:115:::0;:::o;2620:687:12:-;2698:7;1362:1:9;1352:7;:11;1337:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;2731:7:12::1;2057:30:9;;:::i;:::-;2090:29;2108:10;2090:17;:29::i;:::-;2057:62;;2152:11;:17;;;2141:7;:28;;2126:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2749:9:12::2;2768:18:::0;2800:11:::2;2814:12;:19;;;;2800:33;;2839:136;2850:3;2846:1;:7;2839:136;;;2892:10;2867:35;;:12;2880:1;2867:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;2863:95;;;2930:4;2914:20;;2944:5;;2863:95;2965:3;;;;;;;2839:136;;;2996:13;2981:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3042:13;3038:265;;;3080:12;3093:1;3080:15;;;;;;;;;;;;;;;;;;:21;;;3069:7;:32;3065:232;;3138:7;3113:12;3126:1;3113:15;;;;;;;;;;;;;;;;;;:21;;;:32;;;;;;;;;;;3155:38;3161:10;3185:5;3174:7;:17;3155:5;:38::i;:::-;3237:5;3226:7;:17;3203:18;;:41;;;;;;;;;;;3268:10;3259:29;;;3280:7;3259:29;;;;;;:::i;:::-;;;;;;;;3065:232;3038:265;2197:1:9;;;1391::::1;;2620:687:12::0;;:::o;3465:385:7:-;3560:33;794:20;3582:10;3560:7;:33::i;:::-;3545:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;636:4;3647:10;;3638:5;:19;;3623:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3692:31;636:4;3700:10;;3712;3692:7;:31::i;:::-;3687:130;;3759:24;3750:5;:33;3733:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;3687:130;3823:22;3834:5;3841:3;3823:10;:22::i;:::-;3465:385;;:::o;1086:77:2:-;1129:5;1149:9;;;;;;;;;;;1142:16;;1086:77;:::o;1167:98::-;1224:7;1246:14;;1239:21;;1167:98;:::o;1872:131:7:-;1946:7;1968:30;:6;:13;1975:5;1968:13;;;;;;;;;;;:21;;:28;:30::i;:::-;1961:37;;1872:131;;;:::o;2411:225:2:-;2511:4;2523:91;2532:10;2544:7;2553:60;2605:5;2591:10;:20;2553:11;:23;2565:10;2553:23;;;;;;;;;;;;;;;:32;2577:7;2553:32;;;;;;;;;;;;;;;;:36;;:60;;;;:::i;:::-;2523:8;:91::i;:::-;2627:4;2620:11;;2411:225;;;;:::o;3792:387:12:-;3835:9;3854:18;3886:11;3900:12;:19;;;;3886:33;;3925:136;3936:3;3932:1;:7;3925:136;;;3978:10;3953:35;;:12;3966:1;3953:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;3949:95;;;4016:4;4000:20;;4030:5;;3949:95;4051:3;;;;;;;3925:136;;;4082:13;4067:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4128:13;4124:51;;;4151:17;4166:1;4151:14;:17::i;:::-;4124:51;3792:387;;;:::o;1527:118:6:-;901:7;;;;;;;;;;;886:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1233:31:7::1;636:4;1241:10:::0;::::1;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1604:5:6::2;1594:7;;:15;;;;;;;;;;;;;;;;;;1629:10;1620:20;;;;;;;;;;;;1527:118::o:0;2999:181:13:-;3070:7;3083:32;426:19:1;3104:10:13;3083:7;:32::i;:::-;978:8:1;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3126:26:13::1;3132:10;3144:7;3126:5;:26::i;:::-;3158:17;:15;:17::i;:::-;2999:181:::0;;;:::o;2510:193::-;2600:7;2613:32;426:19:5;2634:10:13;2613:7;:32::i;:::-;978:8:5;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2656:19:13::1;2662:3;2667:7;2656:5;:19::i;:::-;2681:17;:15;:17::i;:::-;2510:193:::0;;;;:::o;1371:88:1:-;1420:4;1439:15;;;;;;;;;;;1432:22;;1371:88;:::o;388:57::-;426:19;388:57;:::o;796:67:14:-;839:24;796:67;:::o;1139:72:6:-;1180:4;1199:7;;;;;;;;;;;1192:14;;1139:72;:::o;1222:428:11:-;1327:3;1336:21;1346:10;1336:9;:21::i;:::-;1576:5:14;1557:15;;:25;1544:8;:39;;1529:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1613:17;1633:63;1654:9;1664:3;1654:14;;;;;;;;;;;;;;;;;;:29;;1633:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1685:10;1633:20;:63::i;:::-;1613:83;;1702:17;1722:63;1743:9;1753:3;1743:14;;;;;;;;;;;;;;;;;;:29;;1722:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1774:10;1722:20;:63::i;:::-;1702:83;;1808:12;1807:13;:30;;;;;1825:12;1824:13;1807:30;1792:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1381:3:11::1;2131:9:14;2141:3;2131:14;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;2116:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1399:15:11::2;1395:122;;;1455:1;1424:9;1434:3;1424:14;;;;;;;;;;;;;;;;;;:27;;;:32;;;;;;;;;;;1464:9;1474:3;1464:14;;;;;;;;;;;;;;;;;;:29;;1499:10;1464:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1395:122;1528:15;1523:123;;1584:1;1553:9;1563:3;1553:14;;;;;;;;;;;;;;;;;;:27;;;:32;;;;;;;;;;;1593:9;1603:3;1593:14;;;;;;;;;;;;;;;;;;:29;;1628:10;1593:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1523:123;1866:1:14::1;1222:428:11::0;;;;;;:::o;3774:200:14:-;1110:37;839:24;1136:10;1110:7;:37::i;:::-;1095:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3856:9:::1;3866:3;3856:14;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;:113;;3965:4;3934:9;3944:3;3934:14;;;;;;;;;;;;;;;;;;:28;;;:35;;;;;;;;;;;;;;;;;3856:113;;;3922:5;3891:9;3901:3;3891:14;;;;;;;;;;;;;;;;;;:28;;;:36;;;;;;;;;;;;;;;;;3856:113;;3774:200:::0;:::o;1471:119:2:-;1545:7;1567:9;:18;1577:7;1567:18;;;;;;;;;;;;;;;;1560:25;;1471:119;;;:::o;2374:91:14:-;2423:7;2445:15;;2438:22;;2374:91;:::o;3650:328:13:-;3744:7;3757:32;426:19:1;3778:10:13;3757:7;:32::i;:::-;978:8:1;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3800:26:13::1;3829:41;3862:7;3829:28;3839:5;3846:10;3829:9;:28::i;:::-;:32;;:41;;;;:::i;:::-;3800:70;;3876:47;3885:5;3892:10;3904:18;3876:8;:47::i;:::-;3929:21;3935:5;3942:7;3929:5;:21::i;:::-;3956:17;:15;:17::i;:::-;1151:1:1;3650:328:13::0;;;;:::o;2584:91:9:-;2633:7;2655:15;;2648:22;;2584:91;:::o;1223:321:13:-;1325:9;1344:11;1358:10;:17;1344:31;;1433:3;1423:7;:13;1397:21;1407:10;1397:9;:21::i;:::-;:40;;1382:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;1466:74;1477:3;1473:1;:7;1466:74;;;1490:32;1499:10;1510:1;1499:13;;;;;;;;;;;;;;1514:7;1490:8;:32::i;:::-;;1530:3;;;;;;;1466:74;;;1223:321;;;;:::o;1311:116:6:-;705:7;;;;;;;;;;;704:8;689:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1233:31:7::1;636:4;1241:10:::0;::::1;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1389:4:6::2;1379:7;;:14;;;;;;;;;;;;;;;;;;1411:10;1404:18;;;;;;;;;;;;1311:116::o:0;599:41:7:-;636:4;599:41;;;:::o;4755:236::-;636:4;4845:10;;4836:5;:19;;4821:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4900:26;4908:5;4915:10;4900:7;:26::i;:::-;4885:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4956:30;4968:5;4975:10;4956:11;:30::i;:::-;4755:236;:::o;1542:147::-;1625:4;1644:40;1675:8;1644:6;:13;1651:5;1644:13;;;;;;;;;;;:21;;:30;;:40;;;;:::i;:::-;1637:47;;1542:147;;;;:::o;388:57:5:-;426:19;388:57;:::o;1001:81:2:-;1042:13;1070:7;1063:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1001:81;:::o;2258:143:7:-;2345:7;2367:29;2392:3;2367:6;:13;2374:5;2367:13;;;;;;;;;;;:21;;:24;;:29;;;;:::i;:::-;2360:36;;2258:143;;;;:::o;1371:88:5:-;1420:4;1439:15;;;;;;;;;;;1432:22;;1371:88;:::o;1896:181:13:-;1967:7;1980:32;426:19:5;2001:10:13;1980:7;:32::i;:::-;978:8:5;963:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;1040:1;1030:7;:11;1015:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1069:16;:14;:16::i;:::-;1107;:14;:16::i;:::-;1092:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2023:26:13::1;2029:10;2041:7;2023:5;:26::i;:::-;2055:17;:15;:17::i;:::-;1896:181:::0;;;:::o;2640:248:2:-;2745:4;2757:109;2766:10;2778:7;2787:78;2844:5;2825:15;:25;2787:78;;;;;;;;;;;;;;;;;:11;:23;2799:10;2787:23;;;;;;;;;;;;;;;:32;2811:7;2787:32;;;;;;;;;;;;;;;;:36;;:78;;;;;:::i;:::-;2757:8;:109::i;:::-;2879:4;2872:11;;2640:248;;;;:::o;1158:682:12:-;1232:7;1245:21;1255:10;1245:9;:21::i;:::-;1749:8:9;1738:5;1727:7;:17;1726:31;;1711:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1292:7:12::1;1362:1:9;1352:7;:11;1337:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;1310:9:12::2;1329:18:::0;1361:11:::2;1375:12;:19;;;;1361:33;;1400:136;1411:3;1407:1;:7;1400:136;;;1453:10;1428:35;;:12;1441:1;1428:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:35;;;1424:95;;;1491:4;1475:20;;1505:5;;1424:95;1526:3;;;;;;;1400:136;;;1546:13;1542:201;;;1594:7;1569:12;1582:1;1569:15;;;;;;;;;;;;;;;;;;:21;;;:32;;;;;;;;;;;1609:38;1615:10;1639:5;1628:7;:17;1609:5;:38::i;:::-;1689:5;1678:7;:17;1655:18;;:41;;;;;;;;;;;1716:10;1709:27;;;1728:7;1709:27;;;;;;:::i;:::-;;;;;;;;1542:201;1754:13;1749:87;;1777:30;1796:10;1777:18;:30::i;:::-;1815:14;1821:7;1815:5;:14::i;:::-;1749:87;1391:1:9;;;1785::::1;1158:682:12::0;;;:::o;3060:279:9:-;3132:18;;:::i;:::-;3158:9;3177:11;3191:12;:19;;;;3177:33;;3216:119;3227:3;3223:1;:7;3216:119;;;3269:6;3244:31;;:12;3257:1;3244:15;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:31;;;3240:78;;;3294:12;3307:1;3294:15;;;;;;;;;;;;;;;;;;3287:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3240:78;3325:3;;;;;;;3216:119;;;3060:279;;;;;;:::o;1594:172:2:-;1692:4;1704:40;1714:10;1726:9;1737:6;1704:9;:40::i;:::-;1757:4;1750:11;;1594:172;;;;:::o;1367:100::-;1425:7;1447:15;;1440:22;;1367:100;:::o;2376:97:9:-;2428:7;2450:18;;2443:25;;2376:97;:::o;4059:96:14:-;4109:17;4141:9;4134:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4059:96;:::o;4196:387:7:-;4292:33;794:20;4314:10;4292:7;:33::i;:::-;4277:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;636:4;4379:10;;4370:5;:19;;4355:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4424:31;636:4;4432:10;;4444;4424:7;:31::i;:::-;4419:130;;4491:24;4482:5;:33;4465:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4419:130;4555:23;4567:5;4574:3;4555:11;:23::i;:::-;4196:387;;:::o;1770:155:2:-;1871:7;1893:11;:18;1905:5;1893:18;;;;;;;;;;;;;;;:27;1912:7;1893:27;;;;;;;;;;;;;;;;1886:34;;1770:155;;;;:::o;3498:115:9:-;1233:31:7;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3601:7:9::1;3583:15;:25;;;;3498:115:::0;:::o;420:46:10:-;;;;;;;;;;;;;;;;;;;:::o;2619:154:7:-;1233:31;636:4;1241:10;;1253;1233:7;:31::i;:::-;1218:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2700:27:::1;636:4;2711:10:::0;::::1;2723:3;2700:10;:27::i;:::-;2733:35;636:4;2745:10:::0;::::1;2757;2733:11;:35::i;:::-;2619:154:::0;:::o;755:59::-;794:20;755:59;:::o;3092:426:14:-;1110:37;839:24;1136:10;1110:7;:37::i;:::-;1095:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;3224:9:::1;3246:261;;;;;;;;3274:10;3246:261;;;;;;3300:5;3246:261;;;;3328:4;3246:261;;;;3357:7;3246:261;;;;;;3388:1;3246:261;;;;3413:1;3246:261;;;;3454:1;3440:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3246:261;;;;3496:1;3482:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3246:261;;::::0;3224:289:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;3092:426:::0;;;:::o;189:174:8:-;259:7;274:9;290:1;286;:5;274:17;;310:1;305;:6;;297:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;357:1;350:8;;;189:174;;;;:::o;1601:147:3:-;1683:4;1702:41;1707:3;:10;;1735:5;1727:14;;1719:23;;1702:4;:41::i;:::-;1695:48;;1601:147;;;;:::o;4580:107:2:-;;;;:::o;1909:162:3:-;2001:4;2020:46;2030:3;:10;;2058:5;2050:14;;2042:23;;2020:9;:46::i;:::-;2013:53;;1909:162;;;;:::o;4160:322:2:-;4297:1;4280:19;;:5;:19;;;;4265:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;4364:1;4345:21;;:7;:21;;;;4330:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;4428:6;4398:11;:18;4410:5;4398:18;;;;;;;;;;;;;;;:27;4417:7;4398:27;;;;;;;;;;;;;;;:36;;;;4461:7;4445:32;;4454:5;4445:32;;;4470:6;4445:32;;;;;;:::i;:::-;;;;;;;;4160:322;;;:::o;4885:1390:9:-;4953:13;4969:12;4982:3;4969:17;;;;;;;;;;;;;;;;;;:23;;;4953:39;;4998:28;5029:12;5042:3;5029:17;;;;;;;;;;;;;;;;;;:40;;;4998:71;;5075:17;5095:12;5108:3;5095:17;;;;;;;;;;;;;;;;;;:27;;;5075:47;;5157:1;5133:20;:25;5129:546;;;5184:3;5172:9;:15;5168:501;;;5224:6;5210:9;5204:3;:15;5203:27;5199:462;;5336:15;;5327:5;:24;;:62;;5374:15;;5327:62;;;5366:5;5327:62;5303:6;5290:9;5284:3;:15;5283:26;;;;;;5282:119;5244:12;5257:3;5244:17;;;;;;;;;;;;;;;;;;:33;;;:158;;;;;;;;;;;5508:15;;5499:5;:24;;:62;;5546:15;;5499:62;;;5538:5;5499:62;5475:6;5462:9;5456:3;:15;5455:26;;;;;;5454:119;5414:12;5427:3;5414:17;;;;;;;;;;;;;;;;;;:35;;;:160;;;;;;;;;;;5629:3;5586:12;5599:3;5586:17;;;;;;;;;;;;;;;;;;:40;;:46;;;;5644:7;;;;;5199:462;5168:501;5129:546;5709:1;5685:20;:25;5681:590;;5747:3;5724:20;:26;5720:545;;;5798:6;5773:20;5767:3;:26;5766:38;5762:495;;5921:15;;5912:5;:24;;:62;;5959:15;;5912:62;;;5951:5;5912:62;5888:6;5864:20;5858:3;:26;5857:37;;;;;;5856:130;5818:12;5831:3;5818:17;;;;;;;;;;;;;;;;;;:33;;;:169;;;;;;;;;;;6104:15;;6095:5;:24;;:62;;6142:15;;6095:62;;;6134:5;6095:62;6071:6;6047:20;6041:3;:26;6040:37;;;;;;6039:130;5999:12;6012:3;5999:17;;;;;;;;;;;;;;;;;;:35;;;:171;;;;;;;;;;;6225:3;6182:12;6195:3;6182:17;;;;;;;;;;;;;;;;;;:40;;:46;;;;6240:7;;;;;5762:495;5720:545;5681:590;4885:1390;;;;;:::o;2892:531:2:-;3034:1;3016:20;;:6;:20;;;;3001:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;3104:1;3083:23;;:9;:23;;;;3068:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3162:1;3153:6;:10;3138:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3195:47;3216:6;3224:9;3235:6;3195:20;:47::i;:::-;3269:42;3291:6;3269:42;;;;;;;;;;;;;;;;;:9;:17;3279:6;3269:17;;;;;;;;;;;;;;;;:21;;:42;;;;;:::i;:::-;3249:9;:17;3259:6;3249:17;;;;;;;;;;;;;;;:62;;;;3340:32;3365:6;3340:9;:20;3350:9;3340:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;3317:9;:20;3327:9;3317:20;;;;;;;;;;;;;;;:55;;;;3400:9;3383:35;;3392:6;3383:35;;;3411:6;3383:35;;;;;;:::i;:::-;;;;;;;;2892:531;;;:::o;511:189:8:-;613:7;641:1;636;:6;;644:12;628:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;663:9;679:1;675;:5;663:17;;694:1;687:8;;;511:189;;;;;:::o;5109:169:7:-;5187:30;5213:3;5187:6;:13;5194:5;5187:13;;;;;;;;;;;:21;;:25;;:30;;;;:::i;:::-;5183:91;;;5256:10;5232:35;;5251:3;5232:35;;5244:5;5232:35;;;;;;;;;;5183:91;5109:169;;:::o;3427:356:2:-;3544:1;3525:21;;:7;:21;;;;3510:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3578:49;3607:1;3611:7;3620:6;3578:20;:49::i;:::-;3649:24;3666:6;3649:12;;:16;;:24;;;;:::i;:::-;3634:12;:39;;;;3700:30;3723:6;3700:9;:18;3710:7;3700:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;3679:9;:18;3689:7;3679:18;;;;;;;;;;;;;;;:51;;;;3762:7;3741:37;;3758:1;3741:37;;;3771:6;3741:37;;;;;;:::i;:::-;;;;;;;;3427:356;;:::o;2075:117:3:-;2146:7;2168:19;2176:3;:10;;2168:7;:19::i;:::-;2161:26;;2075:117;;;:::o;1567:115:1:-;1636:4;1618:15;;:22;;;;;;;;;;;;;;;;;;1666:10;1651:26;;;;;;;;;;;;1567:115::o;3787:369:2:-;3904:1;3885:21;;:7;:21;;;;3870:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3938:49;3959:7;3976:1;3980:6;3938:20;:49::i;:::-;4015:43;4038:6;4015:43;;;;;;;;;;;;;;;;;:9;:18;4025:7;4015:18;;;;;;;;;;;;;;;;:22;;:43;;;;;:::i;:::-;3994:9;:18;4004:7;3994:18;;;;;;;;;;;;;;;:64;;;;4079:24;4096:6;4079:12;;:16;;:24;;;;:::i;:::-;4064:12;:39;;;;4140:1;4114:37;;4123:7;4114:37;;;4144:6;4114:37;;;;;;:::i;:::-;;;;;;;;3787:369;;:::o;1792:118:1:-;1862:5;1844:15;;:23;;;;;;;;;;;;;;;;;;1894:10;1878:27;;;;;;;;;;;;1792:118::o;1567:115:5:-;1636:4;1618:15;;:22;;;;;;;;;;;;;;;;;;1666:10;1651:26;;;;;;;;;;;;1567:115::o;1792:118::-;1862:5;1844:15;;:23;;;;;;;;;;;;;;;;;;1894:10;1878:27;;;;;;;;;;;;1792:118::o;4433:331:14:-;4539:4;4551:9;4563:1;4551:13;;4570:10;4594:11;4608:7;:14;4594:28;;4628:113;4639:3;4635:1;:7;4628:113;;;4670:6;4656:20;;:7;4664:1;4656:10;;;;;;;;;;;;;;:20;;;4652:72;;;4696:4;4688:12;;4710:5;;4652:72;4731:3;;;;;;;4628:113;;;4754:5;4747:12;;;;;4433:331;;;;:::o;367:140:8:-;437:7;459:43;463:1;466;459:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;452:50;;367:140;;;;:::o;5282:173:7:-;5361:33;5390:3;5361:6;:13;5368:5;5361:13;;;;;;;;;;;:21;;:28;;:33;;;;:::i;:::-;5357:94;;;5433:10;5409:35;;5428:3;5409:35;;5421:5;5409:35;;;;;;;;;;5357:94;5282:173;;:::o;2196:153:3:-;2282:7;2320:22;2324:3;:10;;2336:5;2320:3;:22::i;:::-;2312:31;;2297:47;;2196:153;;;;:::o;3768:291:9:-;3843:12;3861:192;;;;;;;;3888:6;3861:192;;;;;;3909:1;3861:192;;;;3957:1;3861:192;;;;3985:1;3861:192;;;;4012:1;3861:192;;;;3929:3;3861:192;;;;4045:1;3861:192;;;3843:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3768:291;:::o;286:257:3:-;361:4;378:21;388:3;393:5;378:9;:21::i;:::-;373:166;;409:3;:11;;426:5;409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;462:3;:11;;:18;;;;440:3;:12;;:19;453:5;440:19;;;;;;;;;;;:40;;;;495:4;488:11;;;;373:166;527:5;520:12;;286:257;;;;;:::o;1101:133::-;1186:4;1228:1;1205:3;:12;;:19;1218:5;1205:19;;;;;;;;;;;;:24;;1198:31;;1101:133;;;;:::o;4249:354:13:-;4369:44;4396:4;4402:2;4406:6;4369:26;:44::i;:::-;4440:1;4424:18;;:4;:18;;;4420:126;;;4498:16;:14;:16::i;:::-;4469:25;4487:6;4469:13;:11;:13::i;:::-;:17;;:25;;;;:::i;:::-;:45;;4452:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;4420:126;4568:8;:6;:8::i;:::-;4567:9;4552:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4249:354;;;:::o;1238:109:3:-;1302:7;1324:3;:11;;:18;;;;1317:25;;1238:109;;;:::o;1752:153::-;1837:4;1856:44;1864:3;:10;;1892:5;1884:14;;1876:23;;1856:7;:44::i;:::-;1849:51;;1752:153;;;;:::o;1351:203::-;1430:7;1474:5;1453:3;:11;;:18;;;;:26;1445:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1531:3;:11;;1543:5;1531:18;;;;;;;;;;;;;;;;1524:25;;1351:203;;;;:::o;547:550::-;625:4;637:18;658:3;:12;;:19;671:5;658:19;;;;;;;;;;;;637:40;;702:1;688:10;:15;684:409;;713:21;750:1;737:10;:14;713:38;;759:17;800:1;779:3;:11;;:18;;;;:22;759:42;;809:17;829:3;:11;;841:9;829:22;;;;;;;;;;;;;;;;809:42;;888:9;859:3;:11;;871:13;859:26;;;;;;;;;;;;;;;:38;;;;947:1;931:13;:17;905:3;:12;;:23;918:9;905:23;;;;;;;;;;;:43;;;;983:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;1015:3;:12;;:19;1028:5;1015:19;;;;;;;;;;;1008:26;;;1049:4;1042:11;;;;;;;;684:409;1081:5;1074:12;;;547:550;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;160:707::-;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;:::-;354:80;:::i;:::-;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;:::i;:::-;755:3;748:50;821:4;816:3;812:14;805:21;;849:4;844:3;840:14;833:21;;712:149;702:1;699;695:9;690:14;;655:206;;;659:14;237:630;;;;;;;:::o;875:124::-;;952:6;939:20;930:29;;964:30;988:5;964:30;:::i;:::-;924:75;;;;:::o;1006:130::-;;1086:6;1073:20;1064:29;;1098:33;1125:5;1098:33;:::i;:::-;1058:78;;;;:::o;1144:442::-;;1246:3;1239:4;1231:6;1227:17;1223:27;1213:2;;1264:1;1261;1254:12;1213:2;1301:6;1288:20;1323:65;1338:49;1380:6;1338:49;:::i;:::-;1323:65;:::i;:::-;1314:74;;1408:6;1401:5;1394:21;1444:4;1436:6;1432:17;1477:4;1470:5;1466:16;1512:3;1503:6;1498:3;1494:16;1491:25;1488:2;;;1529:1;1526;1519:12;1488:2;1539:41;1573:6;1568:3;1563;1539:41;:::i;:::-;1206:380;;;;;;;:::o;1594:130::-;;1674:6;1661:20;1652:29;;1686:33;1713:5;1686:33;:::i;:::-;1646:78;;;;:::o;1731:241::-;;1835:2;1823:9;1814:7;1810:23;1806:32;1803:2;;;1851:1;1848;1841:12;1803:2;1886:1;1903:53;1948:7;1939:6;1928:9;1924:22;1903:53;:::i;:::-;1893:63;;1865:97;1797:175;;;;:::o;1979:366::-;;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2151:1;2168:53;2213:7;2204:6;2193:9;2189:22;2168:53;:::i;:::-;2158:63;;2130:97;2258:2;2276:53;2321:7;2312:6;2301:9;2297:22;2276:53;:::i;:::-;2266:63;;2237:98;2062:283;;;;;:::o;2352:491::-;;;;2490:2;2478:9;2469:7;2465:23;2461:32;2458:2;;;2506:1;2503;2496:12;2458:2;2541:1;2558:53;2603:7;2594:6;2583:9;2579:22;2558:53;:::i;:::-;2548:63;;2520:97;2648:2;2666:53;2711:7;2702:6;2691:9;2687:22;2666:53;:::i;:::-;2656:63;;2627:98;2756:2;2774:53;2819:7;2810:6;2799:9;2795:22;2774:53;:::i;:::-;2764:63;;2735:98;2452:391;;;;;:::o;2850:366::-;;;2971:2;2959:9;2950:7;2946:23;2942:32;2939:2;;;2987:1;2984;2977:12;2939:2;3022:1;3039:53;3084:7;3075:6;3064:9;3060:22;3039:53;:::i;:::-;3029:63;;3001:97;3129:2;3147:53;3192:7;3183:6;3172:9;3168:22;3147:53;:::i;:::-;3137:63;;3108:98;2933:283;;;;;:::o;3223:502::-;;;3369:2;3357:9;3348:7;3344:23;3340:32;3337:2;;;3385:1;3382;3375:12;3337:2;3448:1;3437:9;3433:17;3420:31;3471:18;3463:6;3460:30;3457:2;;;3503:1;3500;3493:12;3457:2;3523:78;3593:7;3584:6;3573:9;3569:22;3523:78;:::i;:::-;3513:88;;3399:208;3638:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3617:98;3331:394;;;;;:::o;3732:241::-;;3836:2;3824:9;3815:7;3811:23;3807:32;3804:2;;;3852:1;3849;3842:12;3804:2;3887:1;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3866:97;3798:175;;;;:::o;3980:366::-;;;4101:2;4089:9;4080:7;4076:23;4072:32;4069:2;;;4117:1;4114;4107:12;4069:2;4152:1;4169:53;4214:7;4205:6;4194:9;4190:22;4169:53;:::i;:::-;4159:63;;4131:97;4259:2;4277:53;4322:7;4313:6;4302:9;4298:22;4277:53;:::i;:::-;4267:63;;4238:98;4063:283;;;;;:::o;4353:366::-;;;4474:2;4462:9;4453:7;4449:23;4445:32;4442:2;;;4490:1;4487;4480:12;4442:2;4525:1;4542:53;4587:7;4578:6;4567:9;4563:22;4542:53;:::i;:::-;4532:63;;4504:97;4632:2;4650:53;4695:7;4686:6;4675:9;4671:22;4650:53;:::i;:::-;4640:63;;4611:98;4436:283;;;;;:::o;4726:697::-;;;;4881:2;4869:9;4860:7;4856:23;4852:32;4849:2;;;4897:1;4894;4887:12;4849:2;4960:1;4949:9;4945:17;4932:31;4983:18;4975:6;4972:30;4969:2;;;5015:1;5012;5005:12;4969:2;5035:63;5090:7;5081:6;5070:9;5066:22;5035:63;:::i;:::-;5025:73;;4911:193;5163:2;5152:9;5148:18;5135:32;5187:18;5179:6;5176:30;5173:2;;;5219:1;5216;5209:12;5173:2;5239:63;5294:7;5285:6;5274:9;5270:22;5239:63;:::i;:::-;5229:73;;5114:194;5339:2;5357:50;5399:7;5390:6;5379:9;5375:22;5357:50;:::i;:::-;5347:60;;5318:95;4843:580;;;;;:::o;5430:241::-;;5534:2;5522:9;5513:7;5509:23;5505:32;5502:2;;;5550:1;5547;5540:12;5502:2;5585:1;5602:53;5647:7;5638:6;5627:9;5623:22;5602:53;:::i;:::-;5592:63;;5564:97;5496:175;;;;:::o;5678:366::-;;;5799:2;5787:9;5778:7;5774:23;5770:32;5767:2;;;5815:1;5812;5805:12;5767:2;5850:1;5867:53;5912:7;5903:6;5892:9;5888:22;5867:53;:::i;:::-;5857:63;;5829:97;5957:2;5975:53;6020:7;6011:6;6000:9;5996:22;5975:53;:::i;:::-;5965:63;;5936:98;5761:283;;;;;:::o;6051:360::-;;;6169:2;6157:9;6148:7;6144:23;6140:32;6137:2;;;6185:1;6182;6175:12;6137:2;6220:1;6237:53;6282:7;6273:6;6262:9;6258:22;6237:53;:::i;:::-;6227:63;;6199:97;6327:2;6345:50;6387:7;6378:6;6367:9;6363:22;6345:50;:::i;:::-;6335:60;;6306:95;6131:280;;;;;:::o;6419:173::-;;6506:46;6548:3;6540:6;6506:46;:::i;:::-;6581:4;6576:3;6572:14;6558:28;;6499:93;;;;:::o;6601:257::-;;6754:98;6848:3;6840:6;6754:98;:::i;:::-;6740:112;;6733:125;;;;:::o;6867:289::-;;7012:104;7112:3;7104:6;7012:104;:::i;:::-;7145:4;7140:3;7136:14;7122:28;;7005:151;;;;:::o;7164:103::-;7237:24;7255:5;7237:24;:::i;:::-;7232:3;7225:37;7219:48;;:::o;7274:113::-;7357:24;7375:5;7357:24;:::i;:::-;7352:3;7345:37;7339:48;;:::o;7425:670::-;;7560:54;7608:5;7560:54;:::i;:::-;7627:76;7696:6;7691:3;7627:76;:::i;:::-;7620:83;;7724:56;7774:5;7724:56;:::i;:::-;7800:7;7828:1;7813:260;7838:6;7835:1;7832:13;7813:260;;;7905:6;7899:13;7926:63;7985:3;7970:13;7926:63;:::i;:::-;7919:70;;8006:60;8059:6;8006:60;:::i;:::-;7996:70;;7870:203;7860:1;7857;7853:9;7848:14;;7813:260;;;7817:14;8086:3;8079:10;;7539:556;;;;;;;:::o;8168:1056::-;;8365:80;8439:5;8365:80;:::i;:::-;8458:112;8563:6;8558:3;8458:112;:::i;:::-;8451:119;;8593:3;8635:4;8627:6;8623:17;8618:3;8614:27;8662:82;8738:5;8662:82;:::i;:::-;8764:7;8792:1;8777:408;8802:6;8799:1;8796:13;8777:408;;;8864:9;8858:4;8854:20;8849:3;8842:33;8909:6;8903:13;8931:116;9042:4;9027:13;8931:116;:::i;:::-;8923:124;;9064:86;9143:6;9064:86;:::i;:::-;9054:96;;9173:4;9168:3;9164:14;9157:21;;8834:351;8824:1;8821;8817:9;8812:14;;8777:408;;;8781:14;9198:4;9191:11;;9215:3;9208:10;;8344:880;;;;;;;;;:::o;9305:922::-;;9508:83;9585:5;9508:83;:::i;:::-;9604:115;9712:6;9707:3;9604:115;:::i;:::-;9597:122;;9740:85;9819:5;9740:85;:::i;:::-;9845:7;9873:1;9858:347;9883:6;9880:1;9877:13;9858:347;;;9950:6;9944:13;9971:121;10088:3;10073:13;9971:121;:::i;:::-;9964:128;;10109:89;10191:6;10109:89;:::i;:::-;10099:99;;9915:290;9905:1;9902;9898:9;9893:14;;9858:347;;;9862:14;10218:3;10211:10;;9487:740;;;;;;;:::o;10235:94::-;10302:21;10317:5;10302:21;:::i;:::-;10297:3;10290:34;10284:45;;:::o;10336:104::-;10413:21;10428:5;10413:21;:::i;:::-;10408:3;10401:34;10395:45;;:::o;10447:113::-;10530:24;10548:5;10530:24;:::i;:::-;10525:3;10518:37;10512:48;;:::o;10567:327::-;;10669:39;10702:5;10669:39;:::i;:::-;10720:61;10774:6;10769:3;10720:61;:::i;:::-;10713:68;;10786:52;10831:6;10826:3;10819:4;10812:5;10808:16;10786:52;:::i;:::-;10859:29;10881:6;10859:29;:::i;:::-;10854:3;10850:39;10843:46;;10649:245;;;;;:::o;10901:347::-;;11013:39;11046:5;11013:39;:::i;:::-;11064:71;11128:6;11123:3;11064:71;:::i;:::-;11057:78;;11140:52;11185:6;11180:3;11173:4;11166:5;11162:16;11140:52;:::i;:::-;11213:29;11235:6;11213:29;:::i;:::-;11208:3;11204:39;11197:46;;10993:255;;;;;:::o;11256:306::-;;11416:66;11480:1;11475:3;11416:66;:::i;:::-;11409:73;;11515:9;11511:1;11506:3;11502:11;11495:30;11553:2;11548:3;11544:12;11537:19;;11402:160;;;:::o;11571:305::-;;11731:66;11795:1;11790:3;11731:66;:::i;:::-;11724:73;;11830:8;11826:1;11821:3;11817:11;11810:29;11867:2;11862:3;11858:12;11851:19;;11717:159;;;:::o;11885:371::-;;12045:67;12109:2;12104:3;12045:67;:::i;:::-;12038:74;;12145:34;12141:1;12136:3;12132:11;12125:55;12214:4;12209:2;12204:3;12200:12;12193:26;12247:2;12242:3;12238:12;12231:19;;12031:225;;;:::o;12265:306::-;;12425:66;12489:1;12484:3;12425:66;:::i;:::-;12418:73;;12524:9;12520:1;12515:3;12511:11;12504:30;12562:2;12557:3;12553:12;12546:19;;12411:160;;;:::o;12580:306::-;;12740:66;12804:1;12799:3;12740:66;:::i;:::-;12733:73;;12839:9;12835:1;12830:3;12826:11;12819:30;12877:2;12872:3;12868:12;12861:19;;12726:160;;;:::o;12895:305::-;;13055:66;13119:1;13114:3;13055:66;:::i;:::-;13048:73;;13154:8;13150:1;13145:3;13141:11;13134:29;13191:2;13186:3;13182:12;13175:19;;13041:159;;;:::o;13209:308::-;;13369:66;13433:1;13428:3;13369:66;:::i;:::-;13362:73;;13468:11;13464:1;13459:3;13455:11;13448:32;13508:2;13503:3;13499:12;13492:19;;13355:162;;;:::o;13526:304::-;;13686:66;13750:1;13745:3;13686:66;:::i;:::-;13679:73;;13785:7;13781:1;13776:3;13772:11;13765:28;13821:2;13816:3;13812:12;13805:19;;13672:158;;;:::o;13839:305::-;;13999:66;14063:1;14058:3;13999:66;:::i;:::-;13992:73;;14098:8;14094:1;14089:3;14085:11;14078:29;14135:2;14130:3;14126:12;14119:19;;13985:159;;;:::o;14153:327::-;;14313:67;14377:2;14372:3;14313:67;:::i;:::-;14306:74;;14413:29;14409:1;14404:3;14400:11;14393:50;14471:2;14466:3;14462:12;14455:19;;14299:181;;;:::o;14489:305::-;;14649:66;14713:1;14708:3;14649:66;:::i;:::-;14642:73;;14748:8;14744:1;14739:3;14735:11;14728:29;14785:2;14780:3;14776:12;14769:19;;14635:159;;;:::o;14803:305::-;;14963:66;15027:1;15022:3;14963:66;:::i;:::-;14956:73;;15062:8;15058:1;15053:3;15049:11;15042:29;15099:2;15094:3;15090:12;15083:19;;14949:159;;;:::o;15117:308::-;;15277:66;15341:1;15336:3;15277:66;:::i;:::-;15270:73;;15376:11;15372:1;15367:3;15363:11;15356:32;15416:2;15411:3;15407:12;15400:19;;15263:162;;;:::o;15434:306::-;;15594:66;15658:1;15653:3;15594:66;:::i;:::-;15587:73;;15693:9;15689:1;15684:3;15680:11;15673:30;15731:2;15726:3;15722:12;15715:19;;15580:160;;;:::o;15749:306::-;;15909:66;15973:1;15968:3;15909:66;:::i;:::-;15902:73;;16008:9;16004:1;15999:3;15995:11;15988:30;16046:2;16041:3;16037:12;16030:19;;15895:160;;;:::o;16064:306::-;;16224:66;16288:1;16283:3;16224:66;:::i;:::-;16217:73;;16323:9;16319:1;16314:3;16310:11;16303:30;16361:2;16356:3;16352:12;16345:19;;16210:160;;;:::o;16379:308::-;;16539:66;16603:1;16598:3;16539:66;:::i;:::-;16532:73;;16638:11;16634:1;16629:3;16625:11;16618:32;16678:2;16673:3;16669:12;16662:19;;16525:162;;;:::o;16696:308::-;;16856:66;16920:1;16915:3;16856:66;:::i;:::-;16849:73;;16955:11;16951:1;16946:3;16942:11;16935:32;16995:2;16990:3;16986:12;16979:19;;16842:162;;;:::o;17013:305::-;;17173:66;17237:1;17232:3;17173:66;:::i;:::-;17166:73;;17272:8;17268:1;17263:3;17259:11;17252:29;17309:2;17304:3;17300:12;17293:19;;17159:159;;;:::o;17327:305::-;;17487:66;17551:1;17546:3;17487:66;:::i;:::-;17480:73;;17586:8;17582:1;17577:3;17573:11;17566:29;17623:2;17618:3;17614:12;17607:19;;17473:159;;;:::o;17641:305::-;;17801:66;17865:1;17860:3;17801:66;:::i;:::-;17794:73;;17900:8;17896:1;17891:3;17887:11;17880:29;17937:2;17932:3;17928:12;17921:19;;17787:159;;;:::o;17955:305::-;;18115:66;18179:1;18174:3;18115:66;:::i;:::-;18108:73;;18214:8;18210:1;18205:3;18201:11;18194:29;18251:2;18246:3;18242:12;18235:19;;18101:159;;;:::o;18269:306::-;;18429:66;18493:1;18488:3;18429:66;:::i;:::-;18422:73;;18528:9;18524:1;18519:3;18515:11;18508:30;18566:2;18561:3;18557:12;18550:19;;18415:160;;;:::o;18584:306::-;;18744:66;18808:1;18803:3;18744:66;:::i;:::-;18737:73;;18843:9;18839:1;18834:3;18830:11;18823:30;18881:2;18876:3;18872:12;18865:19;;18730:160;;;:::o;18899:305::-;;19059:66;19123:1;19118:3;19059:66;:::i;:::-;19052:73;;19158:8;19154:1;19149:3;19145:11;19138:29;19195:2;19190:3;19186:12;19179:19;;19045:159;;;:::o;19213:304::-;;19373:66;19437:1;19432:3;19373:66;:::i;:::-;19366:73;;19472:7;19468:1;19463:3;19459:11;19452:28;19508:2;19503:3;19499:12;19492:19;;19359:158;;;:::o;19526:306::-;;19686:66;19750:1;19745:3;19686:66;:::i;:::-;19679:73;;19785:9;19781:1;19776:3;19772:11;19765:30;19823:2;19818:3;19814:12;19807:19;;19672:160;;;:::o;19841:305::-;;20001:66;20065:1;20060:3;20001:66;:::i;:::-;19994:73;;20100:8;20096:1;20091:3;20087:11;20080:29;20137:2;20132:3;20128:12;20121:19;;19987:159;;;:::o;20155:308::-;;20315:66;20379:1;20374:3;20315:66;:::i;:::-;20308:73;;20414:11;20410:1;20405:3;20401:11;20394:32;20454:2;20449:3;20445:12;20438:19;;20301:162;;;:::o;20472:308::-;;20632:66;20696:1;20691:3;20632:66;:::i;:::-;20625:73;;20731:11;20727:1;20722:3;20718:11;20711:32;20771:2;20766:3;20762:12;20755:19;;20618:162;;;:::o;20789:304::-;;20949:66;21013:1;21008:3;20949:66;:::i;:::-;20942:73;;21048:7;21044:1;21039:3;21035:11;21028:28;21084:2;21079:3;21075:12;21068:19;;20935:158;;;:::o;21102:305::-;;21262:66;21326:1;21321:3;21262:66;:::i;:::-;21255:73;;21361:8;21357:1;21352:3;21348:11;21341:29;21398:2;21393:3;21389:12;21382:19;;21248:159;;;:::o;21416:305::-;;21576:66;21640:1;21635:3;21576:66;:::i;:::-;21569:73;;21675:8;21671:1;21666:3;21662:11;21655:29;21712:2;21707:3;21703:12;21696:19;;21562:159;;;:::o;21730:308::-;;21890:66;21954:1;21949:3;21890:66;:::i;:::-;21883:73;;21989:11;21985:1;21980:3;21976:11;21969:32;22029:2;22024:3;22020:12;22013:19;;21876:162;;;:::o;22047:306::-;;22207:66;22271:1;22266:3;22207:66;:::i;:::-;22200:73;;22306:9;22302:1;22297:3;22293:11;22286:30;22344:2;22339:3;22335:12;22328:19;;22193:160;;;:::o;22420:1826::-;;22563:6;22558:3;22554:16;22651:4;22644:5;22640:16;22634:23;22663:63;22720:4;22715:3;22711:14;22697:12;22663:63;:::i;:::-;22585:147;22805:4;22798:5;22794:16;22788:23;22857:3;22851:4;22847:14;22840:4;22835:3;22831:14;22824:38;22877:73;22945:4;22931:12;22877:73;:::i;:::-;22869:81;;22742:220;23042:4;23035:5;23031:16;23025:23;23094:3;23088:4;23084:14;23077:4;23072:3;23068:14;23061:38;23114:73;23182:4;23168:12;23114:73;:::i;:::-;23106:81;;22972:227;23281:4;23274:5;23270:16;23264:23;23293:57;23344:4;23339:3;23335:14;23321:12;23293:57;:::i;:::-;23209:147;23437:4;23430:5;23426:16;23420:23;23449:63;23506:4;23501:3;23497:14;23483:12;23449:63;:::i;:::-;23366:152;23599:4;23592:5;23588:16;23582:23;23611:63;23668:4;23663:3;23659:14;23645:12;23611:63;:::i;:::-;23528:152;23763:4;23756:5;23752:16;23746:23;23815:3;23809:4;23805:14;23798:4;23793:3;23789:14;23782:38;23835:103;23933:4;23919:12;23835:103;:::i;:::-;23827:111;;23690:260;24033:4;24026:5;24022:16;24016:23;24085:3;24079:4;24075:14;24068:4;24063:3;24059:14;24052:38;24105:103;24203:4;24189:12;24105:103;:::i;:::-;24097:111;;23960:260;24237:4;24230:11;;22536:1710;;;;;:::o;24320:1305::-;24461:4;24456:3;24452:14;24545:4;24538:5;24534:16;24528:23;24557:63;24614:4;24609:3;24605:14;24591:12;24557:63;:::i;:::-;24481:145;24700:4;24693:5;24689:16;24683:23;24712:63;24769:4;24764:3;24760:14;24746:12;24712:63;:::i;:::-;24636:145;24865:4;24858:5;24854:16;24848:23;24877:63;24934:4;24929:3;24925:14;24911:12;24877:63;:::i;:::-;24791:155;25032:4;25025:5;25021:16;25015:23;25044:63;25101:4;25096:3;25092:14;25078:12;25044:63;:::i;:::-;24956:157;25198:4;25191:5;25187:16;25181:23;25210:63;25267:4;25262:3;25258:14;25244:12;25210:63;:::i;:::-;25123:156;25357:4;25350:5;25346:16;25340:23;25369:63;25426:4;25421:3;25417:14;25403:12;25369:63;:::i;:::-;25289:149;25529:4;25522:5;25518:16;25512:23;25541:63;25598:4;25593:3;25589:14;25575:12;25541:63;:::i;:::-;25448:162;24434:1191;;;:::o;25699:1315::-;25850:4;25845:3;25841:14;25934:4;25927:5;25923:16;25917:23;25946:63;26003:4;25998:3;25994:14;25980:12;25946:63;:::i;:::-;25870:145;26089:4;26082:5;26078:16;26072:23;26101:63;26158:4;26153:3;26149:14;26135:12;26101:63;:::i;:::-;26025:145;26254:4;26247:5;26243:16;26237:23;26266:63;26323:4;26318:3;26314:14;26300:12;26266:63;:::i;:::-;26180:155;26421:4;26414:5;26410:16;26404:23;26433:63;26490:4;26485:3;26481:14;26467:12;26433:63;:::i;:::-;26345:157;26587:4;26580:5;26576:16;26570:23;26599:63;26656:4;26651:3;26647:14;26633:12;26599:63;:::i;:::-;26512:156;26746:4;26739:5;26735:16;26729:23;26758:63;26815:4;26810:3;26806:14;26792:12;26758:63;:::i;:::-;26678:149;26918:4;26911:5;26907:16;26901:23;26930:63;26987:4;26982:3;26978:14;26964:12;26930:63;:::i;:::-;26837:162;25823:1191;;;:::o;27021:103::-;27094:24;27112:5;27094:24;:::i;:::-;27089:3;27082:37;27076:48;;:::o;27131:113::-;27214:24;27232:5;27214:24;:::i;:::-;27209:3;27202:37;27196:48;;:::o;27251:107::-;27330:22;27346:5;27330:22;:::i;:::-;27325:3;27318:35;27312:46;;:::o;27365:222::-;;27492:2;27481:9;27477:18;27469:26;;27506:71;27574:1;27563:9;27559:17;27550:6;27506:71;:::i;:::-;27463:124;;;;:::o;27594:474::-;;27823:2;27812:9;27808:18;27800:26;;27873:9;27867:4;27863:20;27859:1;27848:9;27844:17;27837:47;27898:160;28053:4;28044:6;27898:160;:::i;:::-;27890:168;;27794:274;;;;:::o;28075:486::-;;28310:2;28299:9;28295:18;28287:26;;28360:9;28354:4;28350:20;28346:1;28335:9;28331:17;28324:47;28385:166;28546:4;28537:6;28385:166;:::i;:::-;28377:174;;28281:280;;;;:::o;28568:210::-;;28689:2;28678:9;28674:18;28666:26;;28703:65;28765:1;28754:9;28750:17;28741:6;28703:65;:::i;:::-;28660:118;;;;:::o;28785:222::-;;28912:2;28901:9;28897:18;28889:26;;28926:71;28994:1;28983:9;28979:17;28970:6;28926:71;:::i;:::-;28883:124;;;;:::o;29014:310::-;;29161:2;29150:9;29146:18;29138:26;;29211:9;29205:4;29201:20;29197:1;29186:9;29182:17;29175:47;29236:78;29309:4;29300:6;29236:78;:::i;:::-;29228:86;;29132:192;;;;:::o;29331:416::-;;29531:2;29520:9;29516:18;29508:26;;29581:9;29575:4;29571:20;29567:1;29556:9;29552:17;29545:47;29606:131;29732:4;29606:131;:::i;:::-;29598:139;;29502:245;;;:::o;29754:416::-;;29954:2;29943:9;29939:18;29931:26;;30004:9;29998:4;29994:20;29990:1;29979:9;29975:17;29968:47;30029:131;30155:4;30029:131;:::i;:::-;30021:139;;29925:245;;;:::o;30177:416::-;;30377:2;30366:9;30362:18;30354:26;;30427:9;30421:4;30417:20;30413:1;30402:9;30398:17;30391:47;30452:131;30578:4;30452:131;:::i;:::-;30444:139;;30348:245;;;:::o;30600:416::-;;30800:2;30789:9;30785:18;30777:26;;30850:9;30844:4;30840:20;30836:1;30825:9;30821:17;30814:47;30875:131;31001:4;30875:131;:::i;:::-;30867:139;;30771:245;;;:::o;31023:416::-;;31223:2;31212:9;31208:18;31200:26;;31273:9;31267:4;31263:20;31259:1;31248:9;31244:17;31237:47;31298:131;31424:4;31298:131;:::i;:::-;31290:139;;31194:245;;;:::o;31446:416::-;;31646:2;31635:9;31631:18;31623:26;;31696:9;31690:4;31686:20;31682:1;31671:9;31667:17;31660:47;31721:131;31847:4;31721:131;:::i;:::-;31713:139;;31617:245;;;:::o;31869:416::-;;32069:2;32058:9;32054:18;32046:26;;32119:9;32113:4;32109:20;32105:1;32094:9;32090:17;32083:47;32144:131;32270:4;32144:131;:::i;:::-;32136:139;;32040:245;;;:::o;32292:416::-;;32492:2;32481:9;32477:18;32469:26;;32542:9;32536:4;32532:20;32528:1;32517:9;32513:17;32506:47;32567:131;32693:4;32567:131;:::i;:::-;32559:139;;32463:245;;;:::o;32715:416::-;;32915:2;32904:9;32900:18;32892:26;;32965:9;32959:4;32955:20;32951:1;32940:9;32936:17;32929:47;32990:131;33116:4;32990:131;:::i;:::-;32982:139;;32886:245;;;:::o;33138:416::-;;33338:2;33327:9;33323:18;33315:26;;33388:9;33382:4;33378:20;33374:1;33363:9;33359:17;33352:47;33413:131;33539:4;33413:131;:::i;:::-;33405:139;;33309:245;;;:::o;33561:416::-;;33761:2;33750:9;33746:18;33738:26;;33811:9;33805:4;33801:20;33797:1;33786:9;33782:17;33775:47;33836:131;33962:4;33836:131;:::i;:::-;33828:139;;33732:245;;;:::o;33984:416::-;;34184:2;34173:9;34169:18;34161:26;;34234:9;34228:4;34224:20;34220:1;34209:9;34205:17;34198:47;34259:131;34385:4;34259:131;:::i;:::-;34251:139;;34155:245;;;:::o;34407:416::-;;34607:2;34596:9;34592:18;34584:26;;34657:9;34651:4;34647:20;34643:1;34632:9;34628:17;34621:47;34682:131;34808:4;34682:131;:::i;:::-;34674:139;;34578:245;;;:::o;34830:416::-;;35030:2;35019:9;35015:18;35007:26;;35080:9;35074:4;35070:20;35066:1;35055:9;35051:17;35044:47;35105:131;35231:4;35105:131;:::i;:::-;35097:139;;35001:245;;;:::o;35253:416::-;;35453:2;35442:9;35438:18;35430:26;;35503:9;35497:4;35493:20;35489:1;35478:9;35474:17;35467:47;35528:131;35654:4;35528:131;:::i;:::-;35520:139;;35424:245;;;:::o;35676:416::-;;35876:2;35865:9;35861:18;35853:26;;35926:9;35920:4;35916:20;35912:1;35901:9;35897:17;35890:47;35951:131;36077:4;35951:131;:::i;:::-;35943:139;;35847:245;;;:::o;36099:416::-;;36299:2;36288:9;36284:18;36276:26;;36349:9;36343:4;36339:20;36335:1;36324:9;36320:17;36313:47;36374:131;36500:4;36374:131;:::i;:::-;36366:139;;36270:245;;;:::o;36522:416::-;;36722:2;36711:9;36707:18;36699:26;;36772:9;36766:4;36762:20;36758:1;36747:9;36743:17;36736:47;36797:131;36923:4;36797:131;:::i;:::-;36789:139;;36693:245;;;:::o;36945:416::-;;37145:2;37134:9;37130:18;37122:26;;37195:9;37189:4;37185:20;37181:1;37170:9;37166:17;37159:47;37220:131;37346:4;37220:131;:::i;:::-;37212:139;;37116:245;;;:::o;37368:416::-;;37568:2;37557:9;37553:18;37545:26;;37618:9;37612:4;37608:20;37604:1;37593:9;37589:17;37582:47;37643:131;37769:4;37643:131;:::i;:::-;37635:139;;37539:245;;;:::o;37791:416::-;;37991:2;37980:9;37976:18;37968:26;;38041:9;38035:4;38031:20;38027:1;38016:9;38012:17;38005:47;38066:131;38192:4;38066:131;:::i;:::-;38058:139;;37962:245;;;:::o;38214:416::-;;38414:2;38403:9;38399:18;38391:26;;38464:9;38458:4;38454:20;38450:1;38439:9;38435:17;38428:47;38489:131;38615:4;38489:131;:::i;:::-;38481:139;;38385:245;;;:::o;38637:416::-;;38837:2;38826:9;38822:18;38814:26;;38887:9;38881:4;38877:20;38873:1;38862:9;38858:17;38851:47;38912:131;39038:4;38912:131;:::i;:::-;38904:139;;38808:245;;;:::o;39060:416::-;;39260:2;39249:9;39245:18;39237:26;;39310:9;39304:4;39300:20;39296:1;39285:9;39281:17;39274:47;39335:131;39461:4;39335:131;:::i;:::-;39327:139;;39231:245;;;:::o;39483:416::-;;39683:2;39672:9;39668:18;39660:26;;39733:9;39727:4;39723:20;39719:1;39708:9;39704:17;39697:47;39758:131;39884:4;39758:131;:::i;:::-;39750:139;;39654:245;;;:::o;39906:416::-;;40106:2;40095:9;40091:18;40083:26;;40156:9;40150:4;40146:20;40142:1;40131:9;40127:17;40120:47;40181:131;40307:4;40181:131;:::i;:::-;40173:139;;40077:245;;;:::o;40329:416::-;;40529:2;40518:9;40514:18;40506:26;;40579:9;40573:4;40569:20;40565:1;40554:9;40550:17;40543:47;40604:131;40730:4;40604:131;:::i;:::-;40596:139;;40500:245;;;:::o;40752:416::-;;40952:2;40941:9;40937:18;40929:26;;41002:9;40996:4;40992:20;40988:1;40977:9;40973:17;40966:47;41027:131;41153:4;41027:131;:::i;:::-;41019:139;;40923:245;;;:::o;41175:416::-;;41375:2;41364:9;41360:18;41352:26;;41425:9;41419:4;41415:20;41411:1;41400:9;41396:17;41389:47;41450:131;41576:4;41450:131;:::i;:::-;41442:139;;41346:245;;;:::o;41598:416::-;;41798:2;41787:9;41783:18;41775:26;;41848:9;41842:4;41838:20;41834:1;41823:9;41819:17;41812:47;41873:131;41999:4;41873:131;:::i;:::-;41865:139;;41769:245;;;:::o;42021:416::-;;42221:2;42210:9;42206:18;42198:26;;42271:9;42265:4;42261:20;42257:1;42246:9;42242:17;42235:47;42296:131;42422:4;42296:131;:::i;:::-;42288:139;;42192:245;;;:::o;42444:416::-;;42644:2;42633:9;42629:18;42621:26;;42694:9;42688:4;42684:20;42680:1;42669:9;42665:17;42658:47;42719:131;42845:4;42719:131;:::i;:::-;42711:139;;42615:245;;;:::o;42867:416::-;;43067:2;43056:9;43052:18;43044:26;;43117:9;43111:4;43107:20;43103:1;43092:9;43088:17;43081:47;43142:131;43268:4;43142:131;:::i;:::-;43134:139;;43038:245;;;:::o;43290:416::-;;43490:2;43479:9;43475:18;43467:26;;43540:9;43534:4;43530:20;43526:1;43515:9;43511:17;43504:47;43565:131;43691:4;43565:131;:::i;:::-;43557:139;;43461:245;;;:::o;43713:416::-;;43913:2;43902:9;43898:18;43890:26;;43963:9;43957:4;43953:20;43949:1;43938:9;43934:17;43927:47;43988:131;44114:4;43988:131;:::i;:::-;43980:139;;43884:245;;;:::o;44136:339::-;;44321:3;44310:9;44306:19;44298:27;;44336:129;44462:1;44451:9;44447:17;44438:6;44336:129;:::i;:::-;44292:183;;;;:::o;44482:222::-;;44609:2;44598:9;44594:18;44586:26;;44623:71;44691:1;44680:9;44676:17;44667:6;44623:71;:::i;:::-;44580:124;;;;:::o;44711:214::-;;44834:2;44823:9;44819:18;44811:26;;44848:67;44912:1;44901:9;44897:17;44888:6;44848:67;:::i;:::-;44805:120;;;;:::o;44932:256::-;;44994:2;44988:9;44978:19;;45032:4;45024:6;45020:17;45131:6;45119:10;45116:22;45095:18;45083:10;45080:34;45077:62;45074:2;;;45152:1;45149;45142:12;45074:2;45172:10;45168:2;45161:22;44972:216;;;;:::o;45195:304::-;;45354:18;45346:6;45343:30;45340:2;;;45386:1;45383;45376:12;45340:2;45421:4;45413:6;45409:17;45401:25;;45484:4;45478;45474:15;45466:23;;45277:222;;;:::o;45506:322::-;;45650:18;45642:6;45639:30;45636:2;;;45682:1;45679;45672:12;45636:2;45749:4;45745:9;45738:4;45730:6;45726:17;45722:33;45714:41;;45813:4;45807;45803:15;45795:23;;45573:255;;;:::o;45835:151::-;;45921:3;45913:11;;45959:4;45954:3;45950:14;45942:22;;45907:79;;;:::o;45993:177::-;;46105:3;46097:11;;46143:4;46138:3;46134:14;46126:22;;46091:79;;;:::o;46177:180::-;;46292:3;46284:11;;46330:4;46325:3;46321:14;46313:22;;46278:79;;;:::o;46364:137::-;;46473:5;46467:12;46457:22;;46438:63;;;:::o;46508:163::-;;46643:5;46637:12;46627:22;;46608:63;;;:::o;46678:166::-;;46816:5;46810:12;46800:22;;46781:63;;;:::o;46851:122::-;;46945:5;46939:12;46929:22;;46910:63;;;:::o;46980:108::-;;47078:4;47073:3;47069:14;47061:22;;47055:33;;;:::o;47095:134::-;;47219:4;47214:3;47210:14;47202:22;;47196:33;;;:::o;47236:137::-;;47363:4;47358:3;47354:14;47346:22;;47340:33;;;:::o;47381:168::-;;47501:6;47496:3;47489:19;47538:4;47533:3;47529:14;47514:29;;47482:67;;;;:::o;47558:204::-;;47714:6;47709:3;47702:19;47751:4;47746:3;47742:14;47727:29;;47695:67;;;;:::o;47771:207::-;;47930:6;47925:3;47918:19;47967:4;47962:3;47958:14;47943:29;;47911:67;;;;:::o;47987:153::-;;48092:6;48087:3;48080:19;48129:4;48124:3;48120:14;48105:29;;48073:67;;;;:::o;48149:163::-;;48264:6;48259:3;48252:19;48301:4;48296:3;48292:14;48277:29;;48245:67;;;;:::o;48320:91::-;;48382:24;48400:5;48382:24;:::i;:::-;48371:35;;48365:46;;;:::o;48418:85::-;;48491:5;48484:13;48477:21;48466:32;;48460:43;;;:::o;48510:72::-;;48572:5;48561:16;;48555:27;;;:::o;48589:121::-;;48662:42;48655:5;48651:54;48640:65;;48634:76;;;:::o;48717:72::-;;48779:5;48768:16;;48762:27;;;:::o;48796:81::-;;48867:4;48860:5;48856:16;48845:27;;48839:38;;;:::o;48885:145::-;48966:6;48961:3;48956;48943:30;49022:1;49013:6;49008:3;49004:16;48997:27;48936:94;;;:::o;49039:268::-;49104:1;49111:101;49125:6;49122:1;49119:13;49111:101;;;49201:1;49196:3;49192:11;49186:18;49182:1;49177:3;49173:11;49166:39;49147:2;49144:1;49140:10;49135:15;;49111:101;;;49227:6;49224:1;49221:13;49218:2;;;49292:1;49283:6;49278:3;49274:16;49267:27;49218:2;49088:219;;;;:::o;49315:97::-;;49403:2;49399:7;49394:2;49387:5;49383:14;49379:28;49369:38;;49363:49;;;:::o;49420:117::-;49489:24;49507:5;49489:24;:::i;:::-;49482:5;49479:35;49469:2;;49528:1;49525;49518:12;49469:2;49463:74;:::o;49544:111::-;49610:21;49625:5;49610:21;:::i;:::-;49603:5;49600:32;49590:2;;49646:1;49643;49636:12;49590:2;49584:71;:::o;49662:117::-;49731:24;49749:5;49731:24;:::i;:::-;49724:5;49721:35;49711:2;;49770:1;49767;49760:12;49711:2;49705:74;:::o;49786:117::-;49855:24;49873:5;49855:24;:::i;:::-;49848:5;49845:35;49835:2;;49894:1;49891;49884:12;49835:2;49829:74;:::o
Swarm Source
ipfs://ba2fad7ffcf3442a88d6c70a050b97bd7e084781fe1f72ae119f153f40778556
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.