Token SeanceCircle
Overview ERC-20
Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
9,584,928.942564 SEANCE
Holders:
1,003 addresses
Contract:
Decimals:
18
Official Site:
Balance
156,534.567798456439379475 SEANCEValue
$207.36 ( ~436.8717 FTM) [1.6331%]
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
SEANCE represents staked SOUL and is required collateral for unlocking your staked SOUL. Namely, the only way to unstake SOUL is by burning SEANCE.Update? Click here to update the token ICO / general information
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SeanceCircle
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-28 */ /*-------------------------------------------------------------------------------------------------- ==================================================================================================== *~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~ *~~~*~~~*~~* SeanceCircle.sol |*| SPDX-License-Identifier: MIT |*||*| 0xBuns + DeGatchi ~~~*~~~*~~~* *~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~ ==================================================================================================== ---------------------------------------------------------------------------------------------------- MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy//yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs-..-yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs-.oo.-sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo..sNNs..sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo.-sNMMNs-.omMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd+.:yNMMMMNy:`+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh+`:yMMMMMMMMy:`+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh/`/hMMMMMMMMMMh\`/hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy:./hMMMMMMMMMMMMd\.:hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy:.+dMMMMMMMMMMMMMMd+.:yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMms-.omMMMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd+.:yNMMMMMMMMMMMMMMMMMMMMMMMMNy:.+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd/.:hMMMMMNMMMMMMMMMNNMMMMMMMMMMMh:`/dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh/`/hMMNdho/:-..--::::-..--:+shmMMMh\`/hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMy:`/dNho:-```-/shdmNNNmmdy+:.``.-/ydMd\`:hMMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMNy:`/yy\.-/:.-odNMMMMMMMMMMMMNh/./y+../yy\`:yMMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMNs-./:.-yhs:`+dMMMMMNdhyhhmNMMMMNs-.yhs:.-/\.-sNMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMsm.`:.:sdNd:`+dMMMdo.s.p.e.l.l.dMMMdo-.sNNh+-.:`msNMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMmo.`/.ymMMNo`:hMMMM-y.-sdmmds-.y-MMMMh`:hMMMdo:\`.omMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMd+../hMMMMMs.`yMMMMMm+/d(soul)b\+sMMMMMy`.sMMMMMh\-`+dmMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMd+..-+dMMMd/`+`uMMMMM.`/6\/.6.\/6\`.MOMMMy`-.dMMMd/`-.+dMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMMh/./:`.ooyMMMy`-MOMMM`..`XOXOXOXO`..`MMMOM-`yMMMyoo.`:\.\hMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMMMh/./hNmy/.-ohNMy-.oNMMMNy/--:/:\:--\odMMMMh:`+mMNms\hNmy\.\hMhMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMNy:.+dMMMMmy+--/who-.omMMMMN.fantom.NMMMNmo.-who\--+yMMMMmd+.:yNMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMNy:.+dMMMMMMMNds/--/+:./yNMMMMMMMMMMMMMNdo-.//:--+ymMMMMMMMMb+.:yNMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMNdo/--.`.:shmNNNMMNNNdy+-``--:+ymNMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMms-.omMMMMMMMMMMMMMMMNmyo/-...-:/++++/:-..-:+shmNMMMMMMMMMMMMMMMmo.-smMMMMMMMMMMMMMMM MMMMMMMMMMMMMMmo.-sNMMMMMMMMMMMMMMMMMMMMNmdhso++////++sydmNMMMMMMMMMMMMMMMMMMMMMNs-.omMMMMMMMMMMMMMM MMMMMMMMMMMMMm+.-yNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNy-.+mMMMMMMMMMMMMM MMMMMMMMMMMMd+`:yMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy:`+dMMMMMMMMMMMM MMMMMMMMMMMh/`/hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh\`/hMMMMMMMMMMM MMMMMMMMMMh:`/dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd\`:hMMMMMMMMMM MMMMMMMMNy:.+dMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd+.:yNMMMMMMMM MMMMMMNy-`:+seancessssssoooooooooooooooooooooooooooooooooooooooooooooooooooooooosscircle+:`-yNMMMMMM MMMMMMMNs::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::sNMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM ==================================================================================================== ~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~*~~~* ==================================================================================================== --------------------------------------------------------------------------------------------------*/ pragma solidity ^0.8.0; interface IERC20 { function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transferFrom(address sender, address recipient, uint amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint) private _balances; mapping(address => mapping(address => uint)) private _allowances; uint private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint) { return _balances[account]; } function transfer(address recipient, uint amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint) { return _allowances[owner][spender]; } function approve(address spender, uint amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, 'ERC20: transfer amount exceeds allowance'); _approve(sender, _msgSender(), currentAllowance - amount); return true; } function increaseAllowance(address spender, uint addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint subtractedValue) public virtual returns (bool) { uint currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero'); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } function _transfer(address sender, address recipient, uint amount) internal virtual { require(sender != address(0), 'ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20: transfer to the zero address'); _beforeTokenTransfer(sender, recipient, amount); uint senderBalance = _balances[sender]; require(senderBalance >= amount, 'ERC20: transfer amount exceeds balance'); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } function _mint(address account, uint amount) internal virtual { require(account != address(0), 'ERC20: mint to the zero address'); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } function _burn(address account, uint amount) internal virtual { require(account != address(0), 'ERC20: burn from the zero address'); _beforeTokenTransfer(account, address(0), amount); uint accountBalance = _balances[account]; require(accountBalance >= amount, 'ERC20: burn amount exceeds balance'); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } function _approve(address owner, address spender, uint amount) internal virtual { require(owner != address(0), 'ERC20: approve from the zero address'); require(spender != address(0), 'ERC20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer(address from, address to, uint amount) internal virtual {} function _afterTokenTransfer(address from, address to, uint amount) internal virtual {} } library Strings { bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; function toString(uint value) internal pure returns (string memory) { if (value == 0) { return '0'; } uint temp = value; uint digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint(value % 10))); value /= 10; } return string(buffer); } function toHexString(uint value) internal pure returns (string memory) { if (value == 0) { return '0x00'; } uint temp = value; uint length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } function toHexString(uint value, uint length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = '0'; buffer[1] = 'x'; for (uint i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, 'Strings: hex length insufficient'); return string(buffer); } } interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract ERC165 is IERC165 { function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert(string(abi.encodePacked( 'AccessControl: account ', Strings.toHexString(uint160(account), 20), ' is missing role ', Strings.toHexString(uint(role), 32))) ); } } function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), 'AccessControl: can only renounce roles for self'); _revokeRole(role, account); } function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } contract SoulPower is ERC20('SoulPower', 'SOUL'), AccessControl { address public supreme; // supreme divine bytes32 public anunnaki; // admin role bytes32 public thoth; // minter role bytes32 public constant DOMAIN_TYPEHASH = // EIP-712 typehash for the contract's domain keccak256('EIP712Domain(string name,uint chainId,address verifyingContract)'); bytes32 public constant DELEGATION_TYPEHASH = // EIP-712 typehash for the delegation struct used by the contract keccak256('Delegation(address delegatee,uint nonce,uint expiry)'); // mappings for user accounts (address) mapping(address => mapping(uint => Checkpoint)) public checkpoints; // vote checkpoints mapping(address => uint) public numCheckpoints; // checkpoint count mapping(address => uint) public nonces; // signing / validating states mapping(address => address) internal _delegates; // each accounts' delegate struct Checkpoint { // checkpoint for marking number of votes from a given timestamp uint fromTime; uint votes; } event NewSupreme(address supreme); event Rethroned(bytes32 role, address oldAccount, address newAccount); event DelegateChanged( // emitted when an account changes its delegate address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); event DelegateVotesChanged( // emitted when a delegate account's vote balance changes address indexed delegate, uint previousBalance, uint newBalance ); // restricted to the house of the role passed as an object to obey modifier obey(bytes32 role) { _checkRole(role, _msgSender()); _; } // channels the authority vested in anunnaki and thoth to the supreme constructor(address _supreme) { supreme = _supreme; anunnaki = keccak256('anunnaki'); // alpha supreme thoth = keccak256('thoth'); // god of wisdom and magic _divinationRitual(DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_ROLE, supreme); // supreme as root admin _divinationRitual(anunnaki, anunnaki, supreme); // anunnaki as admin of anunnaki _divinationRitual(thoth, anunnaki, supreme); // anunnaki as admin of thoth mint(supreme, 50000000 * 1e18); // mints initial supply of 50M } // solidifies roles (internal) function _divinationRitual(bytes32 _role, bytes32 _adminRole, address _account) internal { _setupRole(_role, _account); _setRoleAdmin(_role, _adminRole); } // grants `role` to `newAccount` && renounces `role` from `oldAccount` (public role) function rethroneRitual(bytes32 role, address oldAccount, address newAccount) public obey(role) { require(oldAccount != newAccount, 'must be a new address'); grantRole(role, newAccount); // grants new account renounceRole(role, oldAccount); // removes old account of role emit Rethroned(role, oldAccount, newAccount); } // updates supreme address (public anunnaki) function newSupreme(address _supreme) public obey(anunnaki) { require(supreme != _supreme, 'make a change, be the change'); // prevents self-destruct rethroneRitual(DEFAULT_ADMIN_ROLE, supreme, _supreme); // empowers new supreme supreme = _supreme; emit NewSupreme(supreme); } // checks whether sender has divine role (public view) function hasDivineRole(bytes32 role) public view returns (bool) { return hasRole(role, msg.sender); } // mints soul power as the house of thoth so wills (public thoth) function mint(address _to, uint _amount) public obey(thoth) { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } // destroys `amount` tokens from the caller (public) function burn(uint amount) public { _burn(_msgSender(), amount); _moveDelegates(_delegates[_msgSender()], address(0), amount); } // destroys `amount` tokens from the `account` (public) function burnFrom(address account, uint amount) public { uint currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, 'burn amount exceeds allowance'); _approve(account, _msgSender(), currentAllowance - amount); _burn(account, amount); _moveDelegates(_delegates[account], address(0), amount); } // returns the address delegated by a given delegator (external view) function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } // delegates to the `delegatee` (external) function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } // delegates votes from signatory to `delegatee` (external) function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this)) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) ); bytes32 digest = keccak256( abi.encodePacked('\x19\x01', domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), 'delegateBySig: invalid signature'); require(nonce == nonces[signatory]++, 'delegateBySig: invalid nonce'); require(block.timestamp <= expiry, 'delegateBySig: signature expired'); return _delegate(signatory, delegatee); } // returns current votes balance for `account` (external view) function getCurrentVotes(address account) external view returns (uint) { uint nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } // returns an account's prior vote count as of a given timestamp (external view) function getPriorVotes(address account, uint blockTimestamp) external view returns (uint) { require(blockTimestamp < block.timestamp, 'getPriorVotes: not yet determined'); uint nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // checks most recent balance if (checkpoints[account][nCheckpoints - 1].fromTime <= blockTimestamp) { return checkpoints[account][nCheckpoints - 1].votes; } // checks implicit zero balance if (checkpoints[account][0].fromTime > blockTimestamp) { return 0; } uint lower = 0; uint upper = nCheckpoints - 1; while (upper > lower) { uint center = upper - (upper - lower) / 2; // avoids overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromTime == blockTimestamp) { return cp.votes; } else if (cp.fromTime < blockTimestamp) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function safe256(uint n, string memory errorMessage) internal pure returns (uint) { require(n < type(uint).max, errorMessage); return uint(n); } function getChainId() internal view returns (uint) { uint chainId; assembly { chainId := chainid() } return chainId; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint delegatorBalance = balanceOf(delegator); // balance of underlying SOUL (not scaled) _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decreases old representative uint srcRepNum = numCheckpoints[srcRep]; uint srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increases new representative uint dstRepNum = numCheckpoints[dstRep]; uint dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint nCheckpoints, uint oldVotes, uint newVotes ) internal { uint blockTimestamp = safe256(block.timestamp, 'block timestamp exceeds 256 bits'); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromTime == blockTimestamp) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockTimestamp, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _setOwner(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract Operable is Context, Ownable { address[] public operators; mapping(address => bool) public operator; event OperatorUpdated(address indexed operator, bool indexed access); constructor () { address msgSender = _msgSender(); operator[msgSender] = true; operators.push(msgSender); emit OperatorUpdated(msgSender, true); } modifier onlyOperator() { address msgSender = _msgSender(); require(operator[msgSender], "Operator: caller is not an operator"); _; } function removeOperator(address removingOperator) public virtual onlyOperator { require(operator[removingOperator], 'Operable: address is not an operator'); operator[removingOperator] = false; for (uint8 i; i < operators.length; i++) { if (operators[i] == removingOperator) { operators[i] = operators[i+1]; operators.pop(); emit OperatorUpdated(removingOperator, false); return; } } } function addOperator(address newOperator) public virtual onlyOperator { require(newOperator != address(0), "Operable: new operator is the zero address"); require(!operator[newOperator], 'Operable: address is already an operator'); operator[newOperator] = true; operators.push(newOperator); emit OperatorUpdated(newOperator, true); } } // SeanceCircle with Governance. contract SeanceCircle is ERC20('SeanceCircle', 'SEANCE'), Ownable, Operable { SoulPower public soul; bool isInitialized; function mint(address _to, uint256 _amount) public onlyOperator { require(isInitialized, 'the circle has not yet begun'); _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } function burn(address _from ,uint256 _amount) public onlyOperator { _burn(_from, _amount); _moveDelegates(_delegates[_from], address(0), _amount); } function initialize(SoulPower _soul) external onlyOwner { require(!isInitialized, 'the circle has already begun'); soul = _soul; isInitialized = true; } // safe soul transfer function, just in case if rounding error causes pool to not have enough SOUL. function safeSoulTransfer(address _to, uint256 _amount) public onlyOperator { uint256 soulBal = soul.balanceOf(address(this)); if (_amount > soulBal) { soul.transfer(_to, soulBal); } else { soul.transfer(_to, _amount); } } // record of each accounts delegate mapping (address => address) internal _delegates; // checkpoint for marking number of votes from a given block timestamp struct Checkpoint { uint256 fromTime; uint256 votes; } // record of votes checkpoints for each account, by index mapping (address => mapping (uint256 => Checkpoint)) public checkpoints; // number of checkpoints for each account mapping (address => uint256) public numCheckpoints; // EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); // EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); // record of states for signing / validating signatures mapping (address => uint) public nonces; // emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); // emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); // returns the address delegated by a given delegator (external view) function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } // delegates to the `delegatee` (external) function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } // delegates votes from signatory to `delegatee` (external) function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "SOUL::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "SOUL::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "SOUL::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } // returns current votes balance for `account` (external view) function getCurrentVotes(address account) external view returns (uint) { uint nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } // returns an account's prior vote count as of a given timestamp (external view) function getPriorVotes(address account, uint blockTimestamp) external view returns (uint256) { require(blockTimestamp < block.timestamp, "SOUL::getPriorVotes: not yet determined"); uint256 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // checks most recent balance if (checkpoints[account][nCheckpoints - 1].fromTime <= blockTimestamp) { return checkpoints[account][nCheckpoints - 1].votes; } // checks implicit zero balance if (checkpoints[account][0].fromTime > blockTimestamp) { return 0; } uint256 lower = 0; uint256 upper = nCheckpoints - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromTime == blockTimestamp) { return cp.votes; } else if (cp.fromTime < blockTimestamp) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying SOUL (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint256 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint256 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint256 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint256 blockTimestamp = safe256(block.timestamp, "SOUL::_writeCheckpoint: block timestamp exceeds 256 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromTime == blockTimestamp) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockTimestamp, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe256(uint n, string memory errorMessage) internal pure returns (uint256) { require(n < type(uint256).max, errorMessage); return uint256(n); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } function newSoul(SoulPower _soul) external onlyOperator { require(soul != _soul, 'must be a new address'); soul = _soul; } }
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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bool","name":"access","type":"bool"}],"name":"OperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","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":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"fromTime","type":"uint256"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","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":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"contract SoulPower","name":"_soul","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract SoulPower","name":"_soul","type":"address"}],"name":"newSoul","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"removingOperator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"safeSoulTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soul","outputs":[{"internalType":"contract SoulPower","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f5365616e6365436972636c6500000000000000000000000000000000000000008152506040518060400160405280600681526020017f5345414e43450000000000000000000000000000000000000000000000000000815250816003908051906020019062000096929190620002bd565b508060049080519060200190620000af929190620002bd565b505050620000d2620000c6620001ef60201b60201c565b620001f760201b60201c565b6000620000e4620001ef60201b60201c565b90506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600115158173ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a350620003d2565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002cb906200036d565b90600052602060002090601f016020900481019282620002ef57600085556200033b565b82601f106200030a57805160ff19168380011785556200033b565b828001600101855582156200033b579182015b828111156200033a5782518255916020019190600101906200031d565b5b5090506200034a91906200034e565b5090565b5b80821115620003695760008160009055506001016200034f565b5090565b600060028204905060018216806200038657607f821691505b602082108114156200039d576200039c620003a3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61491b80620003e26000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063815b7a8c1161011a578063ac8a584a116100ad578063c4d66de81161007c578063c4d66de814610638578063dd62ed3e14610654578063e28d490614610684578063e7a324dc146106b4578063f2fde38b146106d257610206565b8063ac8a584a146105b4578063b2a142aa146105d0578063b4b5ea57146105ec578063c3cda5201461061c57610206565b80639a307391116100e95780639a307391146105085780639dc29fac14610538578063a457c2d714610554578063a9059cbb1461058457610206565b8063815b7a8c146104925780638da5cb5b146104b057806395d89b41146104ce5780639870d7fe146104ec57610206565b8063395093511161019d5780636fcfff451161016c5780636fcfff45146103c857806370a08231146103f8578063715018a614610428578063782d6fe1146104325780637ecebe001461046257610206565b8063395093511461033057806340c10f1914610360578063587cde1e1461037c5780635c19a95c146103ac57610206565b806320606b70116101d957806320606b70146102a857806323b872dd146102c6578063260cf996146102f6578063313ce5671461031257610206565b806306fdde031461020b578063095ea7b3146102295780630cdfebfa1461025957806318160ddd1461028a575b600080fd5b6102136106ee565b6040516102209190613b10565b60405180910390f35b610243600480360381019061023e919061341a565b610780565b60405161025091906139f0565b60405180910390f35b610273600480360381019061026e919061341a565b61079e565b604051610281929190613e2d565b60405180910390f35b6102926107cf565b60405161029f9190613e12565b60405180910390f35b6102b06107d9565b6040516102bd9190613a0b565b60405180910390f35b6102e060048036038101906102db91906133cb565b6107fd565b6040516102ed91906139f0565b60405180910390f35b610310600480360381019061030b9190613508565b6108fe565b005b61031a610a6c565b6040516103279190613e56565b60405180910390f35b61034a6004803603810190610345919061341a565b610a75565b60405161035791906139f0565b60405180910390f35b61037a6004803603810190610375919061341a565b610b21565b005b61039660048036038101906103919190613366565b610c82565b6040516103a391906139ac565b60405180910390f35b6103c660048036038101906103c19190613366565b610ceb565b005b6103e260048036038101906103dd9190613366565b610cf8565b6040516103ef9190613e12565b60405180910390f35b610412600480360381019061040d9190613366565b610d10565b60405161041f9190613e12565b60405180910390f35b610430610d58565b005b61044c6004803603810190610447919061341a565b610de0565b6040516104599190613e12565b60405180910390f35b61047c60048036038101906104779190613366565b61110b565b6040516104899190613e12565b60405180910390f35b61049a611123565b6040516104a79190613af5565b60405180910390f35b6104b8611149565b6040516104c591906139ac565b60405180910390f35b6104d6611173565b6040516104e39190613b10565b60405180910390f35b61050660048036038101906105019190613366565b611205565b005b610522600480360381019061051d9190613366565b6114a0565b60405161052f91906139f0565b60405180910390f35b610552600480360381019061054d919061341a565b6114c0565b005b61056e6004803603810190610569919061341a565b6115d2565b60405161057b91906139f0565b60405180910390f35b61059e6004803603810190610599919061341a565b6116c6565b6040516105ab91906139f0565b60405180910390f35b6105ce60048036038101906105c99190613366565b6116e4565b005b6105ea60048036038101906105e5919061341a565b611ada565b005b61060660048036038101906106019190613366565b611d95565b6040516106139190613e12565b60405180910390f35b61063660048036038101906106319190613456565b611e52565b005b610652600480360381019061064d9190613508565b6120e7565b005b61066e6004803603810190610669919061338f565b612212565b60405161067b9190613e12565b60405180910390f35b61069e60048036038101906106999190613531565b612299565b6040516106ab91906139ac565b60405180910390f35b6106bc6122d8565b6040516106c99190613a0b565b60405180910390f35b6106ec60048036038101906106e79190613366565b6122fc565b005b6060600380546106fd90614052565b80601f016020809104026020016040519081016040528092919081815260200182805461072990614052565b80156107765780601f1061074b57610100808354040283529160200191610776565b820191906000526020600020905b81548152906001019060200180831161075957829003601f168201915b5050505050905090565b600061079461078d6123f4565b84846123fc565b6001905092915050565b600a602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061080a8484846125c7565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006108556123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cc90613c52565b60405180910390fd5b6108f2856108e16123f4565b85846108ed9190613f56565b6123fc565b60019150509392505050565b60006109086123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098d90613d52565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90613cb2565b60405180910390fd5b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60006012905090565b6000610b17610a826123f4565b848460016000610a906123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b129190613e98565b6123fc565b6001905092915050565b6000610b2b6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090613d52565b60405180910390fd5b600860149054906101000a900460ff16610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613d72565b60405180910390fd5b610c128383612851565b610c7d6000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846129b1565b505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610cf53382612c0e565b50565b600b6020528060005260406000206000915090505481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d606123f4565b73ffffffffffffffffffffffffffffffffffffffff16610d7e611149565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90613c92565b60405180910390fd5b610dde6000612d7f565b565b6000428210610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90613c72565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415610e7b576000915050611105565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610eca9190613f56565b81526020019081526020016000206000015411610f4957600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610f2f9190613f56565b815260200190815260200160002060010154915050611105565b82600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808152602001908152602001600020600001541115610fae576000915050611105565b600080600183610fbe9190613f56565b90505b818111156110ab57600060028383610fd99190613f56565b610fe39190613f25565b82610fee9190613f56565b90506000600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050868160000151141561108057806020015195505050505050611105565b8681600001511015611094578193506110a4565b6001826110a19190613f56565b92505b5050610fc1565b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206001015493505050505b92915050565b600c6020528060005260406000206000915090505481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461118290614052565b80601f01602080910402602001604051908101604052809291908181526020018280546111ae90614052565b80156111fb5780601f106111d0576101008083540402835291602001916111fb565b820191906000526020600020905b8154815290600101906020018083116111de57829003601f168201915b5050505050905090565b600061120f6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661129d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129490613d52565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490613bb2565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613cd2565b60405180910390fd5b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600115158273ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a35050565b60076020528060005260406000206000915054906101000a900460ff1681565b60006114ca6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154f90613d52565b60405180910390fd5b6115628383612e45565b6115cd600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000846129b1565b505050565b600080600160006115e16123f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613dd2565b60405180910390fd5b6116bb6116a96123f4565b8585846116b69190613f56565b6123fc565b600191505092915050565b60006116da6116d36123f4565b84846125c7565b6001905092915050565b60006116ee6123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390613d52565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ff90613c12565b60405180910390fd5b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b6006805490508160ff161015611ad4578273ffffffffffffffffffffffffffffffffffffffff1660068260ff16815481106118c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ac157600660018261191d9190613eee565b60ff1681548110611957577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068260ff16815481106119bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480611a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600015158373ffffffffffffffffffffffffffffffffffffffff167f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d60405160405180910390a350611ad6565b8080611acc906140cd565b915050611863565b505b5050565b6000611ae46123f4565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6990613d52565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611bcf91906139ac565b60206040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1f919061355a565b905080831115611cde57600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401611c869291906139c7565b602060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd891906134df565b50611d8f565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401611d3b9291906139c7565b602060405180830381600087803b158015611d5557600080fd5b505af1158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d91906134df565b505b50505050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611de9576000611e4a565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183611e379190613f56565b8152602001908152602001600020600101545b915050919050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866611e7d6106ee565b80519060200120611e8c613025565b30604051602001611ea09493929190613a6b565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001611ef19493929190613a26565b60405160208183030381529060405280519060200120905060008282604051602001611f1e929190613975565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051611f5b9493929190613ab0565b6020604051602081039080840390855afa158015611f7d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613c32565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061204990614084565b91905055891461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590613bd2565b60405180910390fd5b874211156120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c890613db2565b60405180910390fd5b6120db818b612c0e565b50505050505050505050565b6120ef6123f4565b73ffffffffffffffffffffffffffffffffffffffff1661210d611149565b73ffffffffffffffffffffffffffffffffffffffff1614612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a90613c92565b60405180910390fd5b600860149054906101000a900460ff16156121b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121aa90613d12565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860146101000a81548160ff02191690831515021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600681815481106122a957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6123046123f4565b73ffffffffffffffffffffffffffffffffffffffff16612322611149565b73ffffffffffffffffffffffffffffffffffffffff1614612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f90613c92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90613b72565b60405180910390fd5b6123f181612d7f565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561246c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246390613d92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d390613b92565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125ba9190613e12565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e90613d32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e90613b32565b60405180910390fd5b6126b2838383613032565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272f90613bf2565b60405180910390fd5b81816127449190613f56565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d49190613e98565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128389190613e12565b60405180910390a361284b848484613037565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b890613df2565b60405180910390fd5b6128cd60008383613032565b80600260008282546128df9190613e98565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129349190613e98565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129999190613e12565b60405180910390a36129ad60008383613037565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156129ed5750600081115b15612c0957600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612afd576000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211612a7a576000612adb565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612ac89190613f56565b8152602001908152602001600020600101545b905060008382612aeb9190613f56565b9050612af98684848461303c565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c08576000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211612b85576000612be6565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184612bd39190613f56565b8152602001908152602001600020600101545b905060008382612bf69190613e98565b9050612c048584848461303c565b5050505b5b505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000612c7d84610d10565b905082600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612d798284836129b1565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eac90613cf2565b60405180910390fd5b612ec182600083613032565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3e90613b52565b60405180910390fd5b8181612f539190613f56565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254612fa79190613f56565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161300c9190613e12565b60405180910390a361302083600084613037565b505050565b6000804690508091505090565b505050565b505050565b6000613060426040518060600160405280603881526020016148ae60389139613262565b90506000841180156130d0575080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876130bc9190613f56565b815260200190815260200160002060000154145b1561313e5781600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876131249190613f56565b81526020019081526020016000206001018190555061320b565b604051806040016040528082815260200183815250600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000155602082015181600101559050506001846131c79190613e98565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051613253929190613e2d565b60405180910390a25050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831082906132c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c09190613b10565b60405180910390fd5b5082905092915050565b6000813590506132e281614823565b92915050565b6000815190506132f78161483a565b92915050565b60008135905061330c81614851565b92915050565b60008135905061332181614868565b92915050565b6000813590506133368161487f565b92915050565b60008151905061334b8161487f565b92915050565b60008135905061336081614896565b92915050565b60006020828403121561337857600080fd5b6000613386848285016132d3565b91505092915050565b600080604083850312156133a257600080fd5b60006133b0858286016132d3565b92505060206133c1858286016132d3565b9150509250929050565b6000806000606084860312156133e057600080fd5b60006133ee868287016132d3565b93505060206133ff868287016132d3565b925050604061341086828701613327565b9150509250925092565b6000806040838503121561342d57600080fd5b600061343b858286016132d3565b925050602061344c85828601613327565b9150509250929050565b60008060008060008060c0878903121561346f57600080fd5b600061347d89828a016132d3565b965050602061348e89828a01613327565b955050604061349f89828a01613327565b94505060606134b089828a01613351565b93505060806134c189828a016132fd565b92505060a06134d289828a016132fd565b9150509295509295509295565b6000602082840312156134f157600080fd5b60006134ff848285016132e8565b91505092915050565b60006020828403121561351a57600080fd5b600061352884828501613312565b91505092915050565b60006020828403121561354357600080fd5b600061355184828501613327565b91505092915050565b60006020828403121561356c57600080fd5b600061357a8482850161333c565b91505092915050565b61358c81613f8a565b82525050565b61359b81613f9c565b82525050565b6135aa81613fa8565b82525050565b6135c16135bc82613fa8565b6140f7565b82525050565b6135d081613ffb565b82525050565b60006135e182613e71565b6135eb8185613e7c565b93506135fb81856020860161401f565b6136048161418e565b840191505092915050565b600061361c602383613e7c565b91506136278261419f565b604082019050919050565b600061363f602283613e7c565b915061364a826141ee565b604082019050919050565b6000613662602683613e7c565b915061366d8261423d565b604082019050919050565b6000613685602283613e7c565b91506136908261428c565b604082019050919050565b60006136a8602a83613e7c565b91506136b3826142db565b604082019050919050565b60006136cb600283613e8d565b91506136d68261432a565b600282019050919050565b60006136ee602283613e7c565b91506136f982614353565b604082019050919050565b6000613711602683613e7c565b915061371c826143a2565b604082019050919050565b6000613734602483613e7c565b915061373f826143f1565b604082019050919050565b6000613757602683613e7c565b915061376282614440565b604082019050919050565b600061377a602883613e7c565b91506137858261448f565b604082019050919050565b600061379d602783613e7c565b91506137a8826144de565b604082019050919050565b60006137c0602083613e7c565b91506137cb8261452d565b602082019050919050565b60006137e3601583613e7c565b91506137ee82614556565b602082019050919050565b6000613806602883613e7c565b91506138118261457f565b604082019050919050565b6000613829602183613e7c565b9150613834826145ce565b604082019050919050565b600061384c601c83613e7c565b91506138578261461d565b602082019050919050565b600061386f602583613e7c565b915061387a82614646565b604082019050919050565b6000613892602383613e7c565b915061389d82614695565b604082019050919050565b60006138b5601c83613e7c565b91506138c0826146e4565b602082019050919050565b60006138d8602483613e7c565b91506138e38261470d565b604082019050919050565b60006138fb602683613e7c565b91506139068261475c565b604082019050919050565b600061391e602583613e7c565b9150613929826147ab565b604082019050919050565b6000613941601f83613e7c565b915061394c826147fa565b602082019050919050565b61396081613fe4565b82525050565b61396f81613fee565b82525050565b6000613980826136be565b915061398c82856135b0565b60208201915061399c82846135b0565b6020820191508190509392505050565b60006020820190506139c16000830184613583565b92915050565b60006040820190506139dc6000830185613583565b6139e96020830184613957565b9392505050565b6000602082019050613a056000830184613592565b92915050565b6000602082019050613a2060008301846135a1565b92915050565b6000608082019050613a3b60008301876135a1565b613a486020830186613583565b613a556040830185613957565b613a626060830184613957565b95945050505050565b6000608082019050613a8060008301876135a1565b613a8d60208301866135a1565b613a9a6040830185613957565b613aa76060830184613583565b95945050505050565b6000608082019050613ac560008301876135a1565b613ad26020830186613966565b613adf60408301856135a1565b613aec60608301846135a1565b95945050505050565b6000602082019050613b0a60008301846135c7565b92915050565b60006020820190508181036000830152613b2a81846135d6565b905092915050565b60006020820190508181036000830152613b4b8161360f565b9050919050565b60006020820190508181036000830152613b6b81613632565b9050919050565b60006020820190508181036000830152613b8b81613655565b9050919050565b60006020820190508181036000830152613bab81613678565b9050919050565b60006020820190508181036000830152613bcb8161369b565b9050919050565b60006020820190508181036000830152613beb816136e1565b9050919050565b60006020820190508181036000830152613c0b81613704565b9050919050565b60006020820190508181036000830152613c2b81613727565b9050919050565b60006020820190508181036000830152613c4b8161374a565b9050919050565b60006020820190508181036000830152613c6b8161376d565b9050919050565b60006020820190508181036000830152613c8b81613790565b9050919050565b60006020820190508181036000830152613cab816137b3565b9050919050565b60006020820190508181036000830152613ccb816137d6565b9050919050565b60006020820190508181036000830152613ceb816137f9565b9050919050565b60006020820190508181036000830152613d0b8161381c565b9050919050565b60006020820190508181036000830152613d2b8161383f565b9050919050565b60006020820190508181036000830152613d4b81613862565b9050919050565b60006020820190508181036000830152613d6b81613885565b9050919050565b60006020820190508181036000830152613d8b816138a8565b9050919050565b60006020820190508181036000830152613dab816138cb565b9050919050565b60006020820190508181036000830152613dcb816138ee565b9050919050565b60006020820190508181036000830152613deb81613911565b9050919050565b60006020820190508181036000830152613e0b81613934565b9050919050565b6000602082019050613e276000830184613957565b92915050565b6000604082019050613e426000830185613957565b613e4f6020830184613957565b9392505050565b6000602082019050613e6b6000830184613966565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000613ea382613fe4565b9150613eae83613fe4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee357613ee2614101565b5b828201905092915050565b6000613ef982613fee565b9150613f0483613fee565b92508260ff03821115613f1a57613f19614101565b5b828201905092915050565b6000613f3082613fe4565b9150613f3b83613fe4565b925082613f4b57613f4a614130565b5b828204905092915050565b6000613f6182613fe4565b9150613f6c83613fe4565b925082821015613f7f57613f7e614101565b5b828203905092915050565b6000613f9582613fc4565b9050919050565b60008115159050919050565b6000819050919050565b6000613fbd82613f8a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006140068261400d565b9050919050565b600061401882613fc4565b9050919050565b60005b8381101561403d578082015181840152602081019050614022565b8381111561404c576000848401525b50505050565b6000600282049050600182168061406a57607f821691505b6020821081141561407e5761407d61415f565b5b50919050565b600061408f82613fe4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140c2576140c1614101565b5b600182019050919050565b60006140d882613fee565b915060ff8214156140ec576140eb614101565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261626c653a206e6577206f70657261746f7220697320746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f534f554c3a3a64656c656761746542795369673a20696e76616c6964206e6f6e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261626c653a2061646472657373206973206e6f7420616e206f70657260008201527f61746f7200000000000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a64656c656761746542795369673a20696e76616c69642073696760008201527f6e61747572650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6d7573742062652061206e657720616464726573730000000000000000000000600082015250565b7f4f70657261626c653a206164647265737320697320616c726561647920616e2060008201527f6f70657261746f72000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f74686520636972636c652068617320616c726561647920626567756e00000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4f70657261746f723a2063616c6c6572206973206e6f7420616e206f7065726160008201527f746f720000000000000000000000000000000000000000000000000000000000602082015250565b7f74686520636972636c6520686173206e6f742079657420626567756e00000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f534f554c3a3a64656c656761746542795369673a207369676e6174757265206560008201527f7870697265640000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61482c81613f8a565b811461483757600080fd5b50565b61484381613f9c565b811461484e57600080fd5b50565b61485a81613fa8565b811461486557600080fd5b50565b61487181613fb2565b811461487c57600080fd5b50565b61488881613fe4565b811461489357600080fd5b50565b61489f81613fee565b81146148aa57600080fd5b5056fe534f554c3a3a5f7772697465436865636b706f696e743a20626c6f636b2074696d657374616d702065786365656473203235362062697473a2646970667358221220dbf57a198d2d7806ce66999da684530b4d67b0f58595dbcfba083196662dc8cd64736f6c63430008040033
Deployed ByteCode Sourcemap
28530:8300:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6917:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7739:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30003:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7190:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30240:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7913:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36682:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7105:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8333:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28670:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31084:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31243:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30130:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7287:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26517:94;;;:::i;:::-;;32984:1233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30630:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28615:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26294:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7009:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28107:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27088:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28908:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8553:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7403:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27580:519;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29384:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32672:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31406:1190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29087:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7583:148;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27055:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30443:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26619:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6917:86;6971:13;6995:5;6988:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6917:86;:::o;7739:166::-;7819:4;7836:39;7845:12;:10;:12::i;:::-;7859:7;7868:6;7836:8;:39::i;:::-;7893:4;7886:11;;7739:166;;;;:::o;30003:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7190:91::-;7251:4;7266:12;;7259:19;;7190:91;:::o;30240:122::-;30282:80;30240:122;:::o;7913:412::-;8016:4;8033:36;8043:6;8051:9;8062:6;8033:9;:36::i;:::-;8080:21;8104:11;:19;8116:6;8104:19;;;;;;;;;;;;;;;:33;8124:12;:10;:12::i;:::-;8104:33;;;;;;;;;;;;;;;;8080:57;;8176:6;8156:16;:26;;8148:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;8238:57;8247:6;8255:12;:10;:12::i;:::-;8288:6;8269:16;:25;;;;:::i;:::-;8238:8;:57::i;:::-;8313:4;8306:11;;;7913:412;;;;;:::o;36682:145::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36765:5:::1;36757:13;;:4;;;;;;;;;;;:13;;;;36749:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;36814:5;36807:4;;:12;;;;;;;;;;;;;;;;;;36682:145:::0;;:::o;7105:79::-;7163:5;7179:2;7172:9;;7105:79;:::o;8333:212::-;8418:4;8435:80;8444:12;:10;:12::i;:::-;8458:7;8504:10;8467:11;:25;8479:12;:10;:12::i;:::-;8467:25;;;;;;;;;;;;;;;:34;8493:7;8467:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;8435:8;:80::i;:::-;8533:4;8526:11;;8333:212;;;;:::o;28670:230::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28753:13:::1;;;;;;;;;;;28745:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;28810:19;28816:3;28821:7;28810:5;:19::i;:::-;28840:52;28863:1;28867:10;:15;28878:3;28867:15;;;;;;;;;;;;;;;;;;;;;;;;;28884:7;28840:14;:52::i;:::-;28670:230:::0;;;:::o;31084:103::-;31145:7;31163:10;:21;31174:9;31163:21;;;;;;;;;;;;;;;;;;;;;;;;;31156:28;;31084:103;;;:::o;31243:90::-;31298:32;31308:10;31320:9;31298;:32::i;:::-;31243:90;:::o;30130:50::-;;;;;;;;;;;;;;;;;:::o;7287:110::-;7361:4;7376:9;:18;7386:7;7376:18;;;;;;;;;;;;;;;;7369:25;;7287:110;;;:::o;26517:94::-;26440:12;:10;:12::i;:::-;26429:23;;:7;:5;:7::i;:::-;:23;;;26421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26582:21:::1;26600:1;26582:9;:21::i;:::-;26517:94::o:0;32984:1233::-;33068:7;33113:15;33096:14;:32;33088:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;33185:20;33208:14;:23;33223:7;33208:23;;;;;;;;;;;;;;;;33185:46;;33262:1;33246:12;:17;33242:58;;;33287:1;33280:8;;;;;33242:58;33406:14;33355:11;:20;33367:7;33355:20;;;;;;;;;;;;;;;:38;33391:1;33376:12;:16;;;;:::i;:::-;33355:38;;;;;;;;;;;:47;;;:65;33351:149;;33444:11;:20;33456:7;33444:20;;;;;;;;;;;;;;;:38;33480:1;33465:12;:16;;;;:::i;:::-;33444:38;;;;;;;;;;;:44;;;33437:51;;;;;33351:149;33592:14;33557:11;:20;33569:7;33557:20;;;;;;;;;;;;;;;:23;33578:1;33557:23;;;;;;;;;;;:32;;;:49;33553:90;;;33630:1;33623:8;;;;;33553:90;33655:13;33683;33714:1;33699:12;:16;;;;:::i;:::-;33683:32;;33726:433;33741:5;33733;:13;33726:433;;;33763:14;33806:1;33797:5;33789;:13;;;;:::i;:::-;33788:19;;;;:::i;:::-;33780:5;:27;;;;:::i;:::-;33763:44;;33849:20;33872:11;:20;33884:7;33872:20;;;;;;;;;;;;;;;:28;33893:6;33872:28;;;;;;;;;;;33849:51;;;;;;;;;;;;;;;;;;;;;;;;;;;33934:14;33919:2;:11;;;:29;33915:233;;;33976:2;:8;;;33969:15;;;;;;;;;33915:233;34024:14;34010:2;:11;;;:28;34006:142;;;34067:6;34059:14;;34006:142;;;34131:1;34122:6;:10;;;;:::i;:::-;34114:18;;34006:142;33726:433;;;;;34176:11;:20;34188:7;34176:20;;;;;;;;;;;;;;;:27;34197:5;34176:27;;;;;;;;;;;:33;;;34169:40;;;;;32984:1233;;;;;:::o;30630:39::-;;;;;;;;;;;;;;;;;:::o;28615:21::-;;;;;;;;;;;;;:::o;26294:87::-;26340:7;26367:6;;;;;;;;;;;26360:13;;26294:87;:::o;7009:90::-;7065:13;7089:7;7082:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7009:90;:::o;28107:382::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28219:1:::1;28196:25;;:11;:25;;;;28188:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;28288:8;:21;28297:11;28288:21;;;;;;;;;;;;;;;;;;;;;;;;;28287:22;28279:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28389:4;28365:8;:21;28374:11;28365:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;28404:9;28419:11;28404:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28476:4;28447:34;;28463:11;28447:34;;;;;;;;;;;;28107:382:::0;;:::o;27088:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;28908:171::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28985:21:::1;28991:5;28998:7;28985:5;:21::i;:::-;29017:54;29032:10;:17;29043:5;29032:17;;;;;;;;;;;;;;;;;;;;;;;;;29059:1;29063:7;29017:14;:54::i;:::-;28908:171:::0;;;:::o;8553:369::-;8643:4;8660:21;8684:11;:25;8696:12;:10;:12::i;:::-;8684:25;;;;;;;;;;;;;;;:34;8710:7;8684:34;;;;;;;;;;;;;;;;8660:58;;8757:15;8737:16;:35;;8729:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;8825:67;8834:12;:10;:12::i;:::-;8848:7;8876:15;8857:16;:34;;;;:::i;:::-;8825:8;:67::i;:::-;8910:4;8903:11;;;8553:369;;;;:::o;7403:172::-;7486:4;7503:42;7513:12;:10;:12::i;:::-;7527:9;7538:6;7503:9;:42::i;:::-;7563:4;7556:11;;7403:172;;;;:::o;27580:519::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27677:8:::1;:26;27686:16;27677:26;;;;;;;;;;;;;;;;;;;;;;;;;27669:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;27784:5;27755:8;:26;27764:16;27755:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;27805:7;27800:292;27818:9;:16;;;;27814:1;:20;;;27800:292;;;27876:16;27860:32;;:9;27870:1;27860:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;27856:225;;;27928:9;27940:1;27938;:3;;;;:::i;:::-;27928:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27913:9;27923:1;27913:12;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27961:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28034:5;28000:40;;28016:16;28000:40;;;;;;;;;;;;28059:7;;;27856:225;27836:3;;;;;:::i;:::-;;;;27800:292;;;;27563:1;27580:519:::0;;:::o;29384:289::-;27442:17;27462:12;:10;:12::i;:::-;27442:32;;27493:8;:19;27502:9;27493:19;;;;;;;;;;;;;;;;;;;;;;;;;27485:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29471:15:::1;29489:4;;;;;;;;;;;:14;;;29512:4;29489:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29471:47;;29543:7;29533;:17;29529:137;;;29567:4;;;;;;;;;;;:13;;;29581:3;29586:7;29567:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29529:137;;;29627:4;;;;;;;;;;;:13;;;29641:3;29646:7;29627:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29529:137;27563:1;29384:289:::0;;;:::o;32672:218::-;32737:4;32754:17;32774:14;:23;32789:7;32774:23;;;;;;;;;;;;;;;;32754:43;;32830:1;32815:12;:16;:67;;32881:1;32815:67;;;32834:11;:20;32846:7;32834:20;;;;;;;;;;;;;;;:38;32870:1;32855:12;:16;;;;:::i;:::-;32834:38;;;;;;;;;;;:44;;;32815:67;32808:74;;;32672:218;;;:::o;31406:1190::-;31599:23;30282:80;31728:6;:4;:6::i;:::-;31712:24;;;;;;31755:12;:10;:12::i;:::-;31794:4;31649:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31625:200;;;;;;31599:226;;31838:18;30489:71;31950:9;31978:5;32002:6;31883:140;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31859:175;;;;;;31838:196;;32047:14;32152:15;32186:10;32088:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32064:158;;;;;;32047:175;;32235:17;32255:26;32265:6;32273:1;32276;32279;32255:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32235:46;;32321:1;32300:23;;:9;:23;;;;32292:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32394:6;:17;32401:9;32394:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;32385:5;:28;32377:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;32490:6;32471:15;:25;;32463:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32557:31;32567:9;32578;32557;:31::i;:::-;32550:38;;;;31406:1190;;;;;;:::o;29087:184::-;26440:12;:10;:12::i;:::-;26429:23;;:7;:5;:7::i;:::-;:23;;;26421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29163:13:::1;;;;;;;;;;;29162:14;29154:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;29227:5;29220:4;;:12;;;;;;;;;;;;;;;;;;29259:4;29243:13;;:20;;;;;;;;;;;;;;;;;;29087:184:::0;:::o;7583:148::-;7672:4;7696:11;:18;7708:5;7696:18;;;;;;;;;;;;;;;:27;7715:7;7696:27;;;;;;;;;;;;;;;;7689:34;;7583:148;;;;:::o;27055:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30443:117::-;30489:71;30443:117;:::o;26619:192::-;26440:12;:10;:12::i;:::-;26429:23;;:7;:5;:7::i;:::-;:23;;;26421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26728:1:::1;26708:22;;:8;:22;;;;26700:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26784:19;26794:8;26784:9;:19::i;:::-;26619:192:::0;:::o;6342:84::-;6395:7;6413:10;6406:17;;6342:84;:::o;10534:341::-;10650:1;10633:19;;:5;:19;;;;10625:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10731:1;10712:21;;:7;:21;;;;10704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10813:6;10783:11;:18;10795:5;10783:18;;;;;;;;;;;;;;;:27;10802:7;10783:27;;;;;;;;;;;;;;;:36;;;;10851:7;10835:32;;10844:5;10835:32;;;10860:6;10835:32;;;;;;:::i;:::-;;;;;;;;10534:341;;;:::o;8930:649::-;9051:1;9033:20;;:6;:20;;;;9025:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;9135:1;9114:23;;:9;:23;;;;9106:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9188:47;9209:6;9217:9;9228:6;9188:20;:47::i;:::-;9246:18;9267:9;:17;9277:6;9267:17;;;;;;;;;;;;;;;;9246:38;;9320:6;9303:13;:23;;9295:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9416:6;9400:13;:22;;;;:::i;:::-;9380:9;:17;9390:6;9380:17;;;;;;;;;;;;;;;:42;;;;9457:6;9433:9;:20;9443:9;9433:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;9496:9;9479:35;;9488:6;9479:35;;;9507:6;9479:35;;;;;;:::i;:::-;;;;;;;;9525:46;9545:6;9553:9;9564:6;9525:19;:46::i;:::-;8930:649;;;;:::o;9587:390::-;9687:1;9668:21;;:7;:21;;;;9660:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;9736:49;9765:1;9769:7;9778:6;9736:20;:49::i;:::-;9812:6;9796:12;;:22;;;;;;;:::i;:::-;;;;;;;;9851:6;9829:9;:18;9839:7;9829:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;9894:7;9873:37;;9890:1;9873:37;;;9903:6;9873:37;;;;;;:::i;:::-;;;;;;;;9921:48;9949:1;9953:7;9962:6;9921:19;:48::i;:::-;9587:390;;:::o;34656:943::-;34762:6;34752:16;;:6;:16;;;;:30;;;;;34781:1;34772:6;:10;34752:30;34748:844;;;34821:1;34803:20;;:6;:20;;;34799:383;;34892:17;34912:14;:22;34927:6;34912:22;;;;;;;;;;;;;;;;34892:42;;34953:17;34985:1;34973:9;:13;:60;;35032:1;34973:60;;;34989:11;:19;35001:6;34989:19;;;;;;;;;;;;;;;:34;35021:1;35009:9;:13;;;;:::i;:::-;34989:34;;;;;;;;;;;:40;;;34973:60;34953:80;;35052:17;35084:6;35072:9;:18;;;;:::i;:::-;35052:38;;35109:57;35126:6;35134:9;35145;35156;35109:16;:57::i;:::-;34799:383;;;;35220:1;35202:20;;:6;:20;;;35198:383;;35291:17;35311:14;:22;35326:6;35311:22;;;;;;;;;;;;;;;;35291:42;;35352:17;35384:1;35372:9;:13;:60;;35431:1;35372:60;;;35388:11;:19;35400:6;35388:19;;;;;;;;;;;;;;;:34;35420:1;35408:9;:13;;;;:::i;:::-;35388:34;;;;;;;;;;;:40;;;35372:60;35352:80;;35451:17;35483:6;35471:9;:18;;;;:::i;:::-;35451:38;;35508:57;35525:6;35533:9;35544;35555;35508:16;:57::i;:::-;35198:383;;;;34748:844;34656:943;;;:::o;34225:423::-;34302:23;34328:10;:21;34339:9;34328:21;;;;;;;;;;;;;;;;;;;;;;;;;34302:47;;34360:24;34387:20;34397:9;34387;:20::i;:::-;34360:47;;34486:9;34462:10;:21;34473:9;34462:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;34557:9;34513:54;;34540:15;34513:54;;34529:9;34513:54;;;;;;;;;;;;34580:60;34595:15;34612:9;34623:16;34580:14;:60::i;:::-;34225:423;;;;:::o;26819:173::-;26875:16;26894:6;;;;;;;;;;;26875:25;;26920:8;26911:6;;:17;;;;;;;;;;;;;;;;;;26975:8;26944:40;;26965:8;26944:40;;;;;;;;;;;;26819:173;;:::o;9985:541::-;10085:1;10066:21;;:7;:21;;;;10058:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;10136:49;10157:7;10174:1;10178:6;10136:20;:49::i;:::-;10196:19;10218:9;:18;10228:7;10218:18;;;;;;;;;;;;;;;;10196:40;;10273:6;10255:14;:24;;10247:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;10367:6;10350:14;:23;;;;:::i;:::-;10329:9;:18;10339:7;10329:18;;;;;;;;;;;;;;;:44;;;;10400:6;10384:12;;:22;;;;;;;:::i;:::-;;;;;;;;10448:1;10422:37;;10431:7;10422:37;;;10452:6;10422:37;;;;;;:::i;:::-;;;;;;;;10470:48;10490:7;10507:1;10511:6;10470:19;:48::i;:::-;9985:541;;;:::o;36521:153::-;36566:4;36583:15;36631:9;36620:20;;36659:7;36652:14;;;36521:153;:::o;10883:88::-;;;;:::o;10977:87::-;;;;:::o;35607:722::-;35787:22;35812:84;35820:15;35812:84;;;;;;;;;;;;;;;;;:7;:84::i;:::-;35787:109;;35928:1;35913:12;:16;:87;;;;;35986:14;35933:11;:22;35945:9;35933:22;;;;;;;;;;;;;;;:40;35971:1;35956:12;:16;;;;:::i;:::-;35933:40;;;;;;;;;;;:49;;;:67;35913:87;35909:344;;;36066:8;36017:11;:22;36029:9;36017:22;;;;;;;;;;;;;;;:40;36055:1;36040:12;:16;;;;:::i;:::-;36017:40;;;;;;;;;;;:46;;:57;;;;35909:344;;;36146:36;;;;;;;;36157:14;36146:36;;;;36173:8;36146:36;;;36107:11;:22;36119:9;36107:22;;;;;;;;;;;;;;;:36;36130:12;36107:36;;;;;;;;;;;:75;;;;;;;;;;;;;;;;;;;36240:1;36225:12;:16;;;;:::i;:::-;36197:14;:25;36212:9;36197:25;;;;;;;;;;;;;;;:44;;;;35909:344;36291:9;36270:51;;;36302:8;36312;36270:51;;;;;;;:::i;:::-;;;;;;;;35607:722;;;;;:::o;36337:176::-;36413:7;36445:17;36441:1;:21;36464:12;36433:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;36503:1;36488:17;;36337:176;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;206:5;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;341:5;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:175::-;504:5;542:6;529:20;520:29;;558:51;603:5;558:51;:::i;:::-;510:105;;;;:::o;621:139::-;667:5;705:6;692:20;683:29;;721:33;748:5;721:33;:::i;:::-;673:87;;;;:::o;766:143::-;823:5;854:6;848:13;839:22;;870:33;897:5;870:33;:::i;:::-;829:80;;;;:::o;915:135::-;959:5;997:6;984:20;975:29;;1013:31;1038:5;1013:31;:::i;:::-;965:85;;;;:::o;1056:262::-;1115:6;1164:2;1152:9;1143:7;1139:23;1135:32;1132:2;;;1180:1;1177;1170:12;1132:2;1223:1;1248:53;1293:7;1284:6;1273:9;1269:22;1248:53;:::i;:::-;1238:63;;1194:117;1122:196;;;;:::o;1324:407::-;1392:6;1400;1449:2;1437:9;1428:7;1424:23;1420:32;1417:2;;;1465:1;1462;1455:12;1417:2;1508:1;1533:53;1578:7;1569:6;1558:9;1554:22;1533:53;:::i;:::-;1523:63;;1479:117;1635:2;1661:53;1706:7;1697:6;1686:9;1682:22;1661:53;:::i;:::-;1651:63;;1606:118;1407:324;;;;;:::o;1737:552::-;1814:6;1822;1830;1879:2;1867:9;1858:7;1854:23;1850:32;1847:2;;;1895:1;1892;1885:12;1847:2;1938:1;1963:53;2008:7;1999:6;1988:9;1984:22;1963:53;:::i;:::-;1953:63;;1909:117;2065:2;2091:53;2136:7;2127:6;2116:9;2112:22;2091:53;:::i;:::-;2081:63;;2036:118;2193:2;2219:53;2264:7;2255:6;2244:9;2240:22;2219:53;:::i;:::-;2209:63;;2164:118;1837:452;;;;;:::o;2295:407::-;2363:6;2371;2420:2;2408:9;2399:7;2395:23;2391:32;2388:2;;;2436:1;2433;2426:12;2388:2;2479:1;2504:53;2549:7;2540:6;2529:9;2525:22;2504:53;:::i;:::-;2494:63;;2450:117;2606:2;2632:53;2677:7;2668:6;2657:9;2653:22;2632:53;:::i;:::-;2622:63;;2577:118;2378:324;;;;;:::o;2708:986::-;2810:6;2818;2826;2834;2842;2850;2899:3;2887:9;2878:7;2874:23;2870:33;2867:2;;;2916:1;2913;2906:12;2867:2;2959:1;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2930:117;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3214:2;3240:53;3285:7;3276:6;3265:9;3261:22;3240:53;:::i;:::-;3230:63;;3185:118;3342:2;3368:51;3411:7;3402:6;3391:9;3387:22;3368:51;:::i;:::-;3358:61;;3313:116;3468:3;3495:53;3540:7;3531:6;3520:9;3516:22;3495:53;:::i;:::-;3485:63;;3439:119;3597:3;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3568:119;2857:837;;;;;;;;:::o;3700:278::-;3767:6;3816:2;3804:9;3795:7;3791:23;3787:32;3784:2;;;3832:1;3829;3822:12;3784:2;3875:1;3900:61;3953:7;3944:6;3933:9;3929:22;3900:61;:::i;:::-;3890:71;;3846:125;3774:204;;;;:::o;3984:298::-;4061:6;4110:2;4098:9;4089:7;4085:23;4081:32;4078:2;;;4126:1;4123;4116:12;4078:2;4169:1;4194:71;4257:7;4248:6;4237:9;4233:22;4194:71;:::i;:::-;4184:81;;4140:135;4068:214;;;;:::o;4288:262::-;4347:6;4396:2;4384:9;4375:7;4371:23;4367:32;4364:2;;;4412:1;4409;4402:12;4364:2;4455:1;4480:53;4525:7;4516:6;4505:9;4501:22;4480:53;:::i;:::-;4470:63;;4426:117;4354:196;;;;:::o;4556:284::-;4626:6;4675:2;4663:9;4654:7;4650:23;4646:32;4643:2;;;4691:1;4688;4681:12;4643:2;4734:1;4759:64;4815:7;4806:6;4795:9;4791:22;4759:64;:::i;:::-;4749:74;;4705:128;4633:207;;;;:::o;4846:118::-;4933:24;4951:5;4933:24;:::i;:::-;4928:3;4921:37;4911:53;;:::o;4970:109::-;5051:21;5066:5;5051:21;:::i;:::-;5046:3;5039:34;5029:50;;:::o;5085:118::-;5172:24;5190:5;5172:24;:::i;:::-;5167:3;5160:37;5150:53;;:::o;5209:157::-;5314:45;5334:24;5352:5;5334:24;:::i;:::-;5314:45;:::i;:::-;5309:3;5302:58;5292:74;;:::o;5372:167::-;5477:55;5526:5;5477:55;:::i;:::-;5472:3;5465:68;5455:84;;:::o;5545:364::-;5633:3;5661:39;5694:5;5661:39;:::i;:::-;5716:71;5780:6;5775:3;5716:71;:::i;:::-;5709:78;;5796:52;5841:6;5836:3;5829:4;5822:5;5818:16;5796:52;:::i;:::-;5873:29;5895:6;5873:29;:::i;:::-;5868:3;5864:39;5857:46;;5637:272;;;;;:::o;5915:366::-;6057:3;6078:67;6142:2;6137:3;6078:67;:::i;:::-;6071:74;;6154:93;6243:3;6154:93;:::i;:::-;6272:2;6267:3;6263:12;6256:19;;6061:220;;;:::o;6287:366::-;6429:3;6450:67;6514:2;6509:3;6450:67;:::i;:::-;6443:74;;6526:93;6615:3;6526:93;:::i;:::-;6644:2;6639:3;6635:12;6628:19;;6433:220;;;:::o;6659:366::-;6801:3;6822:67;6886:2;6881:3;6822:67;:::i;:::-;6815:74;;6898:93;6987:3;6898:93;:::i;:::-;7016:2;7011:3;7007:12;7000:19;;6805:220;;;:::o;7031:366::-;7173:3;7194:67;7258:2;7253:3;7194:67;:::i;:::-;7187:74;;7270:93;7359:3;7270:93;:::i;:::-;7388:2;7383:3;7379:12;7372:19;;7177:220;;;:::o;7403:366::-;7545:3;7566:67;7630:2;7625:3;7566:67;:::i;:::-;7559:74;;7642:93;7731:3;7642:93;:::i;:::-;7760:2;7755:3;7751:12;7744:19;;7549:220;;;:::o;7775:400::-;7935:3;7956:84;8038:1;8033:3;7956:84;:::i;:::-;7949:91;;8049:93;8138:3;8049:93;:::i;:::-;8167:1;8162:3;8158:11;8151:18;;7939:236;;;:::o;8181:366::-;8323:3;8344:67;8408:2;8403:3;8344:67;:::i;:::-;8337:74;;8420:93;8509:3;8420:93;:::i;:::-;8538:2;8533:3;8529:12;8522:19;;8327:220;;;:::o;8553:366::-;8695:3;8716:67;8780:2;8775:3;8716:67;:::i;:::-;8709:74;;8792:93;8881:3;8792:93;:::i;:::-;8910:2;8905:3;8901:12;8894:19;;8699:220;;;:::o;8925:366::-;9067:3;9088:67;9152:2;9147:3;9088:67;:::i;:::-;9081:74;;9164:93;9253:3;9164:93;:::i;:::-;9282:2;9277:3;9273:12;9266:19;;9071:220;;;:::o;9297:366::-;9439:3;9460:67;9524:2;9519:3;9460:67;:::i;:::-;9453:74;;9536:93;9625:3;9536:93;:::i;:::-;9654:2;9649:3;9645:12;9638:19;;9443:220;;;:::o;9669:366::-;9811:3;9832:67;9896:2;9891:3;9832:67;:::i;:::-;9825:74;;9908:93;9997:3;9908:93;:::i;:::-;10026:2;10021:3;10017:12;10010:19;;9815:220;;;:::o;10041:366::-;10183:3;10204:67;10268:2;10263:3;10204:67;:::i;:::-;10197:74;;10280:93;10369:3;10280:93;:::i;:::-;10398:2;10393:3;10389:12;10382:19;;10187:220;;;:::o;10413:366::-;10555:3;10576:67;10640:2;10635:3;10576:67;:::i;:::-;10569:74;;10652:93;10741:3;10652:93;:::i;:::-;10770:2;10765:3;10761:12;10754:19;;10559:220;;;:::o;10785:366::-;10927:3;10948:67;11012:2;11007:3;10948:67;:::i;:::-;10941:74;;11024:93;11113:3;11024:93;:::i;:::-;11142:2;11137:3;11133:12;11126:19;;10931:220;;;:::o;11157:366::-;11299:3;11320:67;11384:2;11379:3;11320:67;:::i;:::-;11313:74;;11396:93;11485:3;11396:93;:::i;:::-;11514:2;11509:3;11505:12;11498:19;;11303:220;;;:::o;11529:366::-;11671:3;11692:67;11756:2;11751:3;11692:67;:::i;:::-;11685:74;;11768:93;11857:3;11768:93;:::i;:::-;11886:2;11881:3;11877:12;11870:19;;11675:220;;;:::o;11901:366::-;12043:3;12064:67;12128:2;12123:3;12064:67;:::i;:::-;12057:74;;12140:93;12229:3;12140:93;:::i;:::-;12258:2;12253:3;12249:12;12242:19;;12047:220;;;:::o;12273:366::-;12415:3;12436:67;12500:2;12495:3;12436:67;:::i;:::-;12429:74;;12512:93;12601:3;12512:93;:::i;:::-;12630:2;12625:3;12621:12;12614:19;;12419:220;;;:::o;12645:366::-;12787:3;12808:67;12872:2;12867:3;12808:67;:::i;:::-;12801:74;;12884:93;12973:3;12884:93;:::i;:::-;13002:2;12997:3;12993:12;12986:19;;12791:220;;;:::o;13017:366::-;13159:3;13180:67;13244:2;13239:3;13180:67;:::i;:::-;13173:74;;13256:93;13345:3;13256:93;:::i;:::-;13374:2;13369:3;13365:12;13358:19;;13163:220;;;:::o;13389:366::-;13531:3;13552:67;13616:2;13611:3;13552:67;:::i;:::-;13545:74;;13628:93;13717:3;13628:93;:::i;:::-;13746:2;13741:3;13737:12;13730:19;;13535:220;;;:::o;13761:366::-;13903:3;13924:67;13988:2;13983:3;13924:67;:::i;:::-;13917:74;;14000:93;14089:3;14000:93;:::i;:::-;14118:2;14113:3;14109:12;14102:19;;13907:220;;;:::o;14133:366::-;14275:3;14296:67;14360:2;14355:3;14296:67;:::i;:::-;14289:74;;14372:93;14461:3;14372:93;:::i;:::-;14490:2;14485:3;14481:12;14474:19;;14279:220;;;:::o;14505:366::-;14647:3;14668:67;14732:2;14727:3;14668:67;:::i;:::-;14661:74;;14744:93;14833:3;14744:93;:::i;:::-;14862:2;14857:3;14853:12;14846:19;;14651:220;;;:::o;14877:118::-;14964:24;14982:5;14964:24;:::i;:::-;14959:3;14952:37;14942:53;;:::o;15001:112::-;15084:22;15100:5;15084:22;:::i;:::-;15079:3;15072:35;15062:51;;:::o;15119:663::-;15360:3;15382:148;15526:3;15382:148;:::i;:::-;15375:155;;15540:75;15611:3;15602:6;15540:75;:::i;:::-;15640:2;15635:3;15631:12;15624:19;;15653:75;15724:3;15715:6;15653:75;:::i;:::-;15753:2;15748:3;15744:12;15737:19;;15773:3;15766:10;;15364:418;;;;;:::o;15788:222::-;15881:4;15919:2;15908:9;15904:18;15896:26;;15932:71;16000:1;15989:9;15985:17;15976:6;15932:71;:::i;:::-;15886:124;;;;:::o;16016:332::-;16137:4;16175:2;16164:9;16160:18;16152:26;;16188:71;16256:1;16245:9;16241:17;16232:6;16188:71;:::i;:::-;16269:72;16337:2;16326:9;16322:18;16313:6;16269:72;:::i;:::-;16142:206;;;;;:::o;16354:210::-;16441:4;16479:2;16468:9;16464:18;16456:26;;16492:65;16554:1;16543:9;16539:17;16530:6;16492:65;:::i;:::-;16446:118;;;;:::o;16570:222::-;16663:4;16701:2;16690:9;16686:18;16678:26;;16714:71;16782:1;16771:9;16767:17;16758:6;16714:71;:::i;:::-;16668:124;;;;:::o;16798:553::-;16975:4;17013:3;17002:9;16998:19;16990:27;;17027:71;17095:1;17084:9;17080:17;17071:6;17027:71;:::i;:::-;17108:72;17176:2;17165:9;17161:18;17152:6;17108:72;:::i;:::-;17190;17258:2;17247:9;17243:18;17234:6;17190:72;:::i;:::-;17272;17340:2;17329:9;17325:18;17316:6;17272:72;:::i;:::-;16980:371;;;;;;;:::o;17357:553::-;17534:4;17572:3;17561:9;17557:19;17549:27;;17586:71;17654:1;17643:9;17639:17;17630:6;17586:71;:::i;:::-;17667:72;17735:2;17724:9;17720:18;17711:6;17667:72;:::i;:::-;17749;17817:2;17806:9;17802:18;17793:6;17749:72;:::i;:::-;17831;17899:2;17888:9;17884:18;17875:6;17831:72;:::i;:::-;17539:371;;;;;;;:::o;17916:545::-;18089:4;18127:3;18116:9;18112:19;18104:27;;18141:71;18209:1;18198:9;18194:17;18185:6;18141:71;:::i;:::-;18222:68;18286:2;18275:9;18271:18;18262:6;18222:68;:::i;:::-;18300:72;18368:2;18357:9;18353:18;18344:6;18300:72;:::i;:::-;18382;18450:2;18439:9;18435:18;18426:6;18382:72;:::i;:::-;18094:367;;;;;;;:::o;18467:258::-;18578:4;18616:2;18605:9;18601:18;18593:26;;18629:89;18715:1;18704:9;18700:17;18691:6;18629:89;:::i;:::-;18583:142;;;;:::o;18731:313::-;18844:4;18882:2;18871:9;18867:18;18859:26;;18931:9;18925:4;18921:20;18917:1;18906:9;18902:17;18895:47;18959:78;19032:4;19023:6;18959:78;:::i;:::-;18951:86;;18849:195;;;;:::o;19050:419::-;19216:4;19254:2;19243:9;19239:18;19231:26;;19303:9;19297:4;19293:20;19289:1;19278:9;19274:17;19267:47;19331:131;19457:4;19331:131;:::i;:::-;19323:139;;19221:248;;;:::o;19475:419::-;19641:4;19679:2;19668:9;19664:18;19656:26;;19728:9;19722:4;19718:20;19714:1;19703:9;19699:17;19692:47;19756:131;19882:4;19756:131;:::i;:::-;19748:139;;19646:248;;;:::o;19900:419::-;20066:4;20104:2;20093:9;20089:18;20081:26;;20153:9;20147:4;20143:20;20139:1;20128:9;20124:17;20117:47;20181:131;20307:4;20181:131;:::i;:::-;20173:139;;20071:248;;;:::o;20325:419::-;20491:4;20529:2;20518:9;20514:18;20506:26;;20578:9;20572:4;20568:20;20564:1;20553:9;20549:17;20542:47;20606:131;20732:4;20606:131;:::i;:::-;20598:139;;20496:248;;;:::o;20750:419::-;20916:4;20954:2;20943:9;20939:18;20931:26;;21003:9;20997:4;20993:20;20989:1;20978:9;20974:17;20967:47;21031:131;21157:4;21031:131;:::i;:::-;21023:139;;20921:248;;;:::o;21175:419::-;21341:4;21379:2;21368:9;21364:18;21356:26;;21428:9;21422:4;21418:20;21414:1;21403:9;21399:17;21392:47;21456:131;21582:4;21456:131;:::i;:::-;21448:139;;21346:248;;;:::o;21600:419::-;21766:4;21804:2;21793:9;21789:18;21781:26;;21853:9;21847:4;21843:20;21839:1;21828:9;21824:17;21817:47;21881:131;22007:4;21881:131;:::i;:::-;21873:139;;21771:248;;;:::o;22025:419::-;22191:4;22229:2;22218:9;22214:18;22206:26;;22278:9;22272:4;22268:20;22264:1;22253:9;22249:17;22242:47;22306:131;22432:4;22306:131;:::i;:::-;22298:139;;22196:248;;;:::o;22450:419::-;22616:4;22654:2;22643:9;22639:18;22631:26;;22703:9;22697:4;22693:20;22689:1;22678:9;22674:17;22667:47;22731:131;22857:4;22731:131;:::i;:::-;22723:139;;22621:248;;;:::o;22875:419::-;23041:4;23079:2;23068:9;23064:18;23056:26;;23128:9;23122:4;23118:20;23114:1;23103:9;23099:17;23092:47;23156:131;23282:4;23156:131;:::i;:::-;23148:139;;23046:248;;;:::o;23300:419::-;23466:4;23504:2;23493:9;23489:18;23481:26;;23553:9;23547:4;23543:20;23539:1;23528:9;23524:17;23517:47;23581:131;23707:4;23581:131;:::i;:::-;23573:139;;23471:248;;;:::o;23725:419::-;23891:4;23929:2;23918:9;23914:18;23906:26;;23978:9;23972:4;23968:20;23964:1;23953:9;23949:17;23942:47;24006:131;24132:4;24006:131;:::i;:::-;23998:139;;23896:248;;;:::o;24150:419::-;24316:4;24354:2;24343:9;24339:18;24331:26;;24403:9;24397:4;24393:20;24389:1;24378:9;24374:17;24367:47;24431:131;24557:4;24431:131;:::i;:::-;24423:139;;24321:248;;;:::o;24575:419::-;24741:4;24779:2;24768:9;24764:18;24756:26;;24828:9;24822:4;24818:20;24814:1;24803:9;24799:17;24792:47;24856:131;24982:4;24856:131;:::i;:::-;24848:139;;24746:248;;;:::o;25000:419::-;25166:4;25204:2;25193:9;25189:18;25181:26;;25253:9;25247:4;25243:20;25239:1;25228:9;25224:17;25217:47;25281:131;25407:4;25281:131;:::i;:::-;25273:139;;25171:248;;;:::o;25425:419::-;25591:4;25629:2;25618:9;25614:18;25606:26;;25678:9;25672:4;25668:20;25664:1;25653:9;25649:17;25642:47;25706:131;25832:4;25706:131;:::i;:::-;25698:139;;25596:248;;;:::o;25850:419::-;26016:4;26054:2;26043:9;26039:18;26031:26;;26103:9;26097:4;26093:20;26089:1;26078:9;26074:17;26067:47;26131:131;26257:4;26131:131;:::i;:::-;26123:139;;26021:248;;;:::o;26275:419::-;26441:4;26479:2;26468:9;26464:18;26456:26;;26528:9;26522:4;26518:20;26514:1;26503:9;26499:17;26492:47;26556:131;26682:4;26556:131;:::i;:::-;26548:139;;26446:248;;;:::o;26700:419::-;26866:4;26904:2;26893:9;26889:18;26881:26;;26953:9;26947:4;26943:20;26939:1;26928:9;26924:17;26917:47;26981:131;27107:4;26981:131;:::i;:::-;26973:139;;26871:248;;;:::o;27125:419::-;27291:4;27329:2;27318:9;27314:18;27306:26;;27378:9;27372:4;27368:20;27364:1;27353:9;27349:17;27342:47;27406:131;27532:4;27406:131;:::i;:::-;27398:139;;27296:248;;;:::o;27550:419::-;27716:4;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27721:248;;;:::o;27975:419::-;28141:4;28179:2;28168:9;28164:18;28156:26;;28228:9;28222:4;28218:20;28214:1;28203:9;28199:17;28192:47;28256:131;28382:4;28256:131;:::i;:::-;28248:139;;28146:248;;;:::o;28400:419::-;28566:4;28604:2;28593:9;28589:18;28581:26;;28653:9;28647:4;28643:20;28639:1;28628:9;28624:17;28617:47;28681:131;28807:4;28681:131;:::i;:::-;28673:139;;28571:248;;;:::o;28825:222::-;28918:4;28956:2;28945:9;28941:18;28933:26;;28969:71;29037:1;29026:9;29022:17;29013:6;28969:71;:::i;:::-;28923:124;;;;:::o;29053:332::-;29174:4;29212:2;29201:9;29197:18;29189:26;;29225:71;29293:1;29282:9;29278:17;29269:6;29225:71;:::i;:::-;29306:72;29374:2;29363:9;29359:18;29350:6;29306:72;:::i;:::-;29179:206;;;;;:::o;29391:214::-;29480:4;29518:2;29507:9;29503:18;29495:26;;29531:67;29595:1;29584:9;29580:17;29571:6;29531:67;:::i;:::-;29485:120;;;;:::o;29611:99::-;29663:6;29697:5;29691:12;29681:22;;29670:40;;;:::o;29716:169::-;29800:11;29834:6;29829:3;29822:19;29874:4;29869:3;29865:14;29850:29;;29812:73;;;;:::o;29891:148::-;29993:11;30030:3;30015:18;;30005:34;;;;:::o;30045:305::-;30085:3;30104:20;30122:1;30104:20;:::i;:::-;30099:25;;30138:20;30156:1;30138:20;:::i;:::-;30133:25;;30292:1;30224:66;30220:74;30217:1;30214:81;30211:2;;;30298:18;;:::i;:::-;30211:2;30342:1;30339;30335:9;30328:16;;30089:261;;;;:::o;30356:237::-;30394:3;30413:18;30429:1;30413:18;:::i;:::-;30408:23;;30445:18;30461:1;30445:18;:::i;:::-;30440:23;;30535:1;30529:4;30525:12;30522:1;30519:19;30516:2;;;30541:18;;:::i;:::-;30516:2;30585:1;30582;30578:9;30571:16;;30398:195;;;;:::o;30599:185::-;30639:1;30656:20;30674:1;30656:20;:::i;:::-;30651:25;;30690:20;30708:1;30690:20;:::i;:::-;30685:25;;30729:1;30719:2;;30734:18;;:::i;:::-;30719:2;30776:1;30773;30769:9;30764:14;;30641:143;;;;:::o;30790:191::-;30830:4;30850:20;30868:1;30850:20;:::i;:::-;30845:25;;30884:20;30902:1;30884:20;:::i;:::-;30879:25;;30923:1;30920;30917:8;30914:2;;;30928:18;;:::i;:::-;30914:2;30973:1;30970;30966:9;30958:17;;30835:146;;;;:::o;30987:96::-;31024:7;31053:24;31071:5;31053:24;:::i;:::-;31042:35;;31032:51;;;:::o;31089:90::-;31123:7;31166:5;31159:13;31152:21;31141:32;;31131:48;;;:::o;31185:77::-;31222:7;31251:5;31240:16;;31230:32;;;:::o;31268:114::-;31323:7;31352:24;31370:5;31352:24;:::i;:::-;31341:35;;31331:51;;;:::o;31388:126::-;31425:7;31465:42;31458:5;31454:54;31443:65;;31433:81;;;:::o;31520:77::-;31557:7;31586:5;31575:16;;31565:32;;;:::o;31603:86::-;31638:7;31678:4;31671:5;31667:16;31656:27;;31646:43;;;:::o;31695:162::-;31763:9;31796:55;31845:5;31796:55;:::i;:::-;31783:68;;31773:84;;;:::o;31863:131::-;31931:9;31964:24;31982:5;31964:24;:::i;:::-;31951:37;;31941:53;;;:::o;32000:307::-;32068:1;32078:113;32092:6;32089:1;32086:13;32078:113;;;32177:1;32172:3;32168:11;32162:18;32158:1;32153:3;32149:11;32142:39;32114:2;32111:1;32107:10;32102:15;;32078:113;;;32209:6;32206:1;32203:13;32200:2;;;32289:1;32280:6;32275:3;32271:16;32264:27;32200:2;32049:258;;;;:::o;32313:320::-;32357:6;32394:1;32388:4;32384:12;32374:22;;32441:1;32435:4;32431:12;32462:18;32452:2;;32518:4;32510:6;32506:17;32496:27;;32452:2;32580;32572:6;32569:14;32549:18;32546:38;32543:2;;;32599:18;;:::i;:::-;32543:2;32364:269;;;;:::o;32639:233::-;32678:3;32701:24;32719:5;32701:24;:::i;:::-;32692:33;;32747:66;32740:5;32737:77;32734:2;;;32817:18;;:::i;:::-;32734:2;32864:1;32857:5;32853:13;32846:20;;32682:190;;;:::o;32878:167::-;32915:3;32938:22;32954:5;32938:22;:::i;:::-;32929:31;;32982:4;32975:5;32972:15;32969:2;;;32990:18;;:::i;:::-;32969:2;33037:1;33030:5;33026:13;33019:20;;32919:126;;;:::o;33051:79::-;33090:7;33119:5;33108:16;;33098:32;;;:::o;33136:180::-;33184:77;33181:1;33174:88;33281:4;33278:1;33271:15;33305:4;33302:1;33295:15;33322:180;33370:77;33367:1;33360:88;33467:4;33464:1;33457:15;33491:4;33488:1;33481:15;33508:180;33556:77;33553:1;33546:88;33653:4;33650:1;33643:15;33677:4;33674:1;33667:15;33694:102;33735:6;33786:2;33782:7;33777:2;33770:5;33766:14;33762:28;33752:38;;33742:54;;;:::o;33802:222::-;33942:34;33938:1;33930:6;33926:14;33919:58;34011:5;34006:2;33998:6;33994:15;33987:30;33908:116;:::o;34030:221::-;34170:34;34166:1;34158:6;34154:14;34147:58;34239:4;34234:2;34226:6;34222:15;34215:29;34136:115;:::o;34257:225::-;34397:34;34393:1;34385:6;34381:14;34374:58;34466:8;34461:2;34453:6;34449:15;34442:33;34363:119;:::o;34488:221::-;34628:34;34624:1;34616:6;34612:14;34605:58;34697:4;34692:2;34684:6;34680:15;34673:29;34594:115;:::o;34715:229::-;34855:34;34851:1;34843:6;34839:14;34832:58;34924:12;34919:2;34911:6;34907:15;34900:37;34821:123;:::o;34950:214::-;35090:66;35086:1;35078:6;35074:14;35067:90;35056:108;:::o;35170:221::-;35310:34;35306:1;35298:6;35294:14;35287:58;35379:4;35374:2;35366:6;35362:15;35355:29;35276:115;:::o;35397:225::-;35537:34;35533:1;35525:6;35521:14;35514:58;35606:8;35601:2;35593:6;35589:15;35582:33;35503:119;:::o;35628:223::-;35768:34;35764:1;35756:6;35752:14;35745:58;35837:6;35832:2;35824:6;35820:15;35813:31;35734:117;:::o;35857:225::-;35997:34;35993:1;35985:6;35981:14;35974:58;36066:8;36061:2;36053:6;36049:15;36042:33;35963:119;:::o;36088:227::-;36228:34;36224:1;36216:6;36212:14;36205:58;36297:10;36292:2;36284:6;36280:15;36273:35;36194:121;:::o;36321:226::-;36461:34;36457:1;36449:6;36445:14;36438:58;36530:9;36525:2;36517:6;36513:15;36506:34;36427:120;:::o;36553:182::-;36693:34;36689:1;36681:6;36677:14;36670:58;36659:76;:::o;36741:171::-;36881:23;36877:1;36869:6;36865:14;36858:47;36847:65;:::o;36918:227::-;37058:34;37054:1;37046:6;37042:14;37035:58;37127:10;37122:2;37114:6;37110:15;37103:35;37024:121;:::o;37151:220::-;37291:34;37287:1;37279:6;37275:14;37268:58;37360:3;37355:2;37347:6;37343:15;37336:28;37257:114;:::o;37377:178::-;37517:30;37513:1;37505:6;37501:14;37494:54;37483:72;:::o;37561:224::-;37701:34;37697:1;37689:6;37685:14;37678:58;37770:7;37765:2;37757:6;37753:15;37746:32;37667:118;:::o;37791:222::-;37931:34;37927:1;37919:6;37915:14;37908:58;38000:5;37995:2;37987:6;37983:15;37976:30;37897:116;:::o;38019:178::-;38159:30;38155:1;38147:6;38143:14;38136:54;38125:72;:::o;38203:223::-;38343:34;38339:1;38331:6;38327:14;38320:58;38412:6;38407:2;38399:6;38395:15;38388:31;38309:117;:::o;38432:225::-;38572:34;38568:1;38560:6;38556:14;38549:58;38641:8;38636:2;38628:6;38624:15;38617:33;38538:119;:::o;38663:224::-;38803:34;38799:1;38791:6;38787:14;38780:58;38872:7;38867:2;38859:6;38855:15;38848:32;38769:118;:::o;38893:181::-;39033:33;39029:1;39021:6;39017:14;39010:57;38999:75;:::o;39080:122::-;39153:24;39171:5;39153:24;:::i;:::-;39146:5;39143:35;39133:2;;39192:1;39189;39182:12;39133:2;39123:79;:::o;39208:116::-;39278:21;39293:5;39278:21;:::i;:::-;39271:5;39268:32;39258:2;;39314:1;39311;39304:12;39258:2;39248:76;:::o;39330:122::-;39403:24;39421:5;39403:24;:::i;:::-;39396:5;39393:35;39383:2;;39442:1;39439;39432:12;39383:2;39373:79;:::o;39458:158::-;39549:42;39585:5;39549:42;:::i;:::-;39542:5;39539:53;39529:2;;39606:1;39603;39596:12;39529:2;39519:97;:::o;39622:122::-;39695:24;39713:5;39695:24;:::i;:::-;39688:5;39685:35;39675:2;;39734:1;39731;39724:12;39675:2;39665:79;:::o;39750:118::-;39821:22;39837:5;39821:22;:::i;:::-;39814:5;39811:33;39801:2;;39858:1;39855;39848:12;39801:2;39791:77;:::o
Swarm Source
ipfs://dbf57a198d2d7806ce66999da684530b4d67b0f58595dbcfba083196662dc8cd