ERC-20
Healthcare
Overview
Max Total Supply
799,933.246712399962401816 ETI
Holders
42 (0.00%)
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EticaRelease
Compiler Version
v0.5.2+commit.1df8f40c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-11-07 */ pragma solidity ^0.5.2; /* ETICA: a type1 civilization neutral protocol for medical research KEVIN WAD OSSENI */ /* MIT License Copyright © 26/08/2019, KEVIN WAD OSSENI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software. */ // ---------------------------------------------------------------------------- // Safe maths // ---------------------------------------------------------------------------- library SafeMath { function add(uint a, uint b) internal pure returns (uint c) { c = a + b; require(c >= a); } function sub(uint a, uint b) internal pure returns (uint c) { require(b <= a); c = a - b; } function mul(uint a, uint b) internal pure returns (uint c) { c = a * b; require(a == 0 || c / a == b); } function div(uint a, uint b) internal pure returns (uint c) { require(b > 0); c = a / b; } } library ExtendedMath { //return the smaller of the two inputs (a or b) function limitLessThan(uint a, uint b) internal pure returns (uint c) { if(a > b) return b; return a; } } contract ERC20Interface { function totalSupply() public view returns (uint); function balanceOf(address tokenOwner) public view returns (uint balance); function transfer(address to, uint tokens) public returns (bool success); function allowance(address tokenOwner, address spender) public view returns (uint remaining); function approve(address spender, uint tokens) public returns (bool success); function transferFrom(address from, address to, uint tokens) public returns (bool success); event Transfer(address indexed from, address indexed to, uint tokens); event Approval(address indexed tokenOwner, address indexed spender, uint tokens); } contract EticaToken is ERC20Interface{ using SafeMath for uint; using ExtendedMath for uint; string public name = "Etica"; string public symbol = "ETI"; uint public decimals = 18; uint public supply; uint public inflationrate; // fixed inflation rate of phase2 (after Etica supply has reached 21 Million ETI) uint public periodrewardtemp; // Amount of ETI issued per period during phase1 (before Etica supply has reached 21 Million ETI) uint public PERIOD_CURATION_REWARD_RATIO = 38196601125; // 38.196601125% of period reward will be used as curation reward uint public PERIOD_EDITOR_REWARD_RATIO = 61803398875; // 61.803398875% of period reward will be used as editor reward uint public UNRECOVERABLE_ETI; // Etica is a neutral protocol, it has no founder I am only an initiator: string public constant initiatormsg = "Discovering our best Futures. All proposals are made under the Creative Commons license 4.0. Kevin Wad"; mapping(address => uint) public balances; mapping(address => mapping(address => uint)) allowed; // ----------- Mining system state variables ------------ // uint public _totalMiningSupply; uint public latestDifficultyPeriodStarted; uint public epochCount; //number of 'blocks' mined uint public _BLOCKS_PER_READJUSTMENT = 2016; //a little number uint public _MINIMUM_TARGET = 2**2; //a big number is easier ; just find a solution that is smaller //uint public _MAXIMUM_TARGET = 2**224; bitcoin uses 224 //uint public _MAXIMUM_TARGET = 2**242; // used for tests 243 much faster, 242 seems to be the limit where mining gets much harder uint public _MAXIMUM_TARGET = 2**220; // used for prod uint public miningTarget; bytes32 public challengeNumber; //generate a new one when a new reward is minted uint public blockreward; address public lastRewardTo; uint public lastRewardEthBlockNumber; mapping(bytes32 => bytes32) solutionForChallenge; uint public tokensMinted; bytes32 RANDOMHASH; // ----------- Mining system state variables ------------ // event Transfer(address indexed from, address indexed to, uint tokens); event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Mint(address indexed from, uint blockreward, uint epochCount, bytes32 newChallengeNumber); constructor() public{ supply = 100 * (10**18); // initial supply equals 100 ETI balances[address(this)] = balances[address(this)].add(100 * (10**18)); // 100 ETI as the default contract balance. // ------------ PHASE 1 (before 21 Million ETI has been reached) -------------- // /* Phase 1 will last about 10 years: --> 11 550 000 ETI to be distributed through MINING as block reward --> 9 450 000 ETI to be issued during phase 1 as periodrewardtemp for ETICA reward system Phase1 is divided between 10 eras: Each Era will allocate 2 100 000 ETI between mining reward and the staking system reward. Each era is supposed to last about a year but can vary depending on hashrate. Era1: 90% ETI to mining and 10% ETI to Staking | Era2: 80% ETI to mining and 20% ETI to Staking Era3: 70% ETI to mining and 30% ETI to Staking | Era4: 60% ETI to mining and 40% ETI to Staking Era5: 50% ETI to mining and 50% ETI to Staking | Era6: 50% ETI to mining and 50% ETI to Staking Era7: 50% ETI to mining and 50% ETI to Staking | Era8: 50% ETI to mining and 50% ETI to Staking Era9: 50% ETI to mining and 50% ETI to Staking | Era10: 50% ETI to mining and 50% ETI to Staking Era1: 1 890 000 ETI as mining reward and 210 000 ETI as Staking reward Era2: 1 680 000 ETI as mining reward and 420 000 ETI as Staking reward Era3: 1 470 000 ETI as mining reward and 630 000 ETI as Staking reward Era4: 1 260 000 ETI as mining reward and 840 000 ETI as Staking reward From Era5 to era10: 1 050 000 ETI as mining reward and 1 050 000 ETI as Staking reward */ // --- STAKING REWARD --- // // periodrewardtemp: It is the temporary ETI issued per period (7 days) as reward of Etica System during phase 1. (Will be replaced by dynamic inflation of golden number at phase 2) // Calculation of initial periodrewardtemp: // 210 000 / 52.1429 = 4027.3939500871643119; ETI per week periodrewardtemp = 4027393950087164311900; // 4027.393950087164311900 ETI per period (7 days) for era1 // --- STAKING REWARD --- // // --- MINING REWARD --- // _totalMiningSupply = 11550000 * 10**uint(decimals); tokensMinted = 0; // Calculation of initial blockreward: // 1 890 000 / 52.1429 = 36246.5455507844788073; ETI per week // amounts to 5178.0779358263541153286 ETI per day; // amounts to 215.7532473260980881386917 ETI per hour; // amounts to 35.9588745543496813564486167 ETI per block for era1 of phase1; blockreward = 35958874554349681356; miningTarget = _MAXIMUM_TARGET; latestDifficultyPeriodStarted = block.timestamp; _startNewMiningEpoch(); // --- MINING REWARD --- // // ------------ PHASE 1 (before 21 Million ETI has been reached) -------------- // // ------------ PHASE 2 (after the first 21 Million ETI have been issued) -------------- // // Golden number power 2: 1,6180339887498948482045868343656 * 1,6180339887498948482045868343656 = 2.6180339887498948482045868343656; // Thus yearly inflation target is 2.6180339887498948482045868343656% // inflationrate calculation: // Each Period is 7 days, so we need to get a weekly inflationrate from the yearlyinflationrate target (1.026180339887498948482045868343656): // 1.026180339887498948482045868343656 ^(1 / 52.1429) = 1,0004957512263080183722688891602; // 1,0004957512263080183722688891602 - 1 = 0,0004957512263080183722688891602; // Hence weekly inflationrate is 0,04957512263080183722688891602% inflationrate = 4957512263080183722688891602; // (need to multiple by 10^(-31) to get 0,0004957512263080183722688891602; // ------------ PHASE 2 (after the first 21 Million ETI have been issued) -------------- // //The creator gets nothing! The only way to earn Etica is to mine it or earn it as protocol reward //balances[creator] = _totalMiningSupply; //Transfer(address(0), creator, _totalMiningSupply); } function allowance(address tokenOwner, address spender) view public returns(uint){ return allowed[tokenOwner][spender]; } //approve allowance function approve(address spender, uint tokens) public returns(bool){ require(balances[msg.sender] >= tokens); require(tokens > 0); allowed[msg.sender][spender] = tokens; emit Approval(msg.sender, spender, tokens); return true; } //transfer tokens from the owner account to the account that calls the function function transferFrom(address from, address to, uint tokens) public returns(bool){ balances[from] = balances[from].sub(tokens); allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens); balances[to] = balances[to].add(tokens); emit Transfer(from, to, tokens); return true; } function totalSupply() public view returns (uint){ return supply; } function accessibleSupply() public view returns (uint){ return supply.sub(UNRECOVERABLE_ETI); } function balanceOf(address tokenOwner) public view returns (uint balance){ return balances[tokenOwner]; } function transfer(address to, uint tokens) public returns (bool success){ require(tokens > 0); balances[msg.sender] = balances[msg.sender].sub(tokens); balances[to] = balances[to].add(tokens); emit Transfer(msg.sender, to, tokens); return true; } // ------------- Mining system functions ---------------- // function mint(uint256 nonce, bytes32 challenge_digest) public returns (bool success) { //the PoW must contain work that includes a recent ethereum block hash (challenge number) and the msg.sender's address to prevent MITM attacks bytes32 digest = keccak256(abi.encodePacked(challengeNumber, msg.sender, nonce)); //the challenge digest must match the expected if (digest != challenge_digest) revert(); //the digest must be smaller than the target if(uint256(digest) > miningTarget) revert(); //only allow one reward for each challenge bytes32 solution = solutionForChallenge[challengeNumber]; solutionForChallenge[challengeNumber] = digest; if(solution != 0x0) revert(); //prevent the same answer from awarding twice if(tokensMinted > 1890000 * 10**uint(decimals)){ if(tokensMinted >= 6300000 * 10**uint(decimals)) { // 6 300 000 = 5 040 000 + 1 260 000; //era5 to era10 blockreward = 19977152530194267420; // 19.977152530194267420 per block (amounts to 1050000 ETI a year) periodrewardtemp = 20136969750435821559600; // from era5 to era 10: 20136.9697504358215596 ETI per week } else if (tokensMinted < 3570000 * 10**uint(decimals)) { // 3 570 000 = 1 890 000 + 1 680 000; // era2 blockreward = 31963444048310827872; // 31.963444048310827872 ETI per block (amounts to 1680000 ETI a year) periodrewardtemp = 8054787900174328623800; // era2 8054.787900174328623800 ETI per week } else if (tokensMinted < 5040000 * 10**uint(decimals)) { // 5 040 000 = 3 570 000 + 1 470 000; //era3 blockreward = 27968013542271974388; // 27.968013542271974388 ETI per block (amounts to 1470000 ETI a year) periodrewardtemp = 12082181850261492935800; // era3 12082.181850261492935800 ETI per week } else { // era4 blockreward = 23972583036233120904; // 23.972583036233120904 per block (amounts to 1260000 ETI a year) periodrewardtemp = 16109575800348657247700; // era4 16109.575800348657247700 ETI per week } } tokensMinted = tokensMinted.add(blockreward); //Cannot mint more tokens than there are: maximum ETI ever mined: _totalMiningSupply assert(tokensMinted < _totalMiningSupply); supply = supply.add(blockreward); balances[msg.sender] = balances[msg.sender].add(blockreward); //set readonly diagnostics data lastRewardTo = msg.sender; lastRewardEthBlockNumber = block.number; _startNewMiningEpoch(); emit Mint(msg.sender, blockreward, epochCount, challengeNumber ); emit Transfer(address(this), msg.sender,blockreward); return true; } //a new 'block' to be mined function _startNewMiningEpoch() internal { epochCount = epochCount.add(1); //every so often, readjust difficulty. Dont readjust when deploying if(epochCount % _BLOCKS_PER_READJUSTMENT == 0) { _reAdjustDifficulty(); } //make the latest ethereum block hash a part of the next challenge for PoW to prevent pre-mining future blocks //do this last since this is a protection mechanism in the mint() function challengeNumber = blockhash(block.number.sub(1)); challengeNumber = keccak256(abi.encode(challengeNumber, RANDOMHASH)); // updates challengeNumber with merged mining protection } //readjust the target with same rules as bitcoin function _reAdjustDifficulty() internal { uint _oldtarget = miningTarget; // should get as close as possible to (2016 * 10 minutes) seconds => 1 209 600 seconds uint ethTimeSinceLastDifficultyPeriod = block.timestamp.sub(latestDifficultyPeriodStarted); //we want miners to spend 10 minutes to mine each 'block' uint targetTimePerDiffPeriod = _BLOCKS_PER_READJUSTMENT.mul(10 minutes); //Target is 1 209 600 seconds. (2016 * 10 minutes) seconds to mine _BLOCKS_PER_READJUSTMENT blocks of ETI. //if there were less ethereum seconds-timestamp than expected, make it harder if( ethTimeSinceLastDifficultyPeriod < targetTimePerDiffPeriod ) { // New Mining Difficulty = Previous Mining Difficulty * (Time To Mine Last 2016 blocks / 1 209 600 seconds) miningTarget = miningTarget.mul(ethTimeSinceLastDifficultyPeriod).div(targetTimePerDiffPeriod); // the maximum factor of 4 will be applied as in bitcoin if(miningTarget < _oldtarget.div(4)){ //make it harder miningTarget = _oldtarget.div(4); } }else{ // New Mining Difficulty = Previous Mining Difficulty * (Time To Mine Last 2016 blocks / 1 209 600 seconds) miningTarget = miningTarget.mul(ethTimeSinceLastDifficultyPeriod).div(targetTimePerDiffPeriod); // the maximum factor of 4 will be applied as in bitcoin if(miningTarget > _oldtarget.mul(4)){ //make it easier miningTarget = _oldtarget.mul(4); } } latestDifficultyPeriodStarted = block.timestamp; if(miningTarget < _MINIMUM_TARGET) //very difficult { miningTarget = _MINIMUM_TARGET; } if(miningTarget > _MAXIMUM_TARGET) //very easy { miningTarget = _MAXIMUM_TARGET; } } //this is a recent ethereum block hash, used to prevent pre-mining future blocks function getChallengeNumber() public view returns (bytes32) { return challengeNumber; } //the number of zeroes the digest of the PoW solution requires. Auto adjusts function getMiningDifficulty() public view returns (uint) { return _MAXIMUM_TARGET.div(miningTarget); } function getMiningTarget() public view returns (uint) { return miningTarget; } //mining reward only if the protocol didnt reach the max ETI supply that can be ever mined: function getMiningReward() public view returns (uint) { if(tokensMinted <= _totalMiningSupply){ return blockreward; } else { return 0; } } //help debug mining software function getMintDigest(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number) public view returns (bytes32 digesttest) { bytes32 digest = keccak256(abi.encodePacked(challenge_number,msg.sender,nonce)); return digest; } //help debug mining software function checkMintSolution(uint256 nonce, bytes32 challenge_digest, bytes32 challenge_number, uint testTarget) public view returns (bool success) { bytes32 digest = keccak256(abi.encodePacked(challenge_number,msg.sender,nonce)); if(uint256(digest) > testTarget) revert(); return (digest == challenge_digest); } // ------------------ Mining system functions ------------------------- // // ------------------------------------------------------------------------ // Don't accept ETH // ------------------------------------------------------------------------ function () payable external { revert(); } } contract EticaRelease is EticaToken { /* --------- PROD VALUES ------------- */ uint public REWARD_INTERVAL = 7 days; // periods duration 7 jours uint public STAKING_DURATION = 28 days; // default stake duration 28 jours uint public DEFAULT_VOTING_TIME = 21 days; // default voting duration 21 days uint public DEFAULT_REVEALING_TIME = 7 days; // default revealing duration 7 days /* --------- PROD VALUES ------------- */ /* --------- TESTING VALUES ------------- uint public REWARD_INTERVAL = 1 minutes; // periods duration 7 jours uint public STAKING_DURATION = 4 minutes; // default stake duration 28 jours uint public DEFAULT_VOTING_TIME = 3 minutes; // default voting duration 21 days uint public DEFAULT_REVEALING_TIME = 1 minutes; // default revealing duration 7 days --------- TESTING VALUES -------------*/ uint public DISEASE_CREATION_AMOUNT = 100 * 10**uint(decimals); // 100 ETI amount to pay for creating a new disease. Necessary in order to avoid spam. Will create a function that periodically increase it in order to take into account inflation uint public PROPOSAL_DEFAULT_VOTE = 10 * 10**uint(decimals); // 10 ETI amount to vote for creating a new proposal. Necessary in order to avoid spam. Will create a function that periodically increase it in order to take into account inflation uint public APPROVAL_THRESHOLD = 5000; // threshold for proposal to be accepted. 5000 means 50.00 %, 6000 would mean 60.00% uint public PERIODS_PER_THRESHOLD = 5; // number of Periods before readjusting APPROVAL_THRESHOLD uint public SEVERITY_LEVEL = 4; // level of severity of the protocol, the higher the more slash to wrong voters uint public PROPOSERS_INCREASER = 3; // the proposers should get more slashed than regular voters to avoid spam, the higher this var the more severe the protocol will be against bad proposers uint public PROTOCOL_RATIO_TARGET = 7250; // 7250 means the Protocol has a goal of 72.50% proposals approved and 27.5% proposals rejected uint public LAST_PERIOD_COST_UPDATE = 0; struct Period{ uint id; uint interval; uint curation_sum; // used for proposals weight system uint editor_sum; // used for proposals weight system uint reward_for_curation; // total ETI issued to be used as Period reward for Curation uint reward_for_editor; // total ETI issued to be used as Period reward for Editor uint forprops; // number of accepted proposals in this period uint againstprops; // number of rejected proposals in this period } struct Stake{ uint amount; uint endTime; // Time when the stake will be claimable } // ----------- PROPOSALS STRUCTS ------------ // // general information of Proposal: struct Proposal{ uint id; bytes32 proposed_release_hash; // Hash of "raw_release_hash + name of Disease" bytes32 disease_id; uint period_id; uint chunk_id; address proposer; // address of the proposer string title; // Title of the Proposal string description; // Description of the Proposal string freefield; string raw_release_hash; } // main data of Proposal: struct ProposalData{ uint starttime; // epoch time of the proposal uint endtime; // voting limite uint finalized_time; // when first clmpropbyhash() was called ProposalStatus status; // Only updates once, when the voting process is over ProposalStatus prestatus; // Updates During voting process bool istie; // will be initialized with value 0. if prop is tie it won't slash nor reward participants uint nbvoters; uint slashingratio; // solidity does not support float type. So will emulate float type by using uint uint forvotes; uint againstvotes; uint lastcuration_weight; // period curation weight of proposal uint lasteditor_weight; // period editor weight of proposal } // ----------- PROPOSALS STRUCTS ------------ // // ----------- CHUNKS STRUCTS ------------ // struct Chunk{ uint id; bytes32 diseaseid; // hash of the disease uint idx; string title; string desc; } // ----------- CHUNKS STRUCTS ------------ // // ----------- VOTES STRUCTS ---------------- // struct Vote{ bytes32 proposal_hash; // proposed_release_hash of proposal bool approve; bool is_editor; uint amount; address voter; // address of the voter uint timestamp; // epoch time of the vote bool is_claimed; // keeps track of whether or not vote has been claimed to avoid double claim on same vote } struct Commit{ uint amount; uint timestamp; // epoch time of the vote } // ----------- VOTES STRUCTS ---------------- // // ----------- DISEASES STRUCTS ---------------- // struct Disease{ bytes32 disease_hash; string name; } // ----------- DISEASES STRUCTS ---------------- // enum ProposalStatus { Rejected, Accepted, Pending, Singlevoter } mapping(uint => Period) public periods; uint public periodsCounter; mapping(uint => uint) public PeriodsIssued; // keeps track of which periods have already issued ETI uint public PeriodsIssuedCounter; mapping(uint => uint) public IntervalsPeriods; // keeps track of which intervals have already a period uint public IntervalsPeriodsCounter; mapping(uint => Disease) public diseases; // keeps track of which intervals have already a period uint public diseasesCounter; mapping(bytes32 => uint) public diseasesbyIds; // get disease.index by giving its disease_hash: example: [leiojej757575ero] => [0] where leiojej757575ero is disease_hash of a Disease mapping(string => bytes32) private diseasesbyNames; // get disease.disease_hash by giving its name: example: ["name of a disease"] => [leiojej757575ero] where leiojej757575ero is disease_hash of a Disease. Set visibility to private because mapping with strings as keys have issues when public visibility mapping(bytes32 => mapping(uint => bytes32)) public diseaseproposals; // mapping of mapping of all proposals for a disease mapping(bytes32 => uint) public diseaseProposalsCounter; // keeps track of how many proposals for each disease // ----------- PROPOSALS MAPPINGS ------------ // mapping(bytes32 => Proposal) public proposals; mapping(uint => bytes32) public proposalsbyIndex; // get proposal.proposed_release_hash by giving its id (index): example: [2] => [huhihgfytoouhi] where huhihgfytoouhi is proposed_release_hash of a Proposal uint public proposalsCounter; mapping(bytes32 => ProposalData) public propsdatas; // ----------- PROPOSALS MAPPINGS ------------ // // ----------- CHUNKS MAPPINGS ---------------- // mapping(uint => Chunk) public chunks; uint public chunksCounter; mapping(bytes32 => mapping(uint => uint)) public diseasechunks; // chunks of a disease mapping(uint => mapping(uint => bytes32)) public chunkproposals; // proposals of a chunk mapping(bytes32 => uint) public diseaseChunksCounter; // keeps track of how many chunks for each disease mapping(uint => uint) public chunkProposalsCounter; // keeps track of how many proposals for each chunk // ----------- CHUNKS MAPPINGS ---------------- // // ----------- VOTES MAPPINGS ---------------- // mapping(bytes32 => mapping(address => Vote)) public votes; mapping(address => mapping(bytes32 => Commit)) public commits; // ----------- VOTES MAPPINGS ---------------- // mapping(address => uint) public bosoms; mapping(address => mapping(uint => Stake)) public stakes; mapping(address => uint) public stakesCounters; // keeps track of how many stakes for each user mapping(address => uint) public stakesAmount; // keeps track of total amount of stakes for each user // Blocked ETI amount, user has votes with this amount in process and can't retrieve this amount before the system knows if the user has to be slahed mapping(address => uint) public blockedeticas; // ---------- EVENTS ----------- // event CreatedPeriod(uint indexed period_id, uint interval); event NewDisease(uint indexed diseaseindex, string title); event NewProposal(bytes32 proposed_release_hash, address indexed _proposer, bytes32 indexed diseasehash, uint indexed chunkid); event NewChunk(uint indexed chunkid, bytes32 indexed diseasehash); event RewardClaimed(address indexed voter, uint amount, bytes32 proposal_hash); event NewFee(address indexed voter, uint fee, bytes32 proposal_hash); event NewSlash(address indexed voter, uint duration, bytes32 proposal_hash); event NewCommit(address indexed _voter, bytes32 votehash); event NewReveal(address indexed _voter, bytes32 indexed _proposal); event NewStake(address indexed staker, uint amount); event StakeClaimed(address indexed staker, uint stakeamount); // ----------- EVENTS ---------- // // ------------- PUBLISHING SYSTEM REWARD FUNCTIONS ---------------- // function issue(uint _id) internal returns (bool success) { // we check whether there is at least one period require(periodsCounter > 0); // we check that the period exists require(_id > 0 && _id <= periodsCounter); // we retrieve the period Period storage period = periods[_id]; // we check that the period is legit and has been retrieved require(period.id != 0); //only allow one issuance for each period uint rwd = PeriodsIssued[period.id]; if(rwd != 0x0) revert(); //prevent the same period from issuing twice uint _periodsupply; // Phase 2 (after 21 000 000 ETI has been reached) if(supply >= 21000000 * 10**(decimals)){ _periodsupply = uint((supply.mul(inflationrate)).div(10**(31))); } // Phase 1 (before 21 000 000 ETI has been reached) else { _periodsupply = periodrewardtemp; } // update Period Reward: period.reward_for_curation = uint((_periodsupply.mul(PERIOD_CURATION_REWARD_RATIO)).div(10**(11))); period.reward_for_editor = uint((_periodsupply.mul(PERIOD_EDITOR_REWARD_RATIO)).div(10**(11))); supply = supply.add(_periodsupply); balances[address(this)] = balances[address(this)].add(_periodsupply); PeriodsIssued[period.id] = _periodsupply; PeriodsIssuedCounter = PeriodsIssuedCounter.add(1); return true; } // create a period function newPeriod() internal { uint _interval = uint((block.timestamp).div(REWARD_INTERVAL)); //only allow one period for each interval uint rwd = IntervalsPeriods[_interval]; if(rwd != 0x0) revert(); //prevent the same interval from having 2 periods periodsCounter = periodsCounter.add(1); // store this interval period periods[periodsCounter] = Period( periodsCounter, _interval, 0x0, //_curation_sum 0x0, //_editor_sum 0x0, //_reward_for_curation 0x0, //_reward_for_editor 0x0, // _forprops 0x0 //_againstprops ); // an interval cannot have 2 Periods IntervalsPeriods[_interval] = periodsCounter; IntervalsPeriodsCounter = IntervalsPeriodsCounter.add(1); // issue ETI for this Period Reward issue(periodsCounter); //readjust APPROVAL_THRESHOLD every PERIODS_PER_THRESHOLD periods: if((periodsCounter.sub(1)) % PERIODS_PER_THRESHOLD == 0 && periodsCounter > 1) { readjustThreshold(); } emit CreatedPeriod(periodsCounter, _interval); } function readjustThreshold() internal { uint _meanapproval = 0; uint _totalfor = 0; // total of proposals accepetd uint _totalagainst = 0; // total of proposals rejected // calculate the mean approval rate (forprops / againstprops) of last PERIODS_PER_THRESHOLD Periods: for(uint _periodidx = periodsCounter.sub(PERIODS_PER_THRESHOLD); _periodidx <= periodsCounter.sub(1); _periodidx++){ _totalfor = _totalfor.add(periods[_periodidx].forprops); _totalagainst = _totalagainst.add(periods[_periodidx].againstprops); } if(_totalfor.add(_totalagainst) == 0){ _meanapproval = 5000; } else{ _meanapproval = uint(_totalfor.mul(10000).div(_totalfor.add(_totalagainst))); } // increase or decrease APPROVAL_THRESHOLD based on comparason between _meanapproval and PROTOCOL_RATIO_TARGET: // if there were not enough approvals: if( _meanapproval < PROTOCOL_RATIO_TARGET ) { uint shortage_approvals_rate = (PROTOCOL_RATIO_TARGET.sub(_meanapproval)); // require lower APPROVAL_THRESHOLD for next period: APPROVAL_THRESHOLD = uint(APPROVAL_THRESHOLD.sub(((APPROVAL_THRESHOLD.sub(4500)).mul(shortage_approvals_rate)).div(10000))); // decrease by up to 27.50 % of (APPROVAL_THRESHOLD - 45) }else{ uint excess_approvals_rate = uint((_meanapproval.sub(PROTOCOL_RATIO_TARGET))); // require higher APPROVAL_THRESHOLD for next period: APPROVAL_THRESHOLD = uint(APPROVAL_THRESHOLD.add(((10000 - APPROVAL_THRESHOLD).mul(excess_approvals_rate)).div(10000))); // increase by up to 27.50 % of (100 - APPROVAL_THRESHOLD) } if(APPROVAL_THRESHOLD < 4500) // high discouragement to vote against proposals { APPROVAL_THRESHOLD = 4500; } if(APPROVAL_THRESHOLD > 9900) // high discouragement to vote for proposals { APPROVAL_THRESHOLD = 9900; } } // ------------- PUBLISHING SYSTEM REWARD FUNCTIONS ---------------- // // -------------------- STAKING ----------------------- // // eticatobosoms(): Stake etica in exchange for bosom function eticatobosoms(address _staker, uint _amount) public returns (bool success){ require(msg.sender == _staker); require(_amount > 0); // even if transfer require amount > 0 I prefer checking for more security and very few more gas // transfer _amount ETI from staker wallet to contract balance: transfer(address(this), _amount); // Get bosoms and add Stake bosomget(_staker, _amount); return true; } // ---- Get bosoms ------ // //bosomget(): Get bosoms and add Stake. Only contract is able to call this function: function bosomget (address _staker, uint _amount) internal { addStake(_staker, _amount); bosoms[_staker] = bosoms[_staker].add(_amount); } // ---- Get bosoms ------ // // ---- add Stake ------ // function addStake(address _staker, uint _amount) internal returns (bool success) { require(_amount > 0); stakesCounters[_staker] = stakesCounters[_staker].add(1); // notice that first stake will have the index of 1 thus not 0 ! // increase variable that keeps track of total value of user's stakes stakesAmount[_staker] = stakesAmount[_staker].add(_amount); uint endTime = block.timestamp.add(STAKING_DURATION); // store this stake in _staker's stakes with the index stakesCounters[_staker] stakes[_staker][stakesCounters[_staker]] = Stake( _amount, // stake amount endTime // endTime ); emit NewStake(_staker, _amount); return true; } function addConsolidation(address _staker, uint _amount, uint _endTime) internal returns (bool success) { require(_amount > 0); stakesCounters[_staker] = stakesCounters[_staker].add(1); // notice that first stake will have the index of 1 thus not 0 ! // increase variable that keeps track of total value of user's stakes stakesAmount[_staker] = stakesAmount[_staker].add(_amount); // store this stake in _staker's stakes with the index stakesCounters[_staker] stakes[_staker][stakesCounters[_staker]] = Stake( _amount, // stake amount _endTime // endTime ); emit NewStake(_staker, _amount); return true; } // ---- add Stake ------ // // ---- split Stake ------ // function splitStake(address _staker, uint _amount, uint _endTime) internal returns (bool success) { require(_amount > 0); stakesCounters[_staker] = stakesCounters[_staker].add(1); // notice that first stake will have the index of 1 thus not 0 ! // store this stake in _staker's stakes with the index stakesCounters[_staker] stakes[_staker][stakesCounters[_staker]] = Stake( _amount, // stake amount _endTime // endTime ); return true; } // ---- split Stake ------ // // ---- Redeem a Stake ------ // //stakeclmidx(): redeem a stake by its index function stakeclmidx (uint _stakeidx) public { // we check that the stake exists require(_stakeidx > 0 && _stakeidx <= stakesCounters[msg.sender]); // we retrieve the stake Stake storage _stake = stakes[msg.sender][_stakeidx]; // The stake must be over require(block.timestamp > _stake.endTime); // the amount to be unstaked must be less or equal to the amount of ETI currently marked as blocked in blockedeticas as they need to go through the clmpropbyhash before being unstaked ! require(_stake.amount <= stakesAmount[msg.sender].sub(blockedeticas[msg.sender])); // transfer back ETI from contract to staker: balances[address(this)] = balances[address(this)].sub(_stake.amount); balances[msg.sender] = balances[msg.sender].add(_stake.amount); emit Transfer(address(this), msg.sender, _stake.amount); emit StakeClaimed(msg.sender, _stake.amount); // deletes the stake _deletestake(msg.sender, _stakeidx); } // ---- Redeem a Stake ------ // // ---- Remove a Stake ------ // function _deletestake(address _staker,uint _index) internal { // we check that the stake exists require(_index > 0 && _index <= stakesCounters[_staker]); // decrease variable that keeps track of total value of user's stakes stakesAmount[_staker] = stakesAmount[_staker].sub(stakes[_staker][_index].amount); // replace value of stake to be deleted by value of last stake stakes[_staker][_index] = stakes[_staker][stakesCounters[_staker]]; // remove last stake stakes[_staker][stakesCounters[_staker]] = Stake( 0x0, // amount 0x0 // endTime ); // updates stakesCounter of _staker stakesCounters[_staker] = stakesCounters[_staker].sub(1); } // ---- Remove a Stake ------ // // ----- Stakes consolidation ----- // // slashing function needs to loop through stakes. Can create issues for claiming votes: // The function stakescsldt() has been created to consolidate (gather) stakes when user has too much stakes function stakescsldt(uint _endTime, uint _min_limit, uint _maxidx) public { // security to avoid blocking ETI by front end apps that could call function with too high _endTime: require(_endTime < block.timestamp.add(730 days)); // _endTime cannot be more than two years ahead // _maxidx must be less or equal to nb of stakes and we set a limit for loop of 50: require(_maxidx <= 50 && _maxidx <= stakesCounters[msg.sender]); uint newAmount = 0; uint _nbdeletes = 0; uint _currentidx = 1; for(uint _stakeidx = 1; _stakeidx <= _maxidx; _stakeidx++) { // only consolidates if account nb of stakes >= 2 : if(stakesCounters[msg.sender] >= 2){ if(_stakeidx <= stakesCounters[msg.sender]){ _currentidx = _stakeidx; } else { // if _stakeidx > stakesCounters[msg.sender] it means the _deletestake() function has pushed the next stakes at the begining: _currentidx = _stakeidx.sub(_nbdeletes); //Notice: initial stakesCounters[msg.sender] = stakesCounters[msg.sender] + _nbdeletes. //So "_stackidx <= _maxidx <= initial stakesCounters[msg.sender]" ===> "_stakidx <= stakesCounters[msg.sender] + _nbdeletes" ===> "_stackidx - _nbdeletes <= stakesCounters[msg.sender]" assert(_currentidx >= 1); // makes sure _currentidx is within existing stakes range } //if stake should end sooner than _endTime it can be consolidated into a stake that end latter: // Plus we check the stake.endTime is above the minimum limit the user is willing to consolidate. For instance user doesn't want to consolidate a stake that is ending tomorrow if(stakes[msg.sender][_currentidx].endTime <= _endTime && stakes[msg.sender][_currentidx].endTime >= _min_limit) { newAmount = newAmount.add(stakes[msg.sender][_currentidx].amount); _deletestake(msg.sender, _currentidx); _nbdeletes = _nbdeletes.add(1); } } } if (newAmount > 0){ // creates the new Stake addConsolidation(msg.sender, newAmount, _endTime); } } // ----- Stakes consolidation ----- // // ----- Stakes de-consolidation ----- // // this function is necessary because if user has a stake with huge amount and has blocked few ETI then he can't claim the Stake because // stake.amount > StakesAmount - blockedeticas function stakesnap(uint _stakeidx, uint _snapamount) public { require(_snapamount > 0); // we check that the stake exists require(_stakeidx > 0 && _stakeidx <= stakesCounters[msg.sender]); // we retrieve the stake Stake storage _stake = stakes[msg.sender][_stakeidx]; // the stake.amount must be higher than _snapamount: require(_stake.amount > _snapamount); // calculate the amount of new stake: uint _restAmount = _stake.amount.sub(_snapamount); // updates the stake amount: _stake.amount = _snapamount; // ----- creates a new stake with the rest -------- // stakesCounters[msg.sender] = stakesCounters[msg.sender].add(1); // store this stake in _staker's stakes with the index stakesCounters[_staker] stakes[msg.sender][stakesCounters[msg.sender]] = Stake( _restAmount, // stake amount _stake.endTime // endTime ); // ------ creates a new stake with the rest ------- // assert(_restAmount > 0); } // ----- Stakes de-consolidation ----- // function stakescount(address _staker) public view returns (uint slength){ return stakesCounters[_staker]; } // ----------------- STAKING ------------------ // // ------------- PUBLISHING SYSTEM CORE FUNCTIONS ---------------- // function createdisease(string memory _name) public { // --- REQUIRE PAYMENT FOR ADDING A DISEASE TO CREATE A BARRIER TO ENTRY AND AVOID SPAM --- // // make sure the user has enough ETI to create a disease require(balances[msg.sender] >= DISEASE_CREATION_AMOUNT); // transfer DISEASE_CREATION_AMOUNT ETI from user wallet to contract wallet: transfer(address(this), DISEASE_CREATION_AMOUNT); UNRECOVERABLE_ETI = UNRECOVERABLE_ETI.add(DISEASE_CREATION_AMOUNT); // --- REQUIRE PAYMENT FOR ADDING A DISEASE TO CREATE A BARRIER TO ENTRY AND AVOID SPAM --- // bytes32 _diseasehash = keccak256(abi.encode(_name)); diseasesCounter = diseasesCounter.add(1); // notice that first disease will have the index of 1 thus not 0 ! //check: if the disease is new we continue, otherwise we exit if(diseasesbyIds[_diseasehash] != 0x0) revert(); //prevent the same disease from being created twice. The software manages diseases uniqueness based on their unique english name. Note that even the first disease will not have index of 0 thus should pass this check require(diseasesbyNames[_name] == 0); // make sure it is not overwriting another disease thanks to unexpected string tricks from user // store the Disease diseases[diseasesCounter] = Disease( _diseasehash, _name ); // Updates diseasesbyIds and diseasesbyNames mappings: diseasesbyIds[_diseasehash] = diseasesCounter; diseasesbyNames[_name] = _diseasehash; emit NewDisease(diseasesCounter, _name); } function propose(bytes32 _diseasehash, string memory _title, string memory _description, string memory raw_release_hash, string memory _freefield, uint _chunkid) public { //check if the disease exits require(diseasesbyIds[_diseasehash] > 0 && diseasesbyIds[_diseasehash] <= diseasesCounter); if(diseases[diseasesbyIds[_diseasehash]].disease_hash != _diseasehash) revert(); // second check not necessary but I decided to add it as the gas cost value for security is worth it require(_chunkid <= chunksCounter); bytes32 _proposed_release_hash = keccak256(abi.encode(raw_release_hash, _diseasehash)); diseaseProposalsCounter[_diseasehash] = diseaseProposalsCounter[_diseasehash].add(1); diseaseproposals[_diseasehash][diseaseProposalsCounter[_diseasehash]] = _proposed_release_hash; proposalsCounter = proposalsCounter.add(1); // notice that first proposal will have the index of 1 thus not 0 ! proposalsbyIndex[proposalsCounter] = _proposed_release_hash; // Check that proposal does not already exist // only allow one proposal for each {raw_release_hash, _diseasehash} combinasion bytes32 existing_proposal = proposals[_proposed_release_hash].proposed_release_hash; if(existing_proposal != 0x0 || proposals[_proposed_release_hash].id != 0) revert(); //prevent the same raw_release_hash from being submited twice on same proposal. Double check for better security and slightly higher gas cost even though one would be enough ! uint _current_interval = uint((block.timestamp).div(REWARD_INTERVAL)); // Create new Period if this current interval did not have its Period created yet if(IntervalsPeriods[_current_interval] == 0x0){ newPeriod(); } Proposal storage proposal = proposals[_proposed_release_hash]; proposal.id = proposalsCounter; proposal.disease_id = _diseasehash; // _diseasehash has already been checked to equal diseases[diseasesbyIds[_diseasehash]].disease_hash proposal.period_id = IntervalsPeriods[_current_interval]; proposal.proposed_release_hash = _proposed_release_hash; // Hash of "raw_release_hash + name of Disease", proposal.proposer = msg.sender; proposal.title = _title; proposal.description = _description; proposal.raw_release_hash = raw_release_hash; proposal.freefield = _freefield; // Proposal Data: ProposalData storage proposaldata = propsdatas[_proposed_release_hash]; proposaldata.status = ProposalStatus.Pending; proposaldata.istie = true; proposaldata.prestatus = ProposalStatus.Pending; proposaldata.nbvoters = 0; proposaldata.slashingratio = 0; proposaldata.forvotes = 0; proposaldata.againstvotes = 0; proposaldata.lastcuration_weight = 0; proposaldata.lasteditor_weight = 0; proposaldata.starttime = block.timestamp; proposaldata.endtime = block.timestamp.add(DEFAULT_VOTING_TIME); // --- REQUIRE DEFAULT VOTE TO CREATE A BARRIER TO ENTRY AND AVOID SPAM --- // require(bosoms[msg.sender] >= PROPOSAL_DEFAULT_VOTE); // this check is not mandatory as handled by safemath sub function: (bosoms[msg.sender].sub(PROPOSAL_DEFAULT_VOTE)) // Consume bosom: bosoms[msg.sender] = bosoms[msg.sender].sub(PROPOSAL_DEFAULT_VOTE); // Block Eticas in eticablkdtbl to prevent user from unstaking before eventual slash blockedeticas[msg.sender] = blockedeticas[msg.sender].add(PROPOSAL_DEFAULT_VOTE); // store vote: Vote storage vote = votes[proposal.proposed_release_hash][msg.sender]; vote.proposal_hash = proposal.proposed_release_hash; vote.approve = true; vote.is_editor = true; vote.amount = PROPOSAL_DEFAULT_VOTE; vote.voter = msg.sender; vote.timestamp = block.timestamp; // UPDATE PROPOSAL: proposaldata.prestatus = ProposalStatus.Singlevoter; // if chunk exists and belongs to disease updates proposal.chunk_id: uint existing_chunk = chunks[_chunkid].id; if(existing_chunk != 0x0 && chunks[_chunkid].diseaseid == _diseasehash) { proposal.chunk_id = _chunkid; // updates chunk proposals infos: chunkProposalsCounter[_chunkid] = chunkProposalsCounter[_chunkid].add(1); chunkproposals[_chunkid][chunkProposalsCounter[_chunkid]] = proposal.proposed_release_hash; } // --- REQUIRE DEFAULT VOTE TO CREATE A BARRIER TO ENTRY AND AVOID SPAM --- // RANDOMHASH = keccak256(abi.encode(RANDOMHASH, _proposed_release_hash)); // updates RANDOMHASH emit NewProposal(_proposed_release_hash, msg.sender, proposal.disease_id, _chunkid); } function updatecost() public { // only start to increase PROPOSAL AND DISEASE COSTS once we are in phase2 require(supply >= 21000000 * 10**(decimals)); // update disease and proposal cost each 52 periods to take into account inflation: require(periodsCounter % 52 == 0); uint _new_disease_cost = supply.mul(47619046).div(10**13); // disease cost is 0.00047619046% of supply uint _new_proposal_vote = supply.mul(47619046).div(10**14); // default vote amount is 0.000047619046% of supply PROPOSAL_DEFAULT_VOTE = _new_proposal_vote; DISEASE_CREATION_AMOUNT = _new_disease_cost; assert(LAST_PERIOD_COST_UPDATE < periodsCounter); LAST_PERIOD_COST_UPDATE = periodsCounter; } function commitvote(uint _amount, bytes32 _votehash) public { require(_amount > 10); // Consume bosom: require(bosoms[msg.sender] >= _amount); // this check is not mandatory as handled by safemath sub function bosoms[msg.sender] = bosoms[msg.sender].sub(_amount); // Block Eticas in eticablkdtbl to prevent user from unstaking before eventual slash blockedeticas[msg.sender] = blockedeticas[msg.sender].add(_amount); // store _votehash in commits with _amount and current block.timestamp value: commits[msg.sender][_votehash].amount = commits[msg.sender][_votehash].amount.add(_amount); commits[msg.sender][_votehash].timestamp = block.timestamp; RANDOMHASH = keccak256(abi.encode(RANDOMHASH, _votehash)); // updates RANDOMHASH emit NewCommit(msg.sender, _votehash); } function revealvote(bytes32 _proposed_release_hash, bool _approved, string memory _vary) public { // --- check commit --- // bytes32 _votehash; _votehash = keccak256(abi.encode(_proposed_release_hash, _approved, msg.sender, _vary)); require(commits[msg.sender][_votehash].amount > 0); // --- check commit done --- // //check if the proposal exists and that we get the right proposal: Proposal storage proposal = proposals[_proposed_release_hash]; require(proposal.id > 0 && proposal.proposed_release_hash == _proposed_release_hash); ProposalData storage proposaldata = propsdatas[_proposed_release_hash]; // Verify commit was done within voting time: require( commits[msg.sender][_votehash].timestamp <= proposaldata.endtime); // Verify we are within revealing time: require( block.timestamp > proposaldata.endtime && block.timestamp <= proposaldata.endtime.add(DEFAULT_REVEALING_TIME)); require(proposaldata.prestatus != ProposalStatus.Pending); // can vote for proposal only if default vote has changed prestatus of Proposal. Thus can vote only if default vote occured as supposed to uint _old_proposal_curationweight = proposaldata.lastcuration_weight; uint _old_proposal_editorweight = proposaldata.lasteditor_weight; // get Period of Proposal: Period storage period = periods[proposal.period_id]; // Check that vote does not already exist // only allow one vote for each {raw_release_hash, voter} combinasion bytes32 existing_vote = votes[proposal.proposed_release_hash][msg.sender].proposal_hash; if(existing_vote != 0x0 || votes[proposal.proposed_release_hash][msg.sender].amount != 0) revert(); //prevent the same user from voting twice for same raw_release_hash. Double condition check for better security and slightly higher gas cost even though one would be enough ! // store vote: Vote storage vote = votes[proposal.proposed_release_hash][msg.sender]; vote.proposal_hash = proposal.proposed_release_hash; vote.approve = _approved; vote.is_editor = false; vote.amount = commits[msg.sender][_votehash].amount; vote.voter = msg.sender; vote.timestamp = block.timestamp; proposaldata.nbvoters = proposaldata.nbvoters.add(1); // PROPOSAL VAR UPDATE if(_approved){ proposaldata.forvotes = proposaldata.forvotes.add(commits[msg.sender][_votehash].amount); } else { proposaldata.againstvotes = proposaldata.againstvotes.add(commits[msg.sender][_votehash].amount); } // Determine slashing conditions bool _isapproved = false; bool _istie = false; uint totalVotes = proposaldata.forvotes.add(proposaldata.againstvotes); uint _forvotes_numerator = proposaldata.forvotes.mul(10000); // (newproposal_forvotes / totalVotes) will give a number between 0 and 1. Multiply by 10000 to store it as uint uint _ratio_slashing = 0; if ((_forvotes_numerator.div(totalVotes)) > APPROVAL_THRESHOLD){ _isapproved = true; } if ((_forvotes_numerator.div(totalVotes)) == APPROVAL_THRESHOLD){ _istie = true; } proposaldata.istie = _istie; if (_isapproved){ _ratio_slashing = uint(((10000 - APPROVAL_THRESHOLD).mul(totalVotes)).div(10000)); _ratio_slashing = uint((proposaldata.againstvotes.mul(10000)).div(_ratio_slashing)); proposaldata.slashingratio = uint(10000 - _ratio_slashing); } else{ _ratio_slashing = uint((totalVotes.mul(APPROVAL_THRESHOLD)).div(10000)); _ratio_slashing = uint((proposaldata.forvotes.mul(10000)).div(_ratio_slashing)); proposaldata.slashingratio = uint(10000 - _ratio_slashing); } // Make sure the slashing reward ratio is within expected range: require(proposaldata.slashingratio >=0 && proposaldata.slashingratio <= 10000); // updates period forvotes and againstvotes system ProposalStatus _newstatus = ProposalStatus.Rejected; if(_isapproved){ _newstatus = ProposalStatus.Accepted; } if(proposaldata.prestatus == ProposalStatus.Singlevoter){ if(_isapproved){ period.forprops = period.forprops.add(1); } else { period.againstprops = period.againstprops.add(1); } } // in this case the proposal becomes rejected after being accepted or becomes accepted after being rejected: else if(_newstatus != proposaldata.prestatus){ if(_newstatus == ProposalStatus.Accepted){ period.againstprops = period.againstprops.sub(1); period.forprops = period.forprops.add(1); } // in this case proposal is necessarily Rejected: else { period.forprops = period.forprops.sub(1); period.againstprops = period.againstprops.add(1); } } // updates period forvotes and againstvotes system done // Proposal and Period new weight if (_istie) { proposaldata.prestatus = ProposalStatus.Rejected; proposaldata.lastcuration_weight = 0; proposaldata.lasteditor_weight = 0; // Proposal tied, remove proposal curation and editor sum period.curation_sum = period.curation_sum.sub(_old_proposal_curationweight); period.editor_sum = period.editor_sum.sub(_old_proposal_editorweight); } else { // Proposal approved, strengthen curation sum if (_isapproved){ proposaldata.prestatus = ProposalStatus.Accepted; proposaldata.lastcuration_weight = proposaldata.forvotes; proposaldata.lasteditor_weight = proposaldata.forvotes; // Proposal approved, replace proposal curation and editor sum with forvotes period.curation_sum = period.curation_sum.sub(_old_proposal_curationweight).add(proposaldata.lastcuration_weight); period.editor_sum = period.editor_sum.sub(_old_proposal_editorweight).add(proposaldata.lasteditor_weight); } else{ proposaldata.prestatus = ProposalStatus.Rejected; proposaldata.lastcuration_weight = proposaldata.againstvotes; proposaldata.lasteditor_weight = 0; // Proposal rejected, replace proposal curation sum with againstvotes and remove proposal editor sum period.curation_sum = period.curation_sum.sub(_old_proposal_curationweight).add(proposaldata.lastcuration_weight); period.editor_sum = period.editor_sum.sub(_old_proposal_editorweight); } } // resets commit to save space: _removecommit(_votehash); emit NewReveal(msg.sender, proposal.proposed_release_hash); } function _removecommit(bytes32 _votehash) internal { commits[msg.sender][_votehash].amount = 0; commits[msg.sender][_votehash].timestamp = 0; } function clmpropbyhash(bytes32 _proposed_release_hash) public { //check if the proposal exists and that we get the right proposal: Proposal storage proposal = proposals[_proposed_release_hash]; require(proposal.id > 0 && proposal.proposed_release_hash == _proposed_release_hash); ProposalData storage proposaldata = propsdatas[_proposed_release_hash]; // Verify voting and revealing period is over require( block.timestamp > proposaldata.endtime.add(DEFAULT_REVEALING_TIME)); // we check that the vote exists Vote storage vote = votes[proposal.proposed_release_hash][msg.sender]; require(vote.proposal_hash == _proposed_release_hash); // make impossible to claim same vote twice require(!vote.is_claimed); vote.is_claimed = true; // De-Block Eticas from eticablkdtbl to enable user to unstake these Eticas blockedeticas[msg.sender] = blockedeticas[msg.sender].sub(vote.amount); // get Period of Proposal: Period storage period = periods[proposal.period_id]; uint _current_interval = uint((block.timestamp).div(REWARD_INTERVAL)); // Check if Period is ready for claims or if it needs to wait more uint _min_intervals = uint(((DEFAULT_VOTING_TIME.add(DEFAULT_REVEALING_TIME)).div(REWARD_INTERVAL)).add(1)); // Minimum intervals before claimable require(_current_interval >= period.interval.add(_min_intervals)); // Period not ready for claims yet. Need to wait more ! // if status equals pending this is the first claim for this proposal if (proposaldata.status == ProposalStatus.Pending) { // SET proposal new status if (proposaldata.prestatus == ProposalStatus.Accepted) { proposaldata.status = ProposalStatus.Accepted; } else { proposaldata.status = ProposalStatus.Rejected; } proposaldata.finalized_time = block.timestamp; // NEW STATUS AFTER FIRST CLAIM DONE } // only slash and reward if prop is not tie: if (!proposaldata.istie) { // convert boolean to enum format for making comparasion with proposaldata.status possible: ProposalStatus voterChoice = ProposalStatus.Rejected; if(vote.approve){ voterChoice = ProposalStatus.Accepted; } if(voterChoice != proposaldata.status) { // slash loosers: voter has voted wrongly and needs to be slashed uint _slashRemaining = vote.amount; uint _extraTimeInt = uint(STAKING_DURATION.mul(SEVERITY_LEVEL).mul(proposaldata.slashingratio).div(10000)); if(vote.is_editor){ _extraTimeInt = uint(_extraTimeInt.mul(PROPOSERS_INCREASER)); } // REQUIRE FEE if slashingratio is superior to 90.00%: if(proposaldata.slashingratio > 9000){ // 33% fee if voter is not proposer or 100% fee if voter is proposer uint _feeRemaining = uint(vote.amount.mul(33).div(100)); if(vote.is_editor){ _feeRemaining = vote.amount; } emit NewFee(msg.sender, _feeRemaining, vote.proposal_hash); UNRECOVERABLE_ETI = UNRECOVERABLE_ETI.add(_feeRemaining); // update _slashRemaining _slashRemaining = vote.amount.sub(_feeRemaining); for(uint _stakeidxa = 1; _stakeidxa <= stakesCounters[msg.sender]; _stakeidxa++) { //if stake is big enough and can take into account the whole fee: if(stakes[msg.sender][_stakeidxa].amount > _feeRemaining) { stakes[msg.sender][_stakeidxa].amount = stakes[msg.sender][_stakeidxa].amount.sub(_feeRemaining); stakesAmount[msg.sender] = stakesAmount[msg.sender].sub(_feeRemaining); _feeRemaining = 0; break; } else { // The fee amount is more than or equal to a full stake, so the stake needs to be deleted: _feeRemaining = _feeRemaining.sub(stakes[msg.sender][_stakeidxa].amount); _deletestake(msg.sender, _stakeidxa); if(_feeRemaining == 0){ break; } } } } // SLASH only if slash remaining > 0 if(_slashRemaining > 0){ emit NewSlash(msg.sender, _slashRemaining, vote.proposal_hash); for(uint _stakeidx = 1; _stakeidx <= stakesCounters[msg.sender]; _stakeidx++) { //if stake is too small and will only be able to take into account a part of the slash: if(stakes[msg.sender][_stakeidx].amount <= _slashRemaining) { stakes[msg.sender][_stakeidx].endTime = stakes[msg.sender][_stakeidx].endTime.add(_extraTimeInt); _slashRemaining = _slashRemaining.sub(stakes[msg.sender][_stakeidx].amount); if(_slashRemaining == 0){ break; } } else { // The slash amount does not fill a full stake, so the stake needs to be split uint newAmount = stakes[msg.sender][_stakeidx].amount.sub(_slashRemaining); uint oldCompletionTime = stakes[msg.sender][_stakeidx].endTime; // slash amount split in _slashRemaining and newAmount stakes[msg.sender][_stakeidx].amount = _slashRemaining; // only slash the part of the stake that amounts to _slashRemaining stakes[msg.sender][_stakeidx].endTime = stakes[msg.sender][_stakeidx].endTime.add(_extraTimeInt); // slash the stake if(newAmount > 0){ // create a new stake with the rest of what remained from original stake that was split in 2 splitStake(msg.sender, newAmount, oldCompletionTime); } break; } } } // the slash is over } else { uint _reward_amount = 0; // check beforte diving by 0 require(period.curation_sum > 0); // period curation sum pb ! // get curation reward only if voter is not the proposer: if (!vote.is_editor){ _reward_amount = _reward_amount.add((vote.amount.mul(period.reward_for_curation)).div(period.curation_sum)); } // if voter is editor and proposal accepted: if (vote.is_editor && proposaldata.status == ProposalStatus.Accepted){ // check before dividing by 0 require( period.editor_sum > 0); // Period editor sum pb ! _reward_amount = _reward_amount.add((proposaldata.lasteditor_weight.mul(period.reward_for_editor)).div(period.editor_sum)); } require(_reward_amount <= period.reward_for_curation.add(period.reward_for_editor)); // "System logic error. Too much ETICA calculated for reward." // SEND ETICA AS REWARD balances[address(this)] = balances[address(this)].sub(_reward_amount); balances[msg.sender] = balances[msg.sender].add(_reward_amount); emit Transfer(address(this), msg.sender, _reward_amount); emit RewardClaimed(msg.sender, _reward_amount, _proposed_release_hash); } } // end bracket if (proposaldata.istie not true) } function createchunk(bytes32 _diseasehash, string memory _title, string memory _description) public { //check if the disease exits require(diseasesbyIds[_diseasehash] > 0 && diseasesbyIds[_diseasehash] <= diseasesCounter); if(diseases[diseasesbyIds[_diseasehash]].disease_hash != _diseasehash) revert(); // second check not necessary but I decided to add it as the gas cost value for security is worth it // --- REQUIRE PAYMENT FOR ADDING A CHUNK TO CREATE A BARRIER TO ENTRY AND AVOID SPAM --- // uint _cost = DISEASE_CREATION_AMOUNT.div(20); // make sure the user has enough ETI to create a chunk require(balances[msg.sender] >= _cost); // transfer DISEASE_CREATION_AMOUNT / 20 ETI from user wallet to contract wallet: transfer(address(this), _cost); // --- REQUIRE PAYMENT FOR ADDING A CHUNK TO CREATE A BARRIER TO ENTRY AND AVOID SPAM --- // chunksCounter = chunksCounter.add(1); // get general id of Chunk // updates disease's chunks infos: diseaseChunksCounter[_diseasehash] = diseaseChunksCounter[_diseasehash].add(1); // Increase chunks index of Disease diseasechunks[_diseasehash][diseaseChunksCounter[_diseasehash]] = chunksCounter; // store the Chunk chunks[chunksCounter] = Chunk( chunksCounter, // general id of the chunk _diseasehash, // disease of the chunk diseaseChunksCounter[_diseasehash], // Index of chunk within disease _title, _description ); UNRECOVERABLE_ETI = UNRECOVERABLE_ETI.add(_cost); emit NewChunk(chunksCounter, _diseasehash); } // ------------- PUBLISHING SYSTEM CORE FUNCTIONS ---------------- // // ------------- GETTER FUNCTIONS ---------------- // // get bosoms balance of user: function bosomsOf(address tokenOwner) public view returns (uint _bosoms){ return bosoms[tokenOwner]; } function getdiseasehashbyName(string memory _name) public view returns (bytes32 _diseasehash){ return diseasesbyNames[_name]; } // ------------- GETTER FUNCTIONS ---------------- // }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"PERIOD_EDITOR_REWARD_RATIO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PROPOSERS_INCREASER","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"diseasesbyIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRewardEthBlockNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningDifficulty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"nonce","type":"uint256"},{"name":"challenge_digest","type":"bytes32"}],"name":"mint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"IntervalsPeriodsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_diseasehash","type":"bytes32"},{"name":"_title","type":"string"},{"name":"_description","type":"string"},{"name":"raw_release_hash","type":"string"},{"name":"_freefield","type":"string"},{"name":"_chunkid","type":"uint256"}],"name":"propose","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"accessibleSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_votehash","type":"bytes32"}],"name":"commitvote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAKING_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"chunksCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningTarget","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"proposals","outputs":[{"name":"id","type":"uint256"},{"name":"proposed_release_hash","type":"bytes32"},{"name":"disease_id","type":"bytes32"},{"name":"period_id","type":"uint256"},{"name":"chunk_id","type":"uint256"},{"name":"proposer","type":"address"},{"name":"title","type":"string"},{"name":"description","type":"string"},{"name":"freefield","type":"string"},{"name":"raw_release_hash","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposalsbyIndex","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DISEASE_CREATION_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_VOTING_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LAST_PERIOD_COST_UPDATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_REVEALING_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"APPROVAL_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_diseasehash","type":"bytes32"},{"name":"_title","type":"string"},{"name":"_description","type":"string"}],"name":"createchunk","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_totalMiningSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"}],"name":"diseasechunks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"diseases","outputs":[{"name":"disease_hash","type":"bytes32"},{"name":"name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"propsdatas","outputs":[{"name":"starttime","type":"uint256"},{"name":"endtime","type":"uint256"},{"name":"finalized_time","type":"uint256"},{"name":"status","type":"uint8"},{"name":"prestatus","type":"uint8"},{"name":"istie","type":"bool"},{"name":"nbvoters","type":"uint256"},{"name":"slashingratio","type":"uint256"},{"name":"forvotes","type":"uint256"},{"name":"againstvotes","type":"uint256"},{"name":"lastcuration_weight","type":"uint256"},{"name":"lasteditor_weight","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getChallengeNumber","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UNRECOVERABLE_ETI","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_endTime","type":"uint256"},{"name":"_min_limit","type":"uint256"},{"name":"_maxidx","type":"uint256"}],"name":"stakescsldt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"bosoms","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"stakes","outputs":[{"name":"amount","type":"uint256"},{"name":"endTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initiatormsg","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"chunks","outputs":[{"name":"id","type":"uint256"},{"name":"diseaseid","type":"bytes32"},{"name":"idx","type":"uint256"},{"name":"title","type":"string"},{"name":"desc","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REWARD_INTERVAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_staker","type":"address"}],"name":"stakescount","outputs":[{"name":"slength","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"}],"name":"diseaseproposals","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_proposed_release_hash","type":"bytes32"},{"name":"_approved","type":"bool"},{"name":"_vary","type":"string"}],"name":"revealvote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"createdisease","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensMinted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"diseasesCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastRewardTo","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SEVERITY_LEVEL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"bytes32"}],"name":"commits","outputs":[{"name":"amount","type":"uint256"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"nonce","type":"uint256"},{"name":"challenge_digest","type":"bytes32"},{"name":"challenge_number","type":"bytes32"},{"name":"testTarget","type":"uint256"}],"name":"checkMintSolution","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"epochCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"diseaseProposalsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_MAXIMUM_TARGET","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"IntervalsPeriods","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"miningTarget","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"challengeNumber","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"},{"name":"","type":"address"}],"name":"votes","outputs":[{"name":"proposal_hash","type":"bytes32"},{"name":"approve","type":"bool"},{"name":"is_editor","type":"bool"},{"name":"amount","type":"uint256"},{"name":"voter","type":"address"},{"name":"timestamp","type":"uint256"},{"name":"is_claimed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"nonce","type":"uint256"},{"name":"challenge_digest","type":"bytes32"},{"name":"challenge_number","type":"bytes32"}],"name":"getMintDigest","outputs":[{"name":"digesttest","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PROPOSAL_DEFAULT_VOTE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updatecost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_stakeidx","type":"uint256"},{"name":"_snapamount","type":"uint256"}],"name":"stakesnap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"string"}],"name":"getdiseasehashbyName","outputs":[{"name":"_diseasehash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERIOD_CURATION_REWARD_RATIO","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_BLOCKS_PER_READJUSTMENT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"inflationrate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERIODS_PER_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_staker","type":"address"},{"name":"_amount","type":"uint256"}],"name":"eticatobosoms","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"chunkproposals","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"stakesAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"latestDifficultyPeriodStarted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blockreward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PeriodsIssuedCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodrewardtemp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"stakesCounters","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_MINIMUM_TARGET","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"chunkProposalsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"diseaseChunksCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PROTOCOL_RATIO_TARGET","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"periods","outputs":[{"name":"id","type":"uint256"},{"name":"interval","type":"uint256"},{"name":"curation_sum","type":"uint256"},{"name":"editor_sum","type":"uint256"},{"name":"reward_for_curation","type":"uint256"},{"name":"reward_for_editor","type":"uint256"},{"name":"forprops","type":"uint256"},{"name":"againstprops","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_stakeidx","type":"uint256"}],"name":"stakeclmidx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenOwner","type":"address"}],"name":"bosomsOf","outputs":[{"name":"_bosoms","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_proposed_release_hash","type":"bytes32"}],"name":"clmpropbyhash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"PeriodsIssued","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"blockedeticas","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"period_id","type":"uint256"},{"indexed":false,"name":"interval","type":"uint256"}],"name":"CreatedPeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"diseaseindex","type":"uint256"},{"indexed":false,"name":"title","type":"string"}],"name":"NewDisease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposed_release_hash","type":"bytes32"},{"indexed":true,"name":"_proposer","type":"address"},{"indexed":true,"name":"diseasehash","type":"bytes32"},{"indexed":true,"name":"chunkid","type":"uint256"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"chunkid","type":"uint256"},{"indexed":true,"name":"diseasehash","type":"bytes32"}],"name":"NewChunk","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"voter","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"proposal_hash","type":"bytes32"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"voter","type":"address"},{"indexed":false,"name":"fee","type":"uint256"},{"indexed":false,"name":"proposal_hash","type":"bytes32"}],"name":"NewFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"voter","type":"address"},{"indexed":false,"name":"duration","type":"uint256"},{"indexed":false,"name":"proposal_hash","type":"bytes32"}],"name":"NewSlash","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_voter","type":"address"},{"indexed":false,"name":"votehash","type":"bytes32"}],"name":"NewCommit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_voter","type":"address"},{"indexed":true,"name":"_proposal","type":"bytes32"}],"name":"NewReveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"NewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":false,"name":"stakeamount","type":"uint256"}],"name":"StakeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenOwner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"blockreward","type":"uint256"},{"indexed":false,"name":"epochCount","type":"uint256"},{"indexed":false,"name":"newChallengeNumber","type":"bytes32"}],"name":"Mint","type":"event"}]
Contract Creation Code
60c0604052600560808190527f457469636100000000000000000000000000000000000000000000000000000060a09081526200004091600091906200044c565b506040805180820190915260038082527f4554490000000000000000000000000000000000000000000000000000000000602090920191825262000087916001916200044c565b5060126002556408e4b1e125600655640e63c506db6007556107e0600e556004600f8190557b1000000000000000000000000000000000000000000000000000000060105562093a8060198190556224ea00601a55621baf80601b55601c5568056bc75e2d63100000601d819055678ac7230489e80000601e55611388601f556005602090815560219290925560036022819055611c5260235560006024819055908290553081526009909252604090912054620001539164010000000062004a7a620001c482021704565b3060009081526009602052604081209190915568da5351938e7eb5b95c600555600254600a0a62b03d3002600b556017556801f30795e38ed87acc60135560105460115542600c55620001ae640100000000620001db810204565b6b1004c20e49aa3240785fcad2600455620004f1565b81810182811015620001d557600080fd5b92915050565b600d54620001f990600164010000000062004a7a620001c482021704565b600d819055600e54908115156200020c57fe5b06151562000227576200022764010000000062000275810204565b6200024243600164010000000062004c7c620003eb82021704565b60185460408051924060208085019190915283820192909252805180840382018152606090930190528151910120601255565b601154600c546000906200029990429064010000000062004c7c620003eb82021704565b600e54909150600090620002be9061025864010000000062004ea26200040182021704565b9050808210156200034f5760115462000302908290620002ed908564010000000062004ea26200040182021704565b9064010000000062004a596200042982021704565b6011556200032083600464010000000062004a596200042982021704565b601154101562000349576200034583600464010000000062004a596200042982021704565b6011555b620003ba565b60115462000373908290620002ed908564010000000062004ea26200040182021704565b6011556200039183600464010000000062004ea26200040182021704565b6011541115620003ba57620003b683600464010000000062004ea26200040182021704565b6011555b42600c55600f546011541015620003d257600f546011555b6010546011541115620003e6576010546011555b505050565b600082821115620003fb57600080fd5b50900390565b8181028215806200041d57508183828115156200041a57fe5b04145b1515620001d557600080fd5b60008082116200043857600080fd5b81838115156200044457fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200048f57805160ff1916838001178555620004bf565b82800160010185558215620004bf579182015b82811115620004bf578251825591602001919060010190620004a2565b50620004cd929150620004d1565b5090565b620004ee91905b80821115620004cd5760008155600101620004d8565b90565b61564380620005016000396000f3fe608060405260043610610608576000357c0100000000000000000000000000000000000000000000000000000000900480636de9f32b11610329578063b5ade81b116101b7578063d74ce8c511610109578063ea4a1104116100b2578063f8c12e2c1161008c578063f8c12e2c14611bc6578063f8d8268314611bf0578063fc84abb714611c1a57610608565b8063ea4a110414611afe578063ecd3cb8214611b69578063f08a01f814611b9357610608565b8063e47e25a2116100e3578063e47e25a214611a95578063e723b9d914611abf578063e729798e14611ae957610608565b8063d74ce8c514611a30578063dc6e9cf914611a45578063dd62ed3e14611a5a57610608565b8063c7bef6ee1161016b578063d03150c611610145578063d03150c6146119d3578063d40170d7146119e8578063d732b835146119fd57610608565b8063c7bef6ee14611976578063cb9ae707146119a9578063cf70fa40146119be57610608565b8063be7d798e1161019c578063be7d798e146118f8578063bf6fc7251461190d578063c19885761461194657610608565b8063b5ade81b146118ce578063b6407769146118e357610608565b80638a769d351161027b578063a5ec87e411610224578063b31102e2116101fe578063b31102e2146117d6578063b4ef00f014611806578063b54f31db146118b957610608565b8063a5ec87e414611773578063a9059cbb14611788578063b01ab0b2146117c157610608565b806395d89b411161025557806395d89b411461171357806397566aa014611728578063996901781461175e57610608565b80638a769d351461166d5780638ae0368b146116825780639386775a1461169757610608565b806375165280116102dd578063841218ee116102b7578063841218ee1461160457806387a2a9d61461162e578063888589851461164357610608565b8063751652801461157a57806381269a56146115b3578063829965cc146115ef57610608565b80636fd396d61161030e5780636fd396d614611501578063700669511461153257806370a082311461154757610608565b80636de9f32b146114d75780636fbbbf1d146114ec57610608565b8063366c41a3116104a65780634ef37628116103f85780635a2bc22d116103a157806362adb2e11161037b57806362adb2e1146113335780636352170f146113635780636bb5a5821461142457610608565b80635a2bc22d146111ce5780635dbdda69146112eb5780635dfa73961461130057610608565b806357084164116103d25780635708416414611134578063584b62a1146111675780635965916f146111b957610608565b80634ef37628146110d4578063509fce5b146110e95780635327d4af146110fe57610608565b80633c5e64d11161045a57806346459b221161043457806346459b2214610f6e578063490203a7146110175780634b44c6aa1461102c57610608565b80633c5e64d114610de8578063410e1b0714610f29578063424d389414610f3e57610608565b806337eed2d61161048b57806337eed2d614610da95780633925bfe714610dbe5780633ab3429014610dd357610608565b8063366c41a314610d7f578063370ef54f14610d9457610608565b80631dcc83a91161055f5780632e1750041161051357806332e99708116104ed57806332e9970814610b3057806332ed5b1214610b45578063356df5ee14610d5557610608565b80632e17500414610af15780632f40907c14610b06578063313ce56714610b1b57610608565b806322ae4ccf1161054457806322ae4ccf14610a4b57806323b872dd14610a7b57806327e235e314610abe57610608565b80631dcc83a9146107e3578063229cb73c14610a3657610608565b80631081a47e116105c15780631801fbe51161059b5780631801fbe51461078957806318160ddd146107b95780631853f0a8146107ce57610608565b80631081a47e14610735578063163aa00d1461075f57806317da485f1461077457610608565b806306fdde03116105f257806306fdde0314610649578063095ea7b3146106d35780630dbc6c551461072057610608565b8062e6e5531461060d578063047fc9aa14610634575b600080fd5b34801561061957600080fd5b50610622611c4d565b60408051918252519081900360200190f35b34801561064057600080fd5b50610622611c53565b34801561065557600080fd5b5061065e611c59565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610698578181015183820152602001610680565b50505050905090810190601f1680156106c55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106df57600080fd5b5061070c600480360360408110156106f657600080fd5b50600160a060020a038135169060200135611ce7565b604080519115158252519081900360200190f35b34801561072c57600080fd5b50610622611d78565b34801561074157600080fd5b506106226004803603602081101561075857600080fd5b5035611d7e565b34801561076b57600080fd5b50610622611d90565b34801561078057600080fd5b50610622611d96565b34801561079557600080fd5b5061070c600480360360408110156107ac57600080fd5b5080359060200135611db5565b3480156107c557600080fd5b50610622612030565b3480156107da57600080fd5b50610622612036565b3480156107ef57600080fd5b50610a34600480360360c081101561080657600080fd5b8135919081019060408101602082013564010000000081111561082857600080fd5b82018360208201111561083a57600080fd5b8035906020019184600183028401116401000000008311171561085c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156108af57600080fd5b8201836020820111156108c157600080fd5b803590602001918460018302840111640100000000831117156108e357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561093657600080fd5b82018360208201111561094857600080fd5b8035906020019184600183028401116401000000008311171561096a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156109bd57600080fd5b8201836020820111156109cf57600080fd5b803590602001918460018302840111640100000000831117156109f157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061203c915050565b005b348015610a4257600080fd5b50610622612531565b348015610a5757600080fd5b50610a3460048036036040811015610a6e57600080fd5b508035906020013561254a565b348015610a8757600080fd5b5061070c60048036036060811015610a9e57600080fd5b50600160a060020a0381358116916020810135909116906040013561267e565b348015610aca57600080fd5b5061062260048036036020811015610ae157600080fd5b5035600160a060020a0316612789565b348015610afd57600080fd5b5061062261279b565b348015610b1257600080fd5b506106226127a1565b348015610b2757600080fd5b506106226127a7565b348015610b3c57600080fd5b506106226127ad565b348015610b5157600080fd5b50610b6f60048036036020811015610b6857600080fd5b50356127b3565b604051808b81526020018a815260200189815260200188815260200187815260200186600160a060020a0316600160a060020a0316815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b83811015610bee578181015183820152602001610bd6565b50505050905090810190601f168015610c1b5780820380516001836020036101000a031916815260200191505b5085810384528851815288516020918201918a019080838360005b83811015610c4e578181015183820152602001610c36565b50505050905090810190601f168015610c7b5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015610cae578181015183820152602001610c96565b50505050905090810190601f168015610cdb5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610d0e578181015183820152602001610cf6565b50505050905090810190601f168015610d3b5780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b348015610d6157600080fd5b5061062260048036036020811015610d7857600080fd5b5035612a38565b348015610d8b57600080fd5b50610622612a4a565b348015610da057600080fd5b50610622612a50565b348015610db557600080fd5b50610622612a56565b348015610dca57600080fd5b50610622612a5c565b348015610ddf57600080fd5b50610622612a62565b348015610df457600080fd5b50610a3460048036036060811015610e0b57600080fd5b81359190810190604081016020820135640100000000811115610e2d57600080fd5b820183602082011115610e3f57600080fd5b80359060200191846001830284011164010000000083111715610e6157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610eb457600080fd5b820183602082011115610ec657600080fd5b80359060200191846001830284011164010000000083111715610ee857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612a68945050505050565b348015610f3557600080fd5b50610622612c2d565b348015610f4a57600080fd5b5061062260048036036040811015610f6157600080fd5b5080359060200135612c33565b348015610f7a57600080fd5b50610f9860048036036020811015610f9157600080fd5b5035612c50565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610fdb578181015183820152602001610fc3565b50505050905090810190601f1680156110085780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561102357600080fd5b50610622612cf7565b34801561103857600080fd5b506110566004803603602081101561104f57600080fd5b5035612d17565b604051808d81526020018c81526020018b81526020018a600381111561107857fe5b60ff16815260200189600381111561108c57fe5b60ff1681529715156020890152506040808801969096526060870194909452608086019290925260a085015260c084015260e083015251908190036101000195509350505050f35b3480156110e057600080fd5b50610622612d7b565b3480156110f557600080fd5b50610622612d81565b34801561110a57600080fd5b50610a346004803603606081101561112157600080fd5b5080359060208101359060400135612d87565b34801561114057600080fd5b506106226004803603602081101561115757600080fd5b5035600160a060020a0316612ef3565b34801561117357600080fd5b506111a06004803603604081101561118a57600080fd5b50600160a060020a038135169060200135612f05565b6040805192835260208301919091528051918290030190f35b3480156111c557600080fd5b5061065e612f29565b3480156111da57600080fd5b506111f8600480360360208110156111f157600080fd5b5035612f46565b604051808681526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561124b578181015183820152602001611233565b50505050905090810190601f1680156112785780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156112ab578181015183820152602001611293565b50505050905090810190601f1680156112d85780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b3480156112f757600080fd5b5061062261309e565b34801561130c57600080fd5b506106226004803603602081101561132357600080fd5b5035600160a060020a03166130a4565b34801561133f57600080fd5b506106226004803603604081101561135657600080fd5b50803590602001356130bf565b34801561136f57600080fd5b50610a346004803603606081101561138657600080fd5b81359160208101351515918101906060810160408201356401000000008111156113af57600080fd5b8201836020820111156113c157600080fd5b803590602001918460018302840111640100000000831117156113e357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506130dc945050505050565b34801561143057600080fd5b50610a346004803603602081101561144757600080fd5b81019060208101813564010000000081111561146257600080fd5b82018360208201111561147457600080fd5b8035906020019184600183028401116401000000008311171561149657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061385d945050505050565b3480156114e357600080fd5b50610622613b2b565b3480156114f857600080fd5b50610622613b31565b34801561150d57600080fd5b50611516613b37565b60408051600160a060020a039092168252519081900360200190f35b34801561153e57600080fd5b50610622613b46565b34801561155357600080fd5b506106226004803603602081101561156a57600080fd5b5035600160a060020a0316613b4c565b34801561158657600080fd5b506111a06004803603604081101561159d57600080fd5b50600160a060020a038135169060200135613b67565b3480156115bf57600080fd5b5061070c600480360360808110156115d657600080fd5b5080359060208101359060408101359060600135613b8b565b3480156115fb57600080fd5b50610622613be5565b34801561161057600080fd5b506106226004803603602081101561162757600080fd5b5035613beb565b34801561163a57600080fd5b50610622613bfd565b34801561164f57600080fd5b506106226004803603602081101561166657600080fd5b5035613c03565b34801561167957600080fd5b50610622613c15565b34801561168e57600080fd5b50610622613c1b565b3480156116a357600080fd5b506116d0600480360360408110156116ba57600080fd5b5080359060200135600160a060020a0316613c21565b604080519788529515156020880152931515868601526060860192909252600160a060020a0316608085015260a0840152151560c0830152519081900360e00190f35b34801561171f57600080fd5b5061065e613c77565b34801561173457600080fd5b506106226004803603606081101561174b57600080fd5b5080359060208101359060400135613cd1565b34801561176a57600080fd5b50610622613d17565b34801561177f57600080fd5b50610622613d1d565b34801561179457600080fd5b5061070c600480360360408110156117ab57600080fd5b50600160a060020a038135169060200135613d23565b3480156117cd57600080fd5b50610a34613de1565b3480156117e257600080fd5b50610a34600480360360408110156117f957600080fd5b5080359060200135613e7e565b34801561181257600080fd5b506106226004803603602081101561182957600080fd5b81019060208101813564010000000081111561184457600080fd5b82018360208201111561185657600080fd5b8035906020019184600183028401116401000000008311171561187857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613f6f945050505050565b3480156118c557600080fd5b50610622613fd7565b3480156118da57600080fd5b50610622613fdd565b3480156118ef57600080fd5b50610622613fe3565b34801561190457600080fd5b50610622613fe9565b34801561191957600080fd5b5061070c6004803603604081101561193057600080fd5b50600160a060020a038135169060200135613fef565b34801561195257600080fd5b506106226004803603604081101561196957600080fd5b5080359060200135614031565b34801561198257600080fd5b506106226004803603602081101561199957600080fd5b5035600160a060020a031661404e565b3480156119b557600080fd5b50610622614060565b3480156119ca57600080fd5b50610622614066565b3480156119df57600080fd5b5061062261406c565b3480156119f457600080fd5b50610622614072565b348015611a0957600080fd5b5061062260048036036020811015611a2057600080fd5b5035600160a060020a0316614078565b348015611a3c57600080fd5b5061062261408a565b348015611a5157600080fd5b50610622614090565b348015611a6657600080fd5b5061062260048036036040811015611a7d57600080fd5b50600160a060020a0381358116916020013516614096565b348015611aa157600080fd5b5061062260048036036020811015611ab857600080fd5b50356140c1565b348015611acb57600080fd5b5061062260048036036020811015611ae257600080fd5b50356140d3565b348015611af557600080fd5b506106226140e5565b348015611b0a57600080fd5b50611b2860048036036020811015611b2157600080fd5b50356140eb565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b348015611b7557600080fd5b50610a3460048036036020811015611b8c57600080fd5b503561412e565b348015611b9f57600080fd5b5061062260048036036020811015611bb657600080fd5b5035600160a060020a0316614299565b348015611bd257600080fd5b50610a3460048036036020811015611be957600080fd5b50356142b4565b348015611bfc57600080fd5b5061062260048036036020811015611c1357600080fd5b5035614a35565b348015611c2657600080fd5b5061062260048036036020811015611c3d57600080fd5b5035600160a060020a0316614a47565b60075481565b60035481565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611cdf5780601f10611cb457610100808354040283529160200191611cdf565b820191906000526020600020905b815481529060010190602001808311611cc257829003601f168201915b505050505081565b33600090815260096020526040812054821115611d0357600080fd5b60008211611d1057600080fd5b336000818152600a60209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60225481565b602d6020526000908152604090205481565b60155481565b6000611daf601154601054614a5990919063ffffffff16565b90505b90565b601254604080516020808201939093526c0100000000000000000000000033028183015260548082018690528251808303909101815260749091019091528051910120600090828114611e0757600080fd5b601154811115611e1657600080fd5b60125460009081526016602052604090208054908290558015611e3857600080fd5b600254600a0a621cd6d0026017541115611f0557600254600a0a6260216002601754101515611e81576801153d1a61fa067d1c601355690443a097e1c8798c9f30600555611f05565b600254600a0a62367950026017541015611eb5576801bb94f70329a3fb606013556901b4a6a3271cfd6b72b8600555611f05565b600254600a0a624ce780026017541015611ee957680184225822c46f7bf460135569028ef9f4baab7c212c78600555611f05565b68014cafb9425f3afc886013556903694d464e39fad6e5d46005555b601354601754611f1a9163ffffffff614a7a16565b6017819055600b5411611f2957fe5b601354600354611f3e9163ffffffff614a7a16565b60035560135433600090815260096020526040902054611f639163ffffffff614a7a16565b336000818152600960205260409020919091556014805473ffffffffffffffffffffffffffffffffffffffff1916909117905543601555611fa2614a8a565b601354600d54601254604080519384526020840192909252828201525133917fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d919081900360600190a26013546040805191825251339130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3506001949350505050565b60035490565b602a5481565b6000868152602d60205260408120541180156120685750602c546000878152602d602052604090205411155b151561207357600080fd5b6000868152602d60209081526040808320548352602b909152902054861461209a57600080fd5b6036548111156120a957600080fd5b600083876040516020018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156120f35781810151838201526020016120db565b50505050905090810190601f1680156121205780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152918152815160209283012060008e8152603090935291205490955061216094509250600191505063ffffffff614a7a16565b6000888152603060209081526040808320849055602f82528083209383529290522081905560335461219990600163ffffffff614a7a16565b603381905560009081526032602090815260408083208490558383526031909152902060010154801515806121db575060008281526031602052604090205415155b156121e557600080fd5b60006121fc60195442614a5990919063ffffffff16565b600081815260296020526040902054909150151561221c5761221c614b03565b60008381526031602090815260408083206033548155600281018d90558484526029835292205460038301556001820185905560058201805473ffffffffffffffffffffffffffffffffffffffff1916331790558951612284916006840191908c0190615519565b50875161229a90600783019060208b0190615519565b5086516122b090600983019060208a0190615519565b5085516122c69060088301906020890190615519565b506000848152603460205260408120600381018054600260ff199091161762ff00001916620100001761ff0019166102001790556004810182905560058101829055600681018290556007810182905560088101829055600981019190915542808255601b546123369190614a7a565b6001820155601e54336000908152603d6020526040902054101561235957600080fd5b601e54336000908152603d602052604090205461237b9163ffffffff614c7c16565b336000908152603d6020908152604080832093909355601e546041909152919020546123ac9163ffffffff614a7a16565b33600081815260416020908152604080832094909455600186810154808452603b83528584208585528352858420908155808201805461ff001960ff199091169093178316610100179055601e5460028201556003808201805473ffffffffffffffffffffffffffffffffffffffff19169096179095554260048201559386018054909116610300179055898252603590529190912054801580159061246257506000888152603560205260409020600101548d145b156124b957600484018890556000888152603a602052604090205461248e90600163ffffffff614a7a16565b6000898152603a60209081526040808320849055600188015460388352818420948452939091529020555b60188054604080516020808201939093528082018b905281518082038301815260608201808452815191909401209093556002870154918a9052518a9233917ff20f961bd89931f54768689d741307497501063bee5847fc3fcaa72b026d18599181900360800190a450505050505050505050505050565b6000611daf600854600354614c7c90919063ffffffff16565b600a821161255757600080fd5b336000908152603d602052604090205482111561257357600080fd5b336000908152603d6020526040902054612593908363ffffffff614c7c16565b336000908152603d60209081526040808320939093556041905220546125bf908363ffffffff614a7a16565b33600090815260416020908152604080832093909355603c8152828220848352905220546125f3908363ffffffff614a7a16565b336000818152603c6020908152604080832086845282529182902093845542600190940193909355601880548251808601919091528083018690528251808203840181526060820180855281519190960120909155928490525190917f0290e16ca163280238cff6bd42c77cb055d3ff42239fe48bc5b8ec6edf5065c9919081900360800190a25050565b600160a060020a0383166000908152600960205260408120546126a7908363ffffffff614c7c16565b600160a060020a038516600090815260096020908152604080832093909355600a8152828220338352905220546126e4908363ffffffff614c7c16565b600160a060020a038086166000908152600a60209081526040808320338452825280832094909455918616815260099091522054612728908363ffffffff614a7a16565b600160a060020a0380851660008181526009602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b60096020526000908152604090205481565b601a5481565b60365481565b60025481565b60115490565b60316020908152600091825260409182902080546001808301546002808501546003860154600487015460058801546006890180548c51601f6000199a831615610100029a909a01909116969096049788018b90048b0286018b01909b5286855296999498929791969095600160a060020a039091169491939283018282801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b5050505060078301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561290e5780601f106128e35761010080835404028352916020019161290e565b820191906000526020600020905b8154815290600101906020018083116128f157829003601f168201915b5050505060088301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561299e5780601f106129735761010080835404028352916020019161299e565b820191906000526020600020905b81548152906001019060200180831161298157829003601f168201915b5050505060098301805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152949594935090830182828015612a2e5780601f10612a0357610100808354040283529160200191612a2e565b820191906000526020600020905b815481529060010190602001808311612a1157829003601f168201915b505050505090508a565b60326020526000908152604090205481565b601d5481565b601b5481565b60245481565b601c5481565b601f5481565b6000838152602d6020526040812054118015612a945750602c546000848152602d602052604090205411155b1515612a9f57600080fd5b6000838152602d60209081526040808320548352602b9091529020548314612ac657600080fd5b601d54600090612add90601463ffffffff614a5916565b33600090815260096020526040902054909150811115612afc57600080fd5b612b063082613d23565b50603654612b1b90600163ffffffff614a7a16565b603655600084815260396020526040902054612b3e90600163ffffffff614a7a16565b600085815260396020908152604080832084815560365460378452828520958552948352818420859055815160a0810183528581528084018a81529154818401908152606082018a8152608083018a9052968652603585529290942084518155905160018201559051600282015592518051929392612bc39260038501920190615519565b5060808201518051612bdf916004840191602090910190615519565b5050600854612bf591508263ffffffff614a7a16565b6008556036546040518591907fb733708a2586752275a4854aac54c7bb263ad67859f07d16147feea53ca009d790600090a350505050565b600b5481565b603760209081526000928352604080842090915290825290205481565b602b602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f810186900486028301860190965285825291949293909290830182828015612ced5780601f10612cc257610100808354040283529160200191612ced565b820191906000526020600020905b815481529060010190602001808311612cd057829003601f168201915b5050505050905082565b6000600b54601754111515612d0f5750601354611db2565b506000611db2565b603460205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460099099015497989697959660ff8087169761010088048216976201000090049091169594939291908c565b60125490565b60085481565b612d9b426303c2670063ffffffff614a7a16565b8310612da657600080fd5b60328111158015612dc65750336000908152603f60205260409020548111155b1515612dd157600080fd5b6000806001805b848111612ed457336000908152603f6020526040902054600211612ecc57336000908152603f60205260409020548111612e1457809150612e31565b612e24818463ffffffff614c7c16565b91506001821015612e3157fe5b336000908152603e602090815260408083208584529091529020600101548710801590612e7b5750336000908152603e602090815260408083208584529091529020600101548611155b15612ecc57336000908152603e60209081526040808320858452909152902054612eac90859063ffffffff614a7a16565b9350612eb83383614c91565b612ec983600163ffffffff614a7a16565b92505b600101612dd8565b506000831115612eeb57612ee9338488614da4565b505b505050505050565b603d6020526000908152604090205481565b603e6020908152600092835260408084209091529082529020805460019091015482565b60a060405190810160405280606681526020016155b26066913981565b6035602052806000526040600020600091509050806000015490806001015490806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130045780601f10612fd957610100808354040283529160200191613004565b820191906000526020600020905b815481529060010190602001808311612fe757829003601f168201915b5050505060048301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156130945780601f1061306957610100808354040283529160200191613094565b820191906000526020600020905b81548152906001019060200180831161307757829003601f168201915b5050505050905085565b60195481565b600160a060020a03166000908152603f602052604090205490565b602f60209081526000928352604080842090915290825290205481565b600083833384604051602001808581526020018415151515815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561314a578181015183820152602001613132565b50505050905090810190601f1680156131775780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181528151602092830120336000908152603c8452828120828252909352908220549098501195506131bc94505050505057600080fd5b6000848152603160205260408120805490911080156131de5750848160010154145b15156131e957600080fd5b6000858152603460209081526040808320600180820154338652603c8552838620888752909452919093200154111561322157600080fd5b80600101544211801561324a5750601c5460018201546132469163ffffffff614a7a16565b4211155b151561325557600080fd5b6002600382810154610100900460ff169081111561326f57fe5b141561327a57600080fd5b600881015460098201546003840154600090815260256020908152604080832060018801548452603b835281842033855290925290912054801515806132e0575060018601546000908152603b6020908152604080832033845290915290206002015415155b156132ea57600080fd5b6000603b600088600101548152602001908152602001600020600033600160a060020a0316600160a060020a03168152602001908152602001600020905086600101548160000181905550898160010160006101000a81548160ff02191690831515021790555060008160010160016101000a81548160ff021916908315150217905550603c600033600160a060020a0316600160a060020a031681526020019081526020016000206000898152602001908152602001600020600001548160020181905550338160030160006101000a815481600160a060020a030219169083600160a060020a031602179055504281600401819055506133fa60018760040154614a7a90919063ffffffff16565b6004870155891561343e57336000908152603c602090815260408083208b845290915290205460068701546134349163ffffffff614a7a16565b6006870155613473565b336000908152603c602090815260408083208b8452909152902054600787015461346d9163ffffffff614a7a16565b60078701555b6007860154600687015460009182918291613494919063ffffffff614a7a16565b905060006134b16127108b60060154614ea290919063ffffffff16565b601f549091506000906134ca838563ffffffff614a5916565b11156134d557600194505b601f546134e8838563ffffffff614a5916565b14156134f357600193505b60038b01805462ff000019166201000086151502179055841561356c5761353b61271061352f85601f5461271003614ea290919063ffffffff16565b9063ffffffff614a5916565b905061355a8161352f6127108e60070154614ea290919063ffffffff16565b61271081900360058d015590506135b4565b61358761271061352f601f5486614ea290919063ffffffff16565b90506135a68161352f6127108e60060154614ea290919063ffffffff16565b61271081900360058d015590505b60008b60050154101580156135cf57506127108b6005015411155b15156135da57600080fd5b600085156135e6575060015b6003808d810154610100900460ff16908111156135ff57fe5b141561364c57851561362b57600689015461362190600163ffffffff614a7a16565b60068a0155613647565b600789015461364190600163ffffffff614a7a16565b60078a01555b6136fb565b60038c810154610100900460ff169081111561366457fe5b81600381111561367057fe5b146136fb57600181600381111561368357fe5b14156136c457600789015461369f90600163ffffffff614c7c16565b60078a015560068901546136ba90600163ffffffff614a7a16565b60068a01556136fb565b60068901546136da90600163ffffffff614c7c16565b60068a015560078901546136f590600163ffffffff614a7a16565b60078a01555b841561374f5760038c01805461ff0019169055600060088d0181905560098d0155600289015461372b908c614c7c565b60028a01556003890154613745908b63ffffffff614c7c16565b60038a0155613811565b85156137bd5760038c01805461ff00191661010017905560068c015460088d0181905560098d0181905560028a0154613799919061378d908e614c7c565b9063ffffffff614a7a16565b60028a015560098c015460038a0154613745919061378d908d63ffffffff614c7c16565b60038c01805461ff001916905560078c015460088d01819055600060098e015560028a01546137f1919061378d908e614c7c565b60028a0155600389015461380b908b63ffffffff614c7c16565b60038a01555b61381a8e614ec7565b60018d015460405133907f80db1ea9846ea83629eeccaca574eaa17279cf1b4ae562df64a1ab7cde5958cc90600090a35050505050505050505050505050505050565b601d5433600090815260096020526040902054101561387b57600080fd5b61388730601d54613d23565b50601d5460085461389d9163ffffffff614a7a16565b6008819055506000816040516020018080602001828103825283818151815260200191508051906020019080838360005b838110156138e65781810151838201526020016138ce565b50505050905090810190601f1680156139135780820380516001836020036101000a031916815260200191505b50925050506040516020818303038152906040528051906020012090506139466001602c54614a7a90919063ffffffff16565b602c556000818152602d60205260409020541561396257600080fd5b602e826040518082805190602001908083835b602083106139945780518252601f199092019160209182019101613975565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220541591506139ce905057600080fd5b6040805180820182528281526020808201858152602c546000908152602b8352939093208251815592518051929392613a0d9260018501920190615519565b50905050602c54602d60008381526020019081526020016000208190555080602e836040518082805190602001908083835b60208310613a5e5780518252601f199092019160209182019101613a3f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852095909555602c54818552875185830152875190957f830578780908e1ff0fbde38777892998c31b30c39451a5a3b0e99cbf7bd781df9589955093508392908301919085019080838360005b83811015613aed578181015183820152602001613ad5565b50505050905090810190601f168015613b1a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60175481565b602c5481565b601454600160a060020a031681565b60215481565b600160a060020a031660009081526009602052604090205490565b603c6020908152600092835260408084209091529082529020805460019091015482565b6040805160208082018590526c010000000000000000000000003302828401526054808301889052835180840390910181526074909201909252805191012060009082811115613bda57600080fd5b909314949350505050565b600d5481565b60306020526000908152604090205481565b60105481565b60296020526000908152604090205481565b60115481565b60125481565b603b602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939460ff80851695610100909504811694600160a060020a03909316921687565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611cdf5780601f10611cb457610100808354040283529160200191611cdf565b6040805160208082018490526c01000000000000000000000000330282840152605480830187905283518084039091018152607490920190925280519101209392505050565b601e5481565b60335481565b6000808211613d3157600080fd5b33600090815260096020526040902054613d51908363ffffffff614c7c16565b3360009081526009602052604080822092909255600160a060020a03851681522054613d83908363ffffffff614a7a16565b600160a060020a0384166000818152600960209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600254600a0a6301406f400260035410151515613dfd57600080fd5b6026546034900615613e0e57600080fd5b6000613e336509184e72a00061352f6302d69be6600354614ea290919063ffffffff16565b90506000613e5a655af3107a400061352f6302d69be6600354614ea290919063ffffffff16565b601e819055601d83905560265460245491925011613e7457fe5b5050602654602455565b60008111613e8b57600080fd5b600082118015613eaa5750336000908152603f60205260409020548211155b1515613eb557600080fd5b336000908152603e60209081526040808320858452909152902080548210613edc57600080fd5b8054600090613ef1908463ffffffff614c7c16565b838355336000908152603f6020526040902054909150613f1890600163ffffffff614a7a16565b336000818152603f6020908152604080832085905580518082018252868152600180890154828501908152958552603e845282852096855295909252822090518155915191909201558111613f6957fe5b50505050565b6000602e826040518082805190602001908083835b60208310613fa35780518252601f199092019160209182019101613f84565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054949350505050565b60065481565b600e5481565b60045481565b60205481565b600033600160a060020a0384161461400657600080fd5b6000821161401357600080fd5b61401d3083613d23565b506140288383614eeb565b50600192915050565b603860209081526000928352604080842090915290825290205481565b60406020819052600091825290205481565b600c5481565b60135481565b60285481565b60055481565b603f6020526000908152604090205481565b60265481565b600f5481565b600160a060020a039182166000908152600a6020908152604080832093909416825291909152205490565b603a6020526000908152604090205481565b60396020526000908152604090205481565b60235481565b6025602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909188565b60008111801561414d5750336000908152603f60205260409020548111155b151561415857600080fd5b336000908152603e6020908152604080832084845290915290206001810154421161418257600080fd5b3360009081526041602090815260408083205491819052909120546141ac9163ffffffff614c7c16565b815411156141b957600080fd5b8054306000908152600960205260409020546141da9163ffffffff614c7c16565b30600090815260096020526040808220929092558254338252919020546142069163ffffffff614a7a16565b3360008181526009602090815260409182902093909355835481519081529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a38054604080519182525133917f2aeea59856f5616c244717fd488ead1d1b5fd33608d9583a4607b4c4ba3631e4919081900360200190a26142953383614c91565b5050565b600160a060020a03166000908152603d602052604090205490565b6000818152603160205260408120805490911080156142d65750818160010154145b15156142e157600080fd5b6000828152603460205260409020601c5460018201546143069163ffffffff614a7a16565b421161431157600080fd5b60018201546000908152603b6020908152604080832033845290915290208054841461433c57600080fd5b600581015460ff161561434e57600080fd5b60058101805460ff191660011790556002810154336000908152604160205260409020546143819163ffffffff614c7c16565b3360009081526041602090815260408083209390935560038601548252602590529081206019549091906143bc90429063ffffffff614a5916565b905060006143e2600161378d60195461352f601c54601b54614a7a90919063ffffffff16565b60018401549091506143fa908263ffffffff614a7a16565b82101561440657600080fd5b600260038087015460ff169081111561441b57fe5b1415614469576001600386810154610100900460ff169081111561443b57fe5b14156144555760038501805460ff19166001179055614462565b60038501805460ff191690555b4260028601555b600385015462010000900460ff161515612ee957600184015460009060ff1615614491575060015b60038087015460ff16908111156144a457fe5b8160038111156144b057fe5b1461486f5760008560020154905060006144f161271061352f8a600501546144e5602154601a54614ea290919063ffffffff16565b9063ffffffff614ea216565b6001880154909150610100900460ff161561451d5760225461451a90829063ffffffff614ea216565b90505b612328886005015411156146d757600061454a606461352f60218b60020154614ea290919063ffffffff16565b6001890154909150610100900460ff1615614566575060028701545b8754604080518381526020810192909252805133927f53ef86fe8b545e88c8078a71aa8a9be4140e6f140b4e36f0ffee9207cf1ee89692908290030190a26008546145b7908263ffffffff614a7a16565b60085560028801546145cf908263ffffffff614c7c16565b925060015b336000908152603f602052604090205481116146d457336000908152603e6020908152604080832084845290915290205482101561468857336000908152603e60209081526040808320848452909152902054614637908363ffffffff614c7c16565b336000818152603e6020908152604080832086845282528083209490945591815290829052205461466e908363ffffffff614c7c16565b3360009081526040602081905281209190915591506146d4565b336000908152603e602090815260408083208484529091529020546146b490839063ffffffff614c7c16565b91506146c03382614c91565b8115156146cc576146d4565b6001016145d4565b50505b6000821115614868578654604080518481526020810192909252805133927f29ddc6e588094281b6a071214828b237ac1451c1611bce535a86790aea70074792908290030190a260015b336000908152603f6020526040902054811161486657336000908152603e6020908152604080832084845290915290205483106147c757336000908152603e60209081526040808320848452909152902060010154614786908363ffffffff614a7a16565b336000908152603e6020908152604080832085845290915290206001810191909155546147b4908490614c7c565b92508215156147c257614866565b61485e565b336000908152603e602090815260408083208484529091528120546147f2908563ffffffff614c7c16565b336000908152603e6020908152604080832086845290915290206001810154908690559091506148228185614a7a565b336000908152603e6020908152604080832087845290915281206001019190915582111561485757614855338383614f3f565b505b5050614866565b600101614721565b505b5050614a2b565b6002840154600090811061488257600080fd5b6001860154610100900460ff1615156148cb576148c86148bb866002015461352f88600401548a60020154614ea290919063ffffffff16565b829063ffffffff614a7a16565b90505b6001860154610100900460ff1680156148f65750600160038089015460ff16908111156148f457fe5b145b1561493557600385015460001061490c57600080fd5b6149326148bb866003015461352f88600501548b60090154614ea290919063ffffffff16565b90505b6005850154600486015461494e9163ffffffff614a7a16565b81111561495a57600080fd5b3060009081526009602052604090205461497a908263ffffffff614c7c16565b306000908152600960205260408082209290925533815220546149a3908263ffffffff614a7a16565b336000818152600960209081526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a360408051828152602081018b9052815133927fe413caa6d70a6d9b51c2af2575a2914490f614355049af8ae7cde5caab9fd201928290030190a2505b5050505050505050565b60276020526000908152604090205481565b60416020526000908152604090205481565b6000808211614a6757600080fd5b8183811515614a7257fe5b049392505050565b81810182811015611d7257600080fd5b600d54614a9e90600163ffffffff614a7a16565b600d819055600e5490811515614ab057fe5b061515614abf57614abf614fcb565b614ad043600163ffffffff614c7c16565b60185460408051924060208085019190915283820192909252805180840382018152606090930190528151910120601255565b6000614b1a60195442614a5990919063ffffffff16565b6000818152602960205260409020549091508015614b3757600080fd5b602654614b4b90600163ffffffff614a7a16565b6026818155604080516101008101825283815260208082018781526000838501818152606085018281526080860183815260a0870184815260c0880185815260e089018681529b8652602588528986209851895595516001808a0191909155935160028901559151600388015551600487015551600586015591516006850155955160079093019290925592548685526029909352922055602a54614bf59163ffffffff614a7a16565b602a55602654614c04906150d4565b50602054602654614c1c90600163ffffffff614c7c16565b811515614c2557fe5b06158015614c3557506001602654115b15614c4257614c42615247565b6026546040805184815290517ff74223d764da704d974281758065d2eb6c9066dc940e3f549b72e894b0404aef9181900360200190a25050565b600082821115614c8b57600080fd5b50900390565b600081118015614cb95750600160a060020a0382166000908152603f60205260409020548111155b1515614cc457600080fd5b600160a060020a0382166000818152603e6020908152604080832085845282528083205493835290819052902054614d019163ffffffff614c7c16565b600160a060020a03831660008181526040602081815281832094909455603e8452808220603f808652828420805485528287528385208886528486208154815560019182015490820155845180860186528681528089018781528354885294895294862094518555925193830193909355939092529190925254614d8491614c7c565b600160a060020a039092166000908152603f602052604090209190915550565b6000808311614db257600080fd5b600160a060020a0384166000908152603f6020526040902054614ddc90600163ffffffff614a7a16565b600160a060020a0385166000908152603f60209081526040808320939093558290522054614e10908463ffffffff614a7a16565b600160a060020a0385166000818152604060208181528183209490945580518082018252878152808501878152848452603e8652828420603f87528385205485528652928290209051815591516001909201919091558051868152905191927f42e99fbad9601d25ee3bb515eeee966f97c3c383adadbe5720f651df8c18989d92918290030190a25060019392505050565b818102821580614ebc5750818382811515614eb957fe5b04145b1515611d7257600080fd5b336000908152603c6020908152604080832093835292905290812081815560010155565b614ef582826153f5565b50600160a060020a0382166000908152603d6020526040902054614f1f908263ffffffff614a7a16565b600160a060020a039092166000908152603d602052604090209190915550565b6000808311614f4d57600080fd5b600160a060020a0384166000908152603f6020526040902054614f7790600163ffffffff614a7a16565b600160a060020a03949094166000818152603f6020908152604080832088905580518082018252968752868201958652928252603e8152828220968252959095529093209151825551600191820155919050565b601154600c54600090614fe590429063ffffffff614c7c16565b90506000615000610258600e54614ea290919063ffffffff16565b90508082101561505a576150238161352f84601154614ea290919063ffffffff16565b60115561503783600463ffffffff614a5916565b60115410156150555761505183600463ffffffff614a5916565b6011555b6150a5565b6150738161352f84601154614ea290919063ffffffff16565b60115561508783600463ffffffff614ea216565b60115411156150a5576150a183600463ffffffff614ea216565b6011555b42600c55600f5460115410156150bc57600f546011555b60105460115411156150cf576010546011555b505050565b6000806026541115156150e657600080fd5b6000821180156150f857506026548211155b151561510357600080fd5b60008281526025602052604090208054151561511e57600080fd5b8054600090815260276020526040902054801561513a57600080fd5b6000600254600a0a6301406f40026003541015156151815761517a6c7e37be2022c0914b268000000061352f600454600354614ea290919063ffffffff16565b9050615186565b506005545b6151a464174876e80061352f60065484614ea290919063ffffffff16565b60048401556007546151c89064174876e8009061352f90849063ffffffff614ea216565b60058401556003546151e0908263ffffffff614a7a16565b60035530600090815260096020526040902054615203908263ffffffff614a7a16565b3060009081526009602090815260408083209390935585548252602790522081905560285461523990600163ffffffff614a7a16565b602855506001949350505050565b6020546026546000918291829182916152659163ffffffff614c7c16565b90505b60265461527c90600163ffffffff614c7c16565b81116152d5576000818152602560205260409020600601546152a590849063ffffffff614a7a16565b6000828152602560205260409020600701549093506152cb90839063ffffffff614a7a16565b9150600101615268565b506152e6828263ffffffff614a7a16565b15156152f657611388925061531e565b61531b615309838363ffffffff614a7a16565b61352f8461271063ffffffff614ea216565b92505b60235483101561537c5760235460009061533e908563ffffffff614c7c16565b905061537361536461271061352f846144e5611194601f54614c7c90919063ffffffff16565b601f549063ffffffff614c7c16565b601f55506153cb565b600061539360235485614c7c90919063ffffffff16565b90506153c66153b761271061352f84601f5461271003614ea290919063ffffffff16565b601f549063ffffffff614a7a16565b601f55505b611194601f5410156153de57611194601f555b6126ac601f5411156150cf576126ac601f55505050565b600080821161540357600080fd5b600160a060020a0383166000908152603f602052604090205461542d90600163ffffffff614a7a16565b600160a060020a0384166000908152603f60209081526040808320939093558290522054615461908363ffffffff614a7a16565b600160a060020a038416600090815260406020819052812091909155601a5461549190429063ffffffff614a7a16565b6040805180820182528581526020808201848152600160a060020a0389166000818152603e8452858120603f855286822054825284528590209351845590516001909301929092558251878152925193945090927f42e99fbad9601d25ee3bb515eeee966f97c3c383adadbe5720f651df8c18989d9281900390910190a25060019392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061555a57805160ff1916838001178555615587565b82800160010185558215615587579182015b8281111561558757825182559160200191906001019061556c565b50615593929150615597565b5090565b611db291905b80821115615593576000815560010161559d56fe446973636f766572696e67206f7572206265737420467574757265732e20416c6c2070726f706f73616c7320617265206d61646520756e6465722074686520437265617469766520436f6d6d6f6e73206c6963656e736520342e302e204b6576696e20576164a165627a7a72305820a5cd15fb8a7b562dc4664ff38498fb4da05d55ec6573729d7f6af4ce097e8bec0029
Deployed Bytecode
0x608060405260043610610608576000357c0100000000000000000000000000000000000000000000000000000000900480636de9f32b11610329578063b5ade81b116101b7578063d74ce8c511610109578063ea4a1104116100b2578063f8c12e2c1161008c578063f8c12e2c14611bc6578063f8d8268314611bf0578063fc84abb714611c1a57610608565b8063ea4a110414611afe578063ecd3cb8214611b69578063f08a01f814611b9357610608565b8063e47e25a2116100e3578063e47e25a214611a95578063e723b9d914611abf578063e729798e14611ae957610608565b8063d74ce8c514611a30578063dc6e9cf914611a45578063dd62ed3e14611a5a57610608565b8063c7bef6ee1161016b578063d03150c611610145578063d03150c6146119d3578063d40170d7146119e8578063d732b835146119fd57610608565b8063c7bef6ee14611976578063cb9ae707146119a9578063cf70fa40146119be57610608565b8063be7d798e1161019c578063be7d798e146118f8578063bf6fc7251461190d578063c19885761461194657610608565b8063b5ade81b146118ce578063b6407769146118e357610608565b80638a769d351161027b578063a5ec87e411610224578063b31102e2116101fe578063b31102e2146117d6578063b4ef00f014611806578063b54f31db146118b957610608565b8063a5ec87e414611773578063a9059cbb14611788578063b01ab0b2146117c157610608565b806395d89b411161025557806395d89b411461171357806397566aa014611728578063996901781461175e57610608565b80638a769d351461166d5780638ae0368b146116825780639386775a1461169757610608565b806375165280116102dd578063841218ee116102b7578063841218ee1461160457806387a2a9d61461162e578063888589851461164357610608565b8063751652801461157a57806381269a56146115b3578063829965cc146115ef57610608565b80636fd396d61161030e5780636fd396d614611501578063700669511461153257806370a082311461154757610608565b80636de9f32b146114d75780636fbbbf1d146114ec57610608565b8063366c41a3116104a65780634ef37628116103f85780635a2bc22d116103a157806362adb2e11161037b57806362adb2e1146113335780636352170f146113635780636bb5a5821461142457610608565b80635a2bc22d146111ce5780635dbdda69146112eb5780635dfa73961461130057610608565b806357084164116103d25780635708416414611134578063584b62a1146111675780635965916f146111b957610608565b80634ef37628146110d4578063509fce5b146110e95780635327d4af146110fe57610608565b80633c5e64d11161045a57806346459b221161043457806346459b2214610f6e578063490203a7146110175780634b44c6aa1461102c57610608565b80633c5e64d114610de8578063410e1b0714610f29578063424d389414610f3e57610608565b806337eed2d61161048b57806337eed2d614610da95780633925bfe714610dbe5780633ab3429014610dd357610608565b8063366c41a314610d7f578063370ef54f14610d9457610608565b80631dcc83a91161055f5780632e1750041161051357806332e99708116104ed57806332e9970814610b3057806332ed5b1214610b45578063356df5ee14610d5557610608565b80632e17500414610af15780632f40907c14610b06578063313ce56714610b1b57610608565b806322ae4ccf1161054457806322ae4ccf14610a4b57806323b872dd14610a7b57806327e235e314610abe57610608565b80631dcc83a9146107e3578063229cb73c14610a3657610608565b80631081a47e116105c15780631801fbe51161059b5780631801fbe51461078957806318160ddd146107b95780631853f0a8146107ce57610608565b80631081a47e14610735578063163aa00d1461075f57806317da485f1461077457610608565b806306fdde03116105f257806306fdde0314610649578063095ea7b3146106d35780630dbc6c551461072057610608565b8062e6e5531461060d578063047fc9aa14610634575b600080fd5b34801561061957600080fd5b50610622611c4d565b60408051918252519081900360200190f35b34801561064057600080fd5b50610622611c53565b34801561065557600080fd5b5061065e611c59565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610698578181015183820152602001610680565b50505050905090810190601f1680156106c55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106df57600080fd5b5061070c600480360360408110156106f657600080fd5b50600160a060020a038135169060200135611ce7565b604080519115158252519081900360200190f35b34801561072c57600080fd5b50610622611d78565b34801561074157600080fd5b506106226004803603602081101561075857600080fd5b5035611d7e565b34801561076b57600080fd5b50610622611d90565b34801561078057600080fd5b50610622611d96565b34801561079557600080fd5b5061070c600480360360408110156107ac57600080fd5b5080359060200135611db5565b3480156107c557600080fd5b50610622612030565b3480156107da57600080fd5b50610622612036565b3480156107ef57600080fd5b50610a34600480360360c081101561080657600080fd5b8135919081019060408101602082013564010000000081111561082857600080fd5b82018360208201111561083a57600080fd5b8035906020019184600183028401116401000000008311171561085c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156108af57600080fd5b8201836020820111156108c157600080fd5b803590602001918460018302840111640100000000831117156108e357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561093657600080fd5b82018360208201111561094857600080fd5b8035906020019184600183028401116401000000008311171561096a57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156109bd57600080fd5b8201836020820111156109cf57600080fd5b803590602001918460018302840111640100000000831117156109f157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061203c915050565b005b348015610a4257600080fd5b50610622612531565b348015610a5757600080fd5b50610a3460048036036040811015610a6e57600080fd5b508035906020013561254a565b348015610a8757600080fd5b5061070c60048036036060811015610a9e57600080fd5b50600160a060020a0381358116916020810135909116906040013561267e565b348015610aca57600080fd5b5061062260048036036020811015610ae157600080fd5b5035600160a060020a0316612789565b348015610afd57600080fd5b5061062261279b565b348015610b1257600080fd5b506106226127a1565b348015610b2757600080fd5b506106226127a7565b348015610b3c57600080fd5b506106226127ad565b348015610b5157600080fd5b50610b6f60048036036020811015610b6857600080fd5b50356127b3565b604051808b81526020018a815260200189815260200188815260200187815260200186600160a060020a0316600160a060020a0316815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b83811015610bee578181015183820152602001610bd6565b50505050905090810190601f168015610c1b5780820380516001836020036101000a031916815260200191505b5085810384528851815288516020918201918a019080838360005b83811015610c4e578181015183820152602001610c36565b50505050905090810190601f168015610c7b5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015610cae578181015183820152602001610c96565b50505050905090810190601f168015610cdb5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610d0e578181015183820152602001610cf6565b50505050905090810190601f168015610d3b5780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b348015610d6157600080fd5b5061062260048036036020811015610d7857600080fd5b5035612a38565b348015610d8b57600080fd5b50610622612a4a565b348015610da057600080fd5b50610622612a50565b348015610db557600080fd5b50610622612a56565b348015610dca57600080fd5b50610622612a5c565b348015610ddf57600080fd5b50610622612a62565b348015610df457600080fd5b50610a3460048036036060811015610e0b57600080fd5b81359190810190604081016020820135640100000000811115610e2d57600080fd5b820183602082011115610e3f57600080fd5b80359060200191846001830284011164010000000083111715610e6157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050640100000000811115610eb457600080fd5b820183602082011115610ec657600080fd5b80359060200191846001830284011164010000000083111715610ee857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612a68945050505050565b348015610f3557600080fd5b50610622612c2d565b348015610f4a57600080fd5b5061062260048036036040811015610f6157600080fd5b5080359060200135612c33565b348015610f7a57600080fd5b50610f9860048036036020811015610f9157600080fd5b5035612c50565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610fdb578181015183820152602001610fc3565b50505050905090810190601f1680156110085780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561102357600080fd5b50610622612cf7565b34801561103857600080fd5b506110566004803603602081101561104f57600080fd5b5035612d17565b604051808d81526020018c81526020018b81526020018a600381111561107857fe5b60ff16815260200189600381111561108c57fe5b60ff1681529715156020890152506040808801969096526060870194909452608086019290925260a085015260c084015260e083015251908190036101000195509350505050f35b3480156110e057600080fd5b50610622612d7b565b3480156110f557600080fd5b50610622612d81565b34801561110a57600080fd5b50610a346004803603606081101561112157600080fd5b5080359060208101359060400135612d87565b34801561114057600080fd5b506106226004803603602081101561115757600080fd5b5035600160a060020a0316612ef3565b34801561117357600080fd5b506111a06004803603604081101561118a57600080fd5b50600160a060020a038135169060200135612f05565b6040805192835260208301919091528051918290030190f35b3480156111c557600080fd5b5061065e612f29565b3480156111da57600080fd5b506111f8600480360360208110156111f157600080fd5b5035612f46565b604051808681526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561124b578181015183820152602001611233565b50505050905090810190601f1680156112785780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156112ab578181015183820152602001611293565b50505050905090810190601f1680156112d85780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b3480156112f757600080fd5b5061062261309e565b34801561130c57600080fd5b506106226004803603602081101561132357600080fd5b5035600160a060020a03166130a4565b34801561133f57600080fd5b506106226004803603604081101561135657600080fd5b50803590602001356130bf565b34801561136f57600080fd5b50610a346004803603606081101561138657600080fd5b81359160208101351515918101906060810160408201356401000000008111156113af57600080fd5b8201836020820111156113c157600080fd5b803590602001918460018302840111640100000000831117156113e357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506130dc945050505050565b34801561143057600080fd5b50610a346004803603602081101561144757600080fd5b81019060208101813564010000000081111561146257600080fd5b82018360208201111561147457600080fd5b8035906020019184600183028401116401000000008311171561149657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061385d945050505050565b3480156114e357600080fd5b50610622613b2b565b3480156114f857600080fd5b50610622613b31565b34801561150d57600080fd5b50611516613b37565b60408051600160a060020a039092168252519081900360200190f35b34801561153e57600080fd5b50610622613b46565b34801561155357600080fd5b506106226004803603602081101561156a57600080fd5b5035600160a060020a0316613b4c565b34801561158657600080fd5b506111a06004803603604081101561159d57600080fd5b50600160a060020a038135169060200135613b67565b3480156115bf57600080fd5b5061070c600480360360808110156115d657600080fd5b5080359060208101359060408101359060600135613b8b565b3480156115fb57600080fd5b50610622613be5565b34801561161057600080fd5b506106226004803603602081101561162757600080fd5b5035613beb565b34801561163a57600080fd5b50610622613bfd565b34801561164f57600080fd5b506106226004803603602081101561166657600080fd5b5035613c03565b34801561167957600080fd5b50610622613c15565b34801561168e57600080fd5b50610622613c1b565b3480156116a357600080fd5b506116d0600480360360408110156116ba57600080fd5b5080359060200135600160a060020a0316613c21565b604080519788529515156020880152931515868601526060860192909252600160a060020a0316608085015260a0840152151560c0830152519081900360e00190f35b34801561171f57600080fd5b5061065e613c77565b34801561173457600080fd5b506106226004803603606081101561174b57600080fd5b5080359060208101359060400135613cd1565b34801561176a57600080fd5b50610622613d17565b34801561177f57600080fd5b50610622613d1d565b34801561179457600080fd5b5061070c600480360360408110156117ab57600080fd5b50600160a060020a038135169060200135613d23565b3480156117cd57600080fd5b50610a34613de1565b3480156117e257600080fd5b50610a34600480360360408110156117f957600080fd5b5080359060200135613e7e565b34801561181257600080fd5b506106226004803603602081101561182957600080fd5b81019060208101813564010000000081111561184457600080fd5b82018360208201111561185657600080fd5b8035906020019184600183028401116401000000008311171561187857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613f6f945050505050565b3480156118c557600080fd5b50610622613fd7565b3480156118da57600080fd5b50610622613fdd565b3480156118ef57600080fd5b50610622613fe3565b34801561190457600080fd5b50610622613fe9565b34801561191957600080fd5b5061070c6004803603604081101561193057600080fd5b50600160a060020a038135169060200135613fef565b34801561195257600080fd5b506106226004803603604081101561196957600080fd5b5080359060200135614031565b34801561198257600080fd5b506106226004803603602081101561199957600080fd5b5035600160a060020a031661404e565b3480156119b557600080fd5b50610622614060565b3480156119ca57600080fd5b50610622614066565b3480156119df57600080fd5b5061062261406c565b3480156119f457600080fd5b50610622614072565b348015611a0957600080fd5b5061062260048036036020811015611a2057600080fd5b5035600160a060020a0316614078565b348015611a3c57600080fd5b5061062261408a565b348015611a5157600080fd5b50610622614090565b348015611a6657600080fd5b5061062260048036036040811015611a7d57600080fd5b50600160a060020a0381358116916020013516614096565b348015611aa157600080fd5b5061062260048036036020811015611ab857600080fd5b50356140c1565b348015611acb57600080fd5b5061062260048036036020811015611ae257600080fd5b50356140d3565b348015611af557600080fd5b506106226140e5565b348015611b0a57600080fd5b50611b2860048036036020811015611b2157600080fd5b50356140eb565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b348015611b7557600080fd5b50610a3460048036036020811015611b8c57600080fd5b503561412e565b348015611b9f57600080fd5b5061062260048036036020811015611bb657600080fd5b5035600160a060020a0316614299565b348015611bd257600080fd5b50610a3460048036036020811015611be957600080fd5b50356142b4565b348015611bfc57600080fd5b5061062260048036036020811015611c1357600080fd5b5035614a35565b348015611c2657600080fd5b5061062260048036036020811015611c3d57600080fd5b5035600160a060020a0316614a47565b60075481565b60035481565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611cdf5780601f10611cb457610100808354040283529160200191611cdf565b820191906000526020600020905b815481529060010190602001808311611cc257829003601f168201915b505050505081565b33600090815260096020526040812054821115611d0357600080fd5b60008211611d1057600080fd5b336000818152600a60209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60225481565b602d6020526000908152604090205481565b60155481565b6000611daf601154601054614a5990919063ffffffff16565b90505b90565b601254604080516020808201939093526c0100000000000000000000000033028183015260548082018690528251808303909101815260749091019091528051910120600090828114611e0757600080fd5b601154811115611e1657600080fd5b60125460009081526016602052604090208054908290558015611e3857600080fd5b600254600a0a621cd6d0026017541115611f0557600254600a0a6260216002601754101515611e81576801153d1a61fa067d1c601355690443a097e1c8798c9f30600555611f05565b600254600a0a62367950026017541015611eb5576801bb94f70329a3fb606013556901b4a6a3271cfd6b72b8600555611f05565b600254600a0a624ce780026017541015611ee957680184225822c46f7bf460135569028ef9f4baab7c212c78600555611f05565b68014cafb9425f3afc886013556903694d464e39fad6e5d46005555b601354601754611f1a9163ffffffff614a7a16565b6017819055600b5411611f2957fe5b601354600354611f3e9163ffffffff614a7a16565b60035560135433600090815260096020526040902054611f639163ffffffff614a7a16565b336000818152600960205260409020919091556014805473ffffffffffffffffffffffffffffffffffffffff1916909117905543601555611fa2614a8a565b601354600d54601254604080519384526020840192909252828201525133917fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d919081900360600190a26013546040805191825251339130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3506001949350505050565b60035490565b602a5481565b6000868152602d60205260408120541180156120685750602c546000878152602d602052604090205411155b151561207357600080fd5b6000868152602d60209081526040808320548352602b909152902054861461209a57600080fd5b6036548111156120a957600080fd5b600083876040516020018080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156120f35781810151838201526020016120db565b50505050905090810190601f1680156121205780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152918152815160209283012060008e8152603090935291205490955061216094509250600191505063ffffffff614a7a16565b6000888152603060209081526040808320849055602f82528083209383529290522081905560335461219990600163ffffffff614a7a16565b603381905560009081526032602090815260408083208490558383526031909152902060010154801515806121db575060008281526031602052604090205415155b156121e557600080fd5b60006121fc60195442614a5990919063ffffffff16565b600081815260296020526040902054909150151561221c5761221c614b03565b60008381526031602090815260408083206033548155600281018d90558484526029835292205460038301556001820185905560058201805473ffffffffffffffffffffffffffffffffffffffff1916331790558951612284916006840191908c0190615519565b50875161229a90600783019060208b0190615519565b5086516122b090600983019060208a0190615519565b5085516122c69060088301906020890190615519565b506000848152603460205260408120600381018054600260ff199091161762ff00001916620100001761ff0019166102001790556004810182905560058101829055600681018290556007810182905560088101829055600981019190915542808255601b546123369190614a7a565b6001820155601e54336000908152603d6020526040902054101561235957600080fd5b601e54336000908152603d602052604090205461237b9163ffffffff614c7c16565b336000908152603d6020908152604080832093909355601e546041909152919020546123ac9163ffffffff614a7a16565b33600081815260416020908152604080832094909455600186810154808452603b83528584208585528352858420908155808201805461ff001960ff199091169093178316610100179055601e5460028201556003808201805473ffffffffffffffffffffffffffffffffffffffff19169096179095554260048201559386018054909116610300179055898252603590529190912054801580159061246257506000888152603560205260409020600101548d145b156124b957600484018890556000888152603a602052604090205461248e90600163ffffffff614a7a16565b6000898152603a60209081526040808320849055600188015460388352818420948452939091529020555b60188054604080516020808201939093528082018b905281518082038301815260608201808452815191909401209093556002870154918a9052518a9233917ff20f961bd89931f54768689d741307497501063bee5847fc3fcaa72b026d18599181900360800190a450505050505050505050505050565b6000611daf600854600354614c7c90919063ffffffff16565b600a821161255757600080fd5b336000908152603d602052604090205482111561257357600080fd5b336000908152603d6020526040902054612593908363ffffffff614c7c16565b336000908152603d60209081526040808320939093556041905220546125bf908363ffffffff614a7a16565b33600090815260416020908152604080832093909355603c8152828220848352905220546125f3908363ffffffff614a7a16565b336000818152603c6020908152604080832086845282529182902093845542600190940193909355601880548251808601919091528083018690528251808203840181526060820180855281519190960120909155928490525190917f0290e16ca163280238cff6bd42c77cb055d3ff42239fe48bc5b8ec6edf5065c9919081900360800190a25050565b600160a060020a0383166000908152600960205260408120546126a7908363ffffffff614c7c16565b600160a060020a038516600090815260096020908152604080832093909355600a8152828220338352905220546126e4908363ffffffff614c7c16565b600160a060020a038086166000908152600a60209081526040808320338452825280832094909455918616815260099091522054612728908363ffffffff614a7a16565b600160a060020a0380851660008181526009602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b60096020526000908152604090205481565b601a5481565b60365481565b60025481565b60115490565b60316020908152600091825260409182902080546001808301546002808501546003860154600487015460058801546006890180548c51601f6000199a831615610100029a909a01909116969096049788018b90048b0286018b01909b5286855296999498929791969095600160a060020a039091169491939283018282801561287e5780601f106128535761010080835404028352916020019161287e565b820191906000526020600020905b81548152906001019060200180831161286157829003601f168201915b5050505060078301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561290e5780601f106128e35761010080835404028352916020019161290e565b820191906000526020600020905b8154815290600101906020018083116128f157829003601f168201915b5050505060088301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561299e5780601f106129735761010080835404028352916020019161299e565b820191906000526020600020905b81548152906001019060200180831161298157829003601f168201915b5050505060098301805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152949594935090830182828015612a2e5780601f10612a0357610100808354040283529160200191612a2e565b820191906000526020600020905b815481529060010190602001808311612a1157829003601f168201915b505050505090508a565b60326020526000908152604090205481565b601d5481565b601b5481565b60245481565b601c5481565b601f5481565b6000838152602d6020526040812054118015612a945750602c546000848152602d602052604090205411155b1515612a9f57600080fd5b6000838152602d60209081526040808320548352602b9091529020548314612ac657600080fd5b601d54600090612add90601463ffffffff614a5916565b33600090815260096020526040902054909150811115612afc57600080fd5b612b063082613d23565b50603654612b1b90600163ffffffff614a7a16565b603655600084815260396020526040902054612b3e90600163ffffffff614a7a16565b600085815260396020908152604080832084815560365460378452828520958552948352818420859055815160a0810183528581528084018a81529154818401908152606082018a8152608083018a9052968652603585529290942084518155905160018201559051600282015592518051929392612bc39260038501920190615519565b5060808201518051612bdf916004840191602090910190615519565b5050600854612bf591508263ffffffff614a7a16565b6008556036546040518591907fb733708a2586752275a4854aac54c7bb263ad67859f07d16147feea53ca009d790600090a350505050565b600b5481565b603760209081526000928352604080842090915290825290205481565b602b602090815260009182526040918290208054600180830180548651600293821615610100026000190190911692909204601f810186900486028301860190965285825291949293909290830182828015612ced5780601f10612cc257610100808354040283529160200191612ced565b820191906000526020600020905b815481529060010190602001808311612cd057829003601f168201915b5050505050905082565b6000600b54601754111515612d0f5750601354611db2565b506000611db2565b603460205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460099099015497989697959660ff8087169761010088048216976201000090049091169594939291908c565b60125490565b60085481565b612d9b426303c2670063ffffffff614a7a16565b8310612da657600080fd5b60328111158015612dc65750336000908152603f60205260409020548111155b1515612dd157600080fd5b6000806001805b848111612ed457336000908152603f6020526040902054600211612ecc57336000908152603f60205260409020548111612e1457809150612e31565b612e24818463ffffffff614c7c16565b91506001821015612e3157fe5b336000908152603e602090815260408083208584529091529020600101548710801590612e7b5750336000908152603e602090815260408083208584529091529020600101548611155b15612ecc57336000908152603e60209081526040808320858452909152902054612eac90859063ffffffff614a7a16565b9350612eb83383614c91565b612ec983600163ffffffff614a7a16565b92505b600101612dd8565b506000831115612eeb57612ee9338488614da4565b505b505050505050565b603d6020526000908152604090205481565b603e6020908152600092835260408084209091529082529020805460019091015482565b60a060405190810160405280606681526020016155b26066913981565b6035602052806000526040600020600091509050806000015490806001015490806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130045780601f10612fd957610100808354040283529160200191613004565b820191906000526020600020905b815481529060010190602001808311612fe757829003601f168201915b5050505060048301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156130945780601f1061306957610100808354040283529160200191613094565b820191906000526020600020905b81548152906001019060200180831161307757829003601f168201915b5050505050905085565b60195481565b600160a060020a03166000908152603f602052604090205490565b602f60209081526000928352604080842090915290825290205481565b600083833384604051602001808581526020018415151515815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561314a578181015183820152602001613132565b50505050905090810190601f1680156131775780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181528151602092830120336000908152603c8452828120828252909352908220549098501195506131bc94505050505057600080fd5b6000848152603160205260408120805490911080156131de5750848160010154145b15156131e957600080fd5b6000858152603460209081526040808320600180820154338652603c8552838620888752909452919093200154111561322157600080fd5b80600101544211801561324a5750601c5460018201546132469163ffffffff614a7a16565b4211155b151561325557600080fd5b6002600382810154610100900460ff169081111561326f57fe5b141561327a57600080fd5b600881015460098201546003840154600090815260256020908152604080832060018801548452603b835281842033855290925290912054801515806132e0575060018601546000908152603b6020908152604080832033845290915290206002015415155b156132ea57600080fd5b6000603b600088600101548152602001908152602001600020600033600160a060020a0316600160a060020a03168152602001908152602001600020905086600101548160000181905550898160010160006101000a81548160ff02191690831515021790555060008160010160016101000a81548160ff021916908315150217905550603c600033600160a060020a0316600160a060020a031681526020019081526020016000206000898152602001908152602001600020600001548160020181905550338160030160006101000a815481600160a060020a030219169083600160a060020a031602179055504281600401819055506133fa60018760040154614a7a90919063ffffffff16565b6004870155891561343e57336000908152603c602090815260408083208b845290915290205460068701546134349163ffffffff614a7a16565b6006870155613473565b336000908152603c602090815260408083208b8452909152902054600787015461346d9163ffffffff614a7a16565b60078701555b6007860154600687015460009182918291613494919063ffffffff614a7a16565b905060006134b16127108b60060154614ea290919063ffffffff16565b601f549091506000906134ca838563ffffffff614a5916565b11156134d557600194505b601f546134e8838563ffffffff614a5916565b14156134f357600193505b60038b01805462ff000019166201000086151502179055841561356c5761353b61271061352f85601f5461271003614ea290919063ffffffff16565b9063ffffffff614a5916565b905061355a8161352f6127108e60070154614ea290919063ffffffff16565b61271081900360058d015590506135b4565b61358761271061352f601f5486614ea290919063ffffffff16565b90506135a68161352f6127108e60060154614ea290919063ffffffff16565b61271081900360058d015590505b60008b60050154101580156135cf57506127108b6005015411155b15156135da57600080fd5b600085156135e6575060015b6003808d810154610100900460ff16908111156135ff57fe5b141561364c57851561362b57600689015461362190600163ffffffff614a7a16565b60068a0155613647565b600789015461364190600163ffffffff614a7a16565b60078a01555b6136fb565b60038c810154610100900460ff169081111561366457fe5b81600381111561367057fe5b146136fb57600181600381111561368357fe5b14156136c457600789015461369f90600163ffffffff614c7c16565b60078a015560068901546136ba90600163ffffffff614a7a16565b60068a01556136fb565b60068901546136da90600163ffffffff614c7c16565b60068a015560078901546136f590600163ffffffff614a7a16565b60078a01555b841561374f5760038c01805461ff0019169055600060088d0181905560098d0155600289015461372b908c614c7c565b60028a01556003890154613745908b63ffffffff614c7c16565b60038a0155613811565b85156137bd5760038c01805461ff00191661010017905560068c015460088d0181905560098d0181905560028a0154613799919061378d908e614c7c565b9063ffffffff614a7a16565b60028a015560098c015460038a0154613745919061378d908d63ffffffff614c7c16565b60038c01805461ff001916905560078c015460088d01819055600060098e015560028a01546137f1919061378d908e614c7c565b60028a0155600389015461380b908b63ffffffff614c7c16565b60038a01555b61381a8e614ec7565b60018d015460405133907f80db1ea9846ea83629eeccaca574eaa17279cf1b4ae562df64a1ab7cde5958cc90600090a35050505050505050505050505050505050565b601d5433600090815260096020526040902054101561387b57600080fd5b61388730601d54613d23565b50601d5460085461389d9163ffffffff614a7a16565b6008819055506000816040516020018080602001828103825283818151815260200191508051906020019080838360005b838110156138e65781810151838201526020016138ce565b50505050905090810190601f1680156139135780820380516001836020036101000a031916815260200191505b50925050506040516020818303038152906040528051906020012090506139466001602c54614a7a90919063ffffffff16565b602c556000818152602d60205260409020541561396257600080fd5b602e826040518082805190602001908083835b602083106139945780518252601f199092019160209182019101613975565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220541591506139ce905057600080fd5b6040805180820182528281526020808201858152602c546000908152602b8352939093208251815592518051929392613a0d9260018501920190615519565b50905050602c54602d60008381526020019081526020016000208190555080602e836040518082805190602001908083835b60208310613a5e5780518252601f199092019160209182019101613a3f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201852095909555602c54818552875185830152875190957f830578780908e1ff0fbde38777892998c31b30c39451a5a3b0e99cbf7bd781df9589955093508392908301919085019080838360005b83811015613aed578181015183820152602001613ad5565b50505050905090810190601f168015613b1a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60175481565b602c5481565b601454600160a060020a031681565b60215481565b600160a060020a031660009081526009602052604090205490565b603c6020908152600092835260408084209091529082529020805460019091015482565b6040805160208082018590526c010000000000000000000000003302828401526054808301889052835180840390910181526074909201909252805191012060009082811115613bda57600080fd5b909314949350505050565b600d5481565b60306020526000908152604090205481565b60105481565b60296020526000908152604090205481565b60115481565b60125481565b603b602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600590950154939460ff80851695610100909504811694600160a060020a03909316921687565b60018054604080516020600284861615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611cdf5780601f10611cb457610100808354040283529160200191611cdf565b6040805160208082018490526c01000000000000000000000000330282840152605480830187905283518084039091018152607490920190925280519101209392505050565b601e5481565b60335481565b6000808211613d3157600080fd5b33600090815260096020526040902054613d51908363ffffffff614c7c16565b3360009081526009602052604080822092909255600160a060020a03851681522054613d83908363ffffffff614a7a16565b600160a060020a0384166000818152600960209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600254600a0a6301406f400260035410151515613dfd57600080fd5b6026546034900615613e0e57600080fd5b6000613e336509184e72a00061352f6302d69be6600354614ea290919063ffffffff16565b90506000613e5a655af3107a400061352f6302d69be6600354614ea290919063ffffffff16565b601e819055601d83905560265460245491925011613e7457fe5b5050602654602455565b60008111613e8b57600080fd5b600082118015613eaa5750336000908152603f60205260409020548211155b1515613eb557600080fd5b336000908152603e60209081526040808320858452909152902080548210613edc57600080fd5b8054600090613ef1908463ffffffff614c7c16565b838355336000908152603f6020526040902054909150613f1890600163ffffffff614a7a16565b336000818152603f6020908152604080832085905580518082018252868152600180890154828501908152958552603e845282852096855295909252822090518155915191909201558111613f6957fe5b50505050565b6000602e826040518082805190602001908083835b60208310613fa35780518252601f199092019160209182019101613f84565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054949350505050565b60065481565b600e5481565b60045481565b60205481565b600033600160a060020a0384161461400657600080fd5b6000821161401357600080fd5b61401d3083613d23565b506140288383614eeb565b50600192915050565b603860209081526000928352604080842090915290825290205481565b60406020819052600091825290205481565b600c5481565b60135481565b60285481565b60055481565b603f6020526000908152604090205481565b60265481565b600f5481565b600160a060020a039182166000908152600a6020908152604080832093909416825291909152205490565b603a6020526000908152604090205481565b60396020526000908152604090205481565b60235481565b6025602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909188565b60008111801561414d5750336000908152603f60205260409020548111155b151561415857600080fd5b336000908152603e6020908152604080832084845290915290206001810154421161418257600080fd5b3360009081526041602090815260408083205491819052909120546141ac9163ffffffff614c7c16565b815411156141b957600080fd5b8054306000908152600960205260409020546141da9163ffffffff614c7c16565b30600090815260096020526040808220929092558254338252919020546142069163ffffffff614a7a16565b3360008181526009602090815260409182902093909355835481519081529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a38054604080519182525133917f2aeea59856f5616c244717fd488ead1d1b5fd33608d9583a4607b4c4ba3631e4919081900360200190a26142953383614c91565b5050565b600160a060020a03166000908152603d602052604090205490565b6000818152603160205260408120805490911080156142d65750818160010154145b15156142e157600080fd5b6000828152603460205260409020601c5460018201546143069163ffffffff614a7a16565b421161431157600080fd5b60018201546000908152603b6020908152604080832033845290915290208054841461433c57600080fd5b600581015460ff161561434e57600080fd5b60058101805460ff191660011790556002810154336000908152604160205260409020546143819163ffffffff614c7c16565b3360009081526041602090815260408083209390935560038601548252602590529081206019549091906143bc90429063ffffffff614a5916565b905060006143e2600161378d60195461352f601c54601b54614a7a90919063ffffffff16565b60018401549091506143fa908263ffffffff614a7a16565b82101561440657600080fd5b600260038087015460ff169081111561441b57fe5b1415614469576001600386810154610100900460ff169081111561443b57fe5b14156144555760038501805460ff19166001179055614462565b60038501805460ff191690555b4260028601555b600385015462010000900460ff161515612ee957600184015460009060ff1615614491575060015b60038087015460ff16908111156144a457fe5b8160038111156144b057fe5b1461486f5760008560020154905060006144f161271061352f8a600501546144e5602154601a54614ea290919063ffffffff16565b9063ffffffff614ea216565b6001880154909150610100900460ff161561451d5760225461451a90829063ffffffff614ea216565b90505b612328886005015411156146d757600061454a606461352f60218b60020154614ea290919063ffffffff16565b6001890154909150610100900460ff1615614566575060028701545b8754604080518381526020810192909252805133927f53ef86fe8b545e88c8078a71aa8a9be4140e6f140b4e36f0ffee9207cf1ee89692908290030190a26008546145b7908263ffffffff614a7a16565b60085560028801546145cf908263ffffffff614c7c16565b925060015b336000908152603f602052604090205481116146d457336000908152603e6020908152604080832084845290915290205482101561468857336000908152603e60209081526040808320848452909152902054614637908363ffffffff614c7c16565b336000818152603e6020908152604080832086845282528083209490945591815290829052205461466e908363ffffffff614c7c16565b3360009081526040602081905281209190915591506146d4565b336000908152603e602090815260408083208484529091529020546146b490839063ffffffff614c7c16565b91506146c03382614c91565b8115156146cc576146d4565b6001016145d4565b50505b6000821115614868578654604080518481526020810192909252805133927f29ddc6e588094281b6a071214828b237ac1451c1611bce535a86790aea70074792908290030190a260015b336000908152603f6020526040902054811161486657336000908152603e6020908152604080832084845290915290205483106147c757336000908152603e60209081526040808320848452909152902060010154614786908363ffffffff614a7a16565b336000908152603e6020908152604080832085845290915290206001810191909155546147b4908490614c7c565b92508215156147c257614866565b61485e565b336000908152603e602090815260408083208484529091528120546147f2908563ffffffff614c7c16565b336000908152603e6020908152604080832086845290915290206001810154908690559091506148228185614a7a565b336000908152603e6020908152604080832087845290915281206001019190915582111561485757614855338383614f3f565b505b5050614866565b600101614721565b505b5050614a2b565b6002840154600090811061488257600080fd5b6001860154610100900460ff1615156148cb576148c86148bb866002015461352f88600401548a60020154614ea290919063ffffffff16565b829063ffffffff614a7a16565b90505b6001860154610100900460ff1680156148f65750600160038089015460ff16908111156148f457fe5b145b1561493557600385015460001061490c57600080fd5b6149326148bb866003015461352f88600501548b60090154614ea290919063ffffffff16565b90505b6005850154600486015461494e9163ffffffff614a7a16565b81111561495a57600080fd5b3060009081526009602052604090205461497a908263ffffffff614c7c16565b306000908152600960205260408082209290925533815220546149a3908263ffffffff614a7a16565b336000818152600960209081526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a360408051828152602081018b9052815133927fe413caa6d70a6d9b51c2af2575a2914490f614355049af8ae7cde5caab9fd201928290030190a2505b5050505050505050565b60276020526000908152604090205481565b60416020526000908152604090205481565b6000808211614a6757600080fd5b8183811515614a7257fe5b049392505050565b81810182811015611d7257600080fd5b600d54614a9e90600163ffffffff614a7a16565b600d819055600e5490811515614ab057fe5b061515614abf57614abf614fcb565b614ad043600163ffffffff614c7c16565b60185460408051924060208085019190915283820192909252805180840382018152606090930190528151910120601255565b6000614b1a60195442614a5990919063ffffffff16565b6000818152602960205260409020549091508015614b3757600080fd5b602654614b4b90600163ffffffff614a7a16565b6026818155604080516101008101825283815260208082018781526000838501818152606085018281526080860183815260a0870184815260c0880185815260e089018681529b8652602588528986209851895595516001808a0191909155935160028901559151600388015551600487015551600586015591516006850155955160079093019290925592548685526029909352922055602a54614bf59163ffffffff614a7a16565b602a55602654614c04906150d4565b50602054602654614c1c90600163ffffffff614c7c16565b811515614c2557fe5b06158015614c3557506001602654115b15614c4257614c42615247565b6026546040805184815290517ff74223d764da704d974281758065d2eb6c9066dc940e3f549b72e894b0404aef9181900360200190a25050565b600082821115614c8b57600080fd5b50900390565b600081118015614cb95750600160a060020a0382166000908152603f60205260409020548111155b1515614cc457600080fd5b600160a060020a0382166000818152603e6020908152604080832085845282528083205493835290819052902054614d019163ffffffff614c7c16565b600160a060020a03831660008181526040602081815281832094909455603e8452808220603f808652828420805485528287528385208886528486208154815560019182015490820155845180860186528681528089018781528354885294895294862094518555925193830193909355939092529190925254614d8491614c7c565b600160a060020a039092166000908152603f602052604090209190915550565b6000808311614db257600080fd5b600160a060020a0384166000908152603f6020526040902054614ddc90600163ffffffff614a7a16565b600160a060020a0385166000908152603f60209081526040808320939093558290522054614e10908463ffffffff614a7a16565b600160a060020a0385166000818152604060208181528183209490945580518082018252878152808501878152848452603e8652828420603f87528385205485528652928290209051815591516001909201919091558051868152905191927f42e99fbad9601d25ee3bb515eeee966f97c3c383adadbe5720f651df8c18989d92918290030190a25060019392505050565b818102821580614ebc5750818382811515614eb957fe5b04145b1515611d7257600080fd5b336000908152603c6020908152604080832093835292905290812081815560010155565b614ef582826153f5565b50600160a060020a0382166000908152603d6020526040902054614f1f908263ffffffff614a7a16565b600160a060020a039092166000908152603d602052604090209190915550565b6000808311614f4d57600080fd5b600160a060020a0384166000908152603f6020526040902054614f7790600163ffffffff614a7a16565b600160a060020a03949094166000818152603f6020908152604080832088905580518082018252968752868201958652928252603e8152828220968252959095529093209151825551600191820155919050565b601154600c54600090614fe590429063ffffffff614c7c16565b90506000615000610258600e54614ea290919063ffffffff16565b90508082101561505a576150238161352f84601154614ea290919063ffffffff16565b60115561503783600463ffffffff614a5916565b60115410156150555761505183600463ffffffff614a5916565b6011555b6150a5565b6150738161352f84601154614ea290919063ffffffff16565b60115561508783600463ffffffff614ea216565b60115411156150a5576150a183600463ffffffff614ea216565b6011555b42600c55600f5460115410156150bc57600f546011555b60105460115411156150cf576010546011555b505050565b6000806026541115156150e657600080fd5b6000821180156150f857506026548211155b151561510357600080fd5b60008281526025602052604090208054151561511e57600080fd5b8054600090815260276020526040902054801561513a57600080fd5b6000600254600a0a6301406f40026003541015156151815761517a6c7e37be2022c0914b268000000061352f600454600354614ea290919063ffffffff16565b9050615186565b506005545b6151a464174876e80061352f60065484614ea290919063ffffffff16565b60048401556007546151c89064174876e8009061352f90849063ffffffff614ea216565b60058401556003546151e0908263ffffffff614a7a16565b60035530600090815260096020526040902054615203908263ffffffff614a7a16565b3060009081526009602090815260408083209390935585548252602790522081905560285461523990600163ffffffff614a7a16565b602855506001949350505050565b6020546026546000918291829182916152659163ffffffff614c7c16565b90505b60265461527c90600163ffffffff614c7c16565b81116152d5576000818152602560205260409020600601546152a590849063ffffffff614a7a16565b6000828152602560205260409020600701549093506152cb90839063ffffffff614a7a16565b9150600101615268565b506152e6828263ffffffff614a7a16565b15156152f657611388925061531e565b61531b615309838363ffffffff614a7a16565b61352f8461271063ffffffff614ea216565b92505b60235483101561537c5760235460009061533e908563ffffffff614c7c16565b905061537361536461271061352f846144e5611194601f54614c7c90919063ffffffff16565b601f549063ffffffff614c7c16565b601f55506153cb565b600061539360235485614c7c90919063ffffffff16565b90506153c66153b761271061352f84601f5461271003614ea290919063ffffffff16565b601f549063ffffffff614a7a16565b601f55505b611194601f5410156153de57611194601f555b6126ac601f5411156150cf576126ac601f55505050565b600080821161540357600080fd5b600160a060020a0383166000908152603f602052604090205461542d90600163ffffffff614a7a16565b600160a060020a0384166000908152603f60209081526040808320939093558290522054615461908363ffffffff614a7a16565b600160a060020a038416600090815260406020819052812091909155601a5461549190429063ffffffff614a7a16565b6040805180820182528581526020808201848152600160a060020a0389166000818152603e8452858120603f855286822054825284528590209351845590516001909301929092558251878152925193945090927f42e99fbad9601d25ee3bb515eeee966f97c3c383adadbe5720f651df8c18989d9281900390910190a25060019392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061555a57805160ff1916838001178555615587565b82800160010185558215615587579182015b8281111561558757825182559160200191906001019061556c565b50615593929150615597565b5090565b611db291905b80821115615593576000815560010161559d56fe446973636f766572696e67206f7572206265737420467574757265732e20416c6c2070726f706f73616c7320617265206d61646520756e6465722074686520437265617469766520436f6d6d6f6e73206c6963656e736520342e302e204b6576696e20576164a165627a7a72305820a5cd15fb8a7b562dc4664ff38498fb4da05d55ec6573729d7f6af4ce097e8bec0029
Deployed Bytecode Sourcemap
19140:45731:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19111:8;;;3512:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3512:52:0;;;:::i;:::-;;;;;;;;;;;;;;;;3110:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3110:18:0;;;:::i;3006:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3006:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3006:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9755:280;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9755:280:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9755:280:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;20811:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20811:35:0;;;:::i;24690:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24690:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24690:45:0;;:::i;4897:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4897:36:0;;;:::i;17534:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17534:119:0;;;:::i;11202:3189::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11202:3189:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11202:3189:0;;;;;;;:::i;10470:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10470:81:0;;;:::i;24521:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24521:35:0;;;:::i;42760:4760::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42760:4760:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42760:4760:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;42760:4760:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42760:4760:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42760:4760:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42760:4760:0;;;;;;;;-1:-1:-1;42760:4760:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;42760:4760:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42760:4760:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42760:4760:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42760:4760:0;;;;;;;;-1:-1:-1;42760:4760:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;42760:4760:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42760:4760:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42760:4760:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42760:4760:0;;;;;;;;-1:-1:-1;42760:4760:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;42760:4760:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42760:4760:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42760:4760:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42760:4760:0;;-1:-1:-1;;42760:4760:0;;;-1:-1:-1;42760:4760:0;;-1:-1:-1;;42760:4760:0:i;:::-;;10559:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10559:109:0;;;:::i;48224:804::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48224:804:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48224:804:0;;;;;;;:::i;10129:333::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10129:333:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10129:333:0;;;;;;;;;;;;;;;;;:::i;3905:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3905:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3905:40:0;-1:-1:-1;;;;;3905:40:0;;:::i;19292:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19292:38:0;;;:::i;25965:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25965:25:0;;;:::i;3076:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3076:25:0;;;:::i;17662:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17662:92:0;;;:::i;25474:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25474:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25474:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25474:45:0;-1:-1:-1;;;;;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25474:45:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25474:45:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25474:45:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25522:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25522:48:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25522:48:0;;:::i;19982:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19982:62:0;;;:::i;19368:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19368:41:0;;;:::i;21143:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21143:39:0;;;:::i;19447:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19447:43:0;;;:::i;20474:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20474:37:0;;;:::i;62814:1574::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62814:1574:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;62814:1574:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;62814:1574:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62814:1574:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;62814:1574:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;62814:1574:0;;;;;;;;-1:-1:-1;62814:1574:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;62814:1574:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;62814:1574:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;62814:1574:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;62814:1574:0;;-1:-1:-1;62814:1574:0;;-1:-1:-1;;;;;62814:1574:0:i;4088:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4088:30:0;;;:::i;25993:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25993:62:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25993:62:0;;;;;;;:::i;24561:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24561:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24561:40:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24561:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17862:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17862:216:0;;;:::i;25764:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25764:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25764:50:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25764:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25764:50:0;-1:-1:-1;;;;25764:50:0;17337:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17337:103:0;;;:::i;3637:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3637:29:0;;;:::i;37574:2060::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37574:2060:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37574:2060:0;;;;;;;;;;;;:::i;26670:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26670:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26670:38:0;-1:-1:-1;;;;;26670:38:0;;:::i;26711:56::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26711:56:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26711:56:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3754:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3754:142:0;;;:::i;25926:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25926:36:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25926:36:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25926:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25926:36:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25926:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19225;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19225:36:0;;;:::i;40963:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40963:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40963:111:0;-1:-1:-1;;;;;40963:111:0;;:::i;25183:68::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25183:68:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25183:68:0;;;;;;;:::i;49035:6793::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49035:6793:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49035:6793:0;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;49035:6793:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;49035:6793:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;49035:6793:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;49035:6793:0;;-1:-1:-1;49035:6793:0;;-1:-1:-1;;;;;49035:6793:0:i;41206:1546::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41206:1546:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41206:1546:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;41206:1546:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41206:1546:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41206:1546:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41206:1546:0;;-1:-1:-1;41206:1546:0;;-1:-1:-1;;;;;41206:1546:0:i;5001:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5001:24:0;;;:::i;24660:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24660:27:0;;;:::i;4863:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4863:27:0;;;:::i;:::-;;;;-1:-1:-1;;;;;4863:27:0;;;;;;;;;;;;;;20698:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20698:30:0;;;:::i;10676:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10676:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10676:121:0;-1:-1:-1;;;;;10676:121:0;;:::i;26551:61::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26551:61:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26551:61:0;;;;;;;;:::i;18436:364::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18436:364:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;18436:364:0;;;;;;;;;;;;;;;;;:::i;4186:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4186:22:0;;;:::i;25307:55::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25307:55:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25307:55:0;;:::i;4639:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4639:37:0;;;:::i;24417:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24417:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24417:45:0;;:::i;4704:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4704:24:0;;;:::i;4737:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4737:30:0;;;:::i;26491:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26491:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26491:57:0;;;;;;-1:-1:-1;;;;;26491:57:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26491:57:0;;;;;;;;;;;;;;;;;;;;;;;;3041:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3041:28:0;;;:::i;18122:264::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18122:264:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18122:264:0;;;;;;;;;;;;:::i;20227:59::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20227:59:0;;;:::i;25731:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25731:28:0;;;:::i;10807:310::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10807:310:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10807:310:0;;;;;;;;:::i;47527:688::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47527:688:0;;;:::i;39913:998::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39913:998:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39913:998:0;;;;;;;:::i;64675:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64675:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;64675:135:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;64675:135:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;64675:135:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;64675:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;64675:135:0;;-1:-1:-1;64675:135:0;;-1:-1:-1;;;;;64675:135:0:i;3385:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3385:54:0;;;:::i;4246:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4246:43:0;;;:::i;3135:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3135:25:0;;;:::i;20599:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20599:37:0;;;:::i;32685:434::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32685:434:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;32685:434:0;;;;;;;;:::i;26081:63::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26081:63:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26081:63:0;;;;;;;:::i;26867:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26867:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26867:44:0;-1:-1:-1;;;;;26867:44:0;;:::i;4132:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4132:41:0;;;:::i;4829:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4829:23:0;;;:::i;24382:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24382:32:0;;;:::i;3249:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3249:29:0;;;:::i;26770:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26770:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26770:46:0;-1:-1:-1;;;;;26770:46:0;;:::i;24252:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24252:26:0;;;:::i;4323:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4323:35:0;;;:::i;9585:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9585:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9585:135:0;;;;;;;;;;:::i;26277:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26277:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26277:50:0;;:::i;26171:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26171:52:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26171:52:0;;:::i;21004:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21004:40:0;;;:::i;24211:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24211:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24211:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35544:971;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35544:971:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35544:971:0;;:::i;64560:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64560:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64560:110:0;-1:-1:-1;;;;;64560:110:0;;:::i;56006:6798::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56006:6798:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56006:6798:0;;:::i;24281:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24281:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24281:42:0;;:::i;27122:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27122:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27122:45:0;-1:-1:-1;;;;;27122:45:0;;:::i;3512:52::-;;;;:::o;3110:18::-;;;;:::o;3006:28::-;;;;;;;;;;;;;;;-1:-1:-1;;3006:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9755:280::-;9850:10;9817:4;9841:20;;;:8;:20;;;;;;:30;-1:-1:-1;9841:30:0;9833:39;;;;;;9900:1;9891:10;;9883:19;;;;;;9923:10;9915:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;9915:28:0;;;;;;;;;;;;:37;;;9968;;;;;;;9915:28;;9923:10;9968:37;;;;;;;;;;;-1:-1:-1;10023:4:0;9755:280;;;;;:::o;20811:35::-;;;;:::o;24690:45::-;;;;;;;;;;;;;:::o;4897:36::-;;;;:::o;17534:119::-;17586:4;17611:33;17631:12;;17611:15;;:19;;:33;;;;:::i;:::-;17604:40;;17534:119;;:::o;11202:3189::-;11509:15;;11492:52;;;;;;;;;;;;11526:10;11492:52;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11492:52:0;;;;;;;11482:63;;;;;11273:12;;11628:26;;;11624:40;;11656:8;;;11624:40;11762:12;;11744:30;;11741:43;;;11776:8;;;11741:43;11902:15;;11862:16;11881:37;;;:20;:37;;;;;;;11935:46;;;;12001:15;;11998:28;;12018:8;;;11998:28;12129:8;;12120:2;:18;12110:7;:28;12095:12;;:43;12092:1570;;;12197:8;;12188:2;:18;12178:7;:28;12162:12;;:44;;12159:1484;;;12329:20;12315:11;:34;12454:23;12435:16;:42;12159:1484;;;12616:8;;12607:2;:18;12597:7;:28;12582:12;;:43;12578:1065;;;12740:20;12726:11;:34;12869:22;12850:16;:41;12578:1065;;;13013:8;;13004:2;:18;12994:7;:28;12979:12;;:43;12975:668;;;13136:20;13122:11;:34;13265:23;13246:16;:42;12975:668;;;13431:20;13417:11;:34;13556:23;13537:16;:42;12975:668;13711:11;;13694:12;;:29;;;:16;:29;:::i;:::-;13679:12;:44;;;13860:18;;-1:-1:-1;13838:41:0;;;;13917:11;;13906:6;;:23;;;:10;:23;:::i;:::-;13897:6;:32;13993:11;;13977:10;13968:20;;;;:8;:20;;;;;;:37;;;:24;:37;:::i;:::-;13954:10;13945:20;;;;:8;:20;;;;;:60;;;;14071:12;:25;;-1:-1:-1;;14071:25:0;;;;;;14139:12;14112:24;:39;14172:22;:20;:22::i;:::-;14236:11;;14249:10;;14261:15;;14219:59;;;;;;;;;;;;;;;;;;14224:10;;14219:59;;;;;;;;;;14336:11;;14301:47;;;;;;;14325:10;;14318:4;;14301:47;;;;;;;;;-1:-1:-1;14372:4:0;;11202:3189;-1:-1:-1;;;;11202:3189:0:o;10470:81::-;10537:6;;10470:81;:::o;24521:35::-;;;;:::o;42760:4760::-;43011:1;42981:27;;;:13;:27;;;;;;:31;:81;;;;-1:-1:-1;43047:15:0;;43016:27;;;;:13;:27;;;;;;:46;;42981:81;42973:90;;;;;;;;43074:37;43083:27;;;:13;:27;;;;;;;;;43074:37;;:8;:37;;;;;:50;:66;;43071:79;;43142:8;;;43071:79;43280:13;;43268:25;;;43260:34;;;;;;43304:30;43358:16;43376:12;43347:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43347:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43347:42:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;43347:42:0;;;43337:53;;49:4:-1;43337:53:0;;;;43438:37;;;;:23;:37;;;;;;43337:53;;-1:-1:-1;43438:44:0;;-1:-1:-1;43438:37:0;-1:-1:-1;43480:1:0;;-1:-1:-1;;43438:44:0;:41;:44;:::i;:::-;43398:37;;;;:23;:37;;;;;;;;:84;;;43490:16;:30;;;;;:69;;;;;;;:94;;;43613:16;;:23;;43634:1;43613:23;:20;:23;:::i;:::-;43594:16;:42;;;43712:34;;;;:16;:34;;;;;;;;:59;;;43950:33;;;:9;:33;;;;;:55;;;44017:24;;;;:69;;-1:-1:-1;44045:33:0;;;;:9;:33;;;;;:36;:41;;44017:69;44014:82;;;44088:8;;;44014:82;44283:22;44313:38;44335:15;;44314;44313:21;;:38;;;;:::i;:::-;44455:35;;;;:16;:35;;;;;;44283:69;;-1:-1:-1;44455:42:0;44452:78;;;44509:11;:9;:11::i;:::-;44539:25;44567:33;;;:9;:33;;;;;;;;44626:16;;44612:30;;44652:19;;;:34;;;44818:35;;;:16;:35;;;;;44797:18;;;:56;44863:30;;;:55;;;44977:17;;;:30;;-1:-1:-1;;44977:30:0;44997:10;44977:30;;;45017:23;;;;:14;;;;:23;;;;;:::i;:::-;-1:-1:-1;45050:35:0;;;;:20;;;;:35;;;;;:::i;:::-;-1:-1:-1;45095:44:0;;;;:25;;;;:44;;;;;:::i;:::-;-1:-1:-1;45149:31:0;;;;:18;;;;:31;;;;;:::i;:::-;-1:-1:-1;45221:33:0;45257:34;;;:10;:34;;;;;45301:19;;;:44;;45323:22;-1:-1:-1;;45301:44:0;;;;-1:-1:-1;;45355:25:0;;;-1:-1:-1;;45390:47:0;;;;;45447:21;;;:25;;;45482:26;;;:30;;;45522:21;;;:25;;;45557;;;:29;;;45596:32;;;:36;;;45642:30;;;:34;;;;45711:15;45686:40;;;45779:19;;45759:40;;45711:15;45759:19;:40::i;:::-;45736:20;;;:63;45922:21;;45907:10;45900:18;;;;:6;:18;;;;;;:43;;45892:52;;;;;;46136:21;;46120:10;46113:18;;;;:6;:18;;;;;;:45;;;:22;:45;:::i;:::-;46099:10;46092:18;;;;:6;:18;;;;;;;;:66;;;;46317:21;;46287:13;:25;;;;;;;:52;;;:29;:52;:::i;:::-;46273:10;46259:25;;;;:13;:25;;;;;;;;:80;;;;46396:30;;;;;46390:37;;;:5;:37;;;;;:49;;;;;;;;46446:51;;;46504:12;;;:19;;-1:-1:-1;;;;46504:19:0;;;;;;46530:21;;46504:19;46530:21;;;46572;;46558:11;;;:35;46600:10;;;;:23;;-1:-1:-1;;46600:23:0;;;;;;;46647:15;46630:14;;;:32;46704:22;;;:51;;;;;;;;;46864:16;;;:6;:16;;;;;;:19;46895:21;;;;;:67;;-1:-1:-1;46920:16:0;;;;:6;:16;;;;;:26;;;:42;;46895:67;46892:348;;;46975:17;;;:28;;;47091:31;;;;:21;:31;;;;;;:38;;47127:1;47091:38;:35;:38;:::i;:::-;47057:31;;;;:21;:31;;;;;;;;:72;;;47200:30;;;;47140:14;:24;;;;;:57;;;;;;;;;:90;46892:348;47364:10;;;47353:46;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;47353:46:0;;;;;;47343:57;;;;;;;47330:70;;;47484:19;;;;47436:78;;;;;47505:8;;47472:10;;47436:78;;;;;;;;;42760:4760;;;;;;;;;;;;;:::o;10559:109::-;10608:4;10631:29;10642:17;;10631:6;;:10;;:29;;;;:::i;48224:804::-;48307:2;48297:12;;48289:21;;;;;;48351:10;48344:18;;;;:6;:18;;;;;;:29;-1:-1:-1;48344:29:0;48336:38;;;;;;48473:10;48466:18;;;;:6;:18;;;;;;:31;;48489:7;48466:31;:22;:31;:::i;:::-;48452:10;48445:18;;;;:6;:18;;;;;;;;:52;;;;48618:13;:25;;;;:38;;48648:7;48618:38;:29;:38;:::i;:::-;48604:10;48590:25;;;;:13;:25;;;;;;;;:66;;;;48782:7;:19;;;;;:30;;;;;;:37;:50;;48824:7;48782:50;:41;:50;:::i;:::-;48750:10;48742:19;;;;:7;:19;;;;;;;;:30;;;;;;;;;:90;;;48879:15;48836:40;;;;:58;;;;48934:10;;;48923:33;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;48923:33:0;;;;;;48913:44;;;;;;;48900:57;;;48989:32;;;;;48750:10;;48989:32;;;;;;;;;;48224:804;;:::o;10129:333::-;-1:-1:-1;;;;;10238:14:0;;10205:4;10238:14;;;:8;:14;;;;;;:26;;10257:6;10238:26;:18;:26;:::i;:::-;-1:-1:-1;;;;;10221:14:0;;;;;;:8;:14;;;;;;;;:43;;;;10303:7;:13;;;;;10317:10;10303:25;;;;;;:37;;10333:6;10303:37;:29;:37;:::i;:::-;-1:-1:-1;;;;;10275:13:0;;;;;;;:7;:13;;;;;;;;10289:10;10275:25;;;;;;;:65;;;;10366:12;;;;;:8;:12;;;;;:24;;10383:6;10366:24;:16;:24;:::i;:::-;-1:-1:-1;;;;;10351:12:0;;;;;;;:8;:12;;;;;;;;;:39;;;;10406:26;;;;;;;10351:12;;10406:26;;;;;;;;;;;;;-1:-1:-1;10450:4:0;10129:333;;;;;:::o;3905:40::-;;;;;;;;;;;;;:::o;19292:38::-;;;;:::o;25965:25::-;;;;:::o;3076:::-;;;;:::o;17662:92::-;17734:12;;17662:92;:::o;25474:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;25474:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;25474:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;25474:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25474:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25522:48::-;;;;;;;;;;;;;:::o;19982:62::-;;;;:::o;19368:41::-;;;;:::o;21143:39::-;;;;:::o;19447:43::-;;;;:::o;20474:37::-;;;;:::o;62814:1574::-;62991:1;62961:27;;;:13;:27;;;;;;:31;:81;;;;-1:-1:-1;63027:15:0;;62996:27;;;;:13;:27;;;;;;:46;;62961:81;62953:90;;;;;;;;63051:37;63060:27;;;:13;:27;;;;;;;;;63051:37;;:8;:37;;;;;:50;:66;;63048:79;;63119:8;;;63048:79;63344:23;;63331:10;;63344:31;;63372:2;63344:31;:27;:31;:::i;:::-;63455:10;63446:20;;;;:8;:20;;;;;;63331:44;;-1:-1:-1;63446:29:0;-1:-1:-1;63446:29:0;63438:38;;;;;;63567:30;63584:4;63591:5;63567:8;:30::i;:::-;-1:-1:-1;63718:13:0;;:20;;63736:1;63718:20;:17;:20;:::i;:::-;63702:13;:36;63847:34;;;;:20;:34;;;;;;:41;;63886:1;63847:41;:38;:41;:::i;:::-;63810:34;;;;:20;:34;;;;;;;;:78;;;63995:13;;63929;:27;;;;;:63;;;;;;;;;:79;;;64066:212;;;;;;;;;;;;;;;;64171:34;;64066:212;;;;;;;;;;;;;;;;;;64042:21;;;:6;:21;;;;;;:236;;;;;;;;;;;;;;;;;;;;64066:212;;64042:21;:236;;;;;;;;;:::i;:::-;-1:-1:-1;64042:236:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;64305:17:0;;:28;;-1:-1:-1;64327:5:0;64305:28;:21;:28;:::i;:::-;64285:17;:48;64352:13;;64343:37;;64367:12;;64352:13;64343:37;;;;;62814:1574;;;;:::o;4088:30::-;;;;:::o;25993:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;24561:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24561:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17862:216::-;17910:4;17947:18;;17931:12;;:34;;17928:132;;;-1:-1:-1;17986:11:0;;17979:18;;17928:132;-1:-1:-1;18046:1:0;18039:8;;25764:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17337:103::-;17416:15;;17337:103;:::o;3637:29::-;;;;:::o;37574:2060::-;37774:29;:15;37794:8;37774:29;:19;:29;:::i;:::-;37763:40;;37755:49;;;;;;37963:2;37952:7;:13;;:54;;;;-1:-1:-1;37995:10:0;37980:26;;;;:14;:26;;;;;;37969:37;;;37952:54;37944:63;;;;;;;;38012:14;;38078:1;;38084:1441;38108:20;;;38084:1441;;38226:10;38211:26;;;;:14;:26;;;;;;38241:1;-1:-1:-1;38208:1314:0;;38283:10;38268:26;;;;:14;:26;;;;;;38255:39;;38252:657;;38319:9;38305:23;;38252:657;;;38504:25;:9;38518:10;38504:25;:13;:25;:::i;:::-;38490:39;-1:-1:-1;38841:1:0;38826:16;;;38819:24;;;;39221:10;39214:18;;;;:6;:18;;;;;;;;:31;;;;;;;;:39;;;:51;-1:-1:-1;39214:51:0;;;:108;;-1:-1:-1;39276:10:0;39269:18;;;;:6;:18;;;;;;;;:31;;;;;;;;:39;;;:53;-1:-1:-1;39269:53:0;39214:108;39211:300;;;39370:10;39363:18;;;;:6;:18;;;;;;;;:31;;;;;;;;:38;39349:53;;:9;;:53;:13;:53;:::i;:::-;39337:65;;39415:37;39428:10;39440:11;39415:12;:37::i;:::-;39482:17;:10;39497:1;39482:17;:14;:17;:::i;:::-;39469:30;;39211:300;38131:11;;38084:1441;;;;39545:1;39533:9;:13;39529:100;;;39576:49;39593:10;39605:9;39616:8;39576:16;:49::i;:::-;;39529:100;37574:2060;;;;;;:::o;26670:38::-;;;;;;;;;;;;;:::o;26711:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3754:142::-;;;;;;;;;;;;;;;;;;;;:::o;25926:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;25926:36:0;;;;;;;;;;;;;;;;-1:-1:-1;;25926:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25926:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19225:::-;;;;:::o;40963:111::-;-1:-1:-1;;;;;41047:23:0;41022:12;41047:23;;;:14;:23;;;;;;;40963:111::o;25183:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;49035:6793::-;49167:17;49220:22;49244:9;49255:10;49267:5;49209:64;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49209:64:0;-1:-1:-1;;;;;49209:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;49209:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49209:64:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;49209:64:0;;;49199:75;;49:4:-1;49199:75:0;;;;49295:10;49327:1;49287:19;;;:7;:19;;;;;:30;;;;;;;;;:37;49199:75;;-1:-1:-1;49287:41:0;;-1:-1:-1;49279:50:0;;-1:-1:-1;;;;;49279:50:0;;;;;49435:25;49463:33;;;:9;:33;;;;;49507:11;;49463:33;;-1:-1:-1;49507:75:0;;;;;49560:22;49526:8;:30;;;:56;49507:75;49499:84;;;;;;;;49590:33;49626:34;;;:10;:34;;;;;;;;49767:20;;;;;49731:10;49723:19;;:7;:19;;;;;:30;;;;;;;;;;:40;;:64;;49714:74;;;;;;49863:12;:20;;;49845:15;:38;:109;;;;-1:-1:-1;49931:22:0;;49906:20;;;;:48;;;:24;:48;:::i;:::-;49887:15;:67;;49845:109;49836:119;;;;;;;;49995:22;49969;;;;;;;;;;;:48;;;;;;;;;49961:57;;;;;;50198:32;;;;50267:30;;;;50364:18;;;;50162:33;50356:27;;;:7;:27;;;;;;;;50534:30;;;;50528:37;;:5;:37;;;;;50566:10;50528:49;;;;;;;;:63;50597:20;;;;:85;;-1:-1:-1;50627:30:0;;;;50621:37;;;;:5;:37;;;;;;;;50659:10;50621:49;;;;;;;:56;;;:61;;50597:85;50594:98;;;50684:8;;;50594:98;50893:17;50913:5;:37;50919:8;:30;;;50913:37;;;;;;;;;;;:49;50951:10;-1:-1:-1;;;;;50913:49:0;-1:-1:-1;;;;;50913:49:0;;;;;;;;;;;;50893:69;;50987:8;:30;;;50966:4;:18;;:51;;;;51036:9;51021:4;:12;;;:24;;;;;;;;;;;;;;;;;;51066:5;51049:4;:14;;;:22;;;;;;;;;;;;;;;;;;51089:7;:19;51097:10;-1:-1:-1;;;;;51089:19:0;-1:-1:-1;;;;;51089:19:0;;;;;;;;;;;;:30;51109:9;51089:30;;;;;;;;;;;:37;;;51075:4;:11;;:51;;;;51143:10;51130:4;:10;;;:23;;;;;-1:-1:-1;;;;;51130:23:0;;;;;-1:-1:-1;;;;;51130:23:0;;;;;;51174:15;51157:4;:14;;:32;;;;51219:28;51245:1;51219:12;:21;;;:25;;:28;;;;:::i;:::-;51195:21;;;:52;51286:246;;;;51366:10;51358:19;;;;:7;:19;;;;;;;;:30;;;;;;;;:37;51332:21;;;;:64;;;:25;:64;:::i;:::-;51308:21;;;:88;51286:246;;;51493:10;51485:19;;;;:7;:19;;;;;;;;:30;;;;;;;;:37;51455:25;;;;:68;;;:29;:68;:::i;:::-;51427:25;;;:96;51286:246;51685:25;;;;51659:21;;;;51582:16;;;;;;51659:52;;:21;:52;:25;:52;:::i;:::-;51641:70;;51719:24;51746:32;51772:5;51746:12;:21;;;:25;;:32;;;;:::i;:::-;51977:18;;51719:59;;-1:-1:-1;51899:20:0;;51938:35;51719:59;51962:10;51938:35;:23;:35;:::i;:::-;51937:58;51933:96;;;52017:4;52003:18;;51933:96;52080:18;;52040:35;:19;52064:10;52040:35;:23;:35;:::i;:::-;52039:59;52035:96;;;52119:4;52110:13;;52035:96;52139:18;;;:27;;-1:-1:-1;;52139:27:0;;;;;;;;;52175:516;;;;52221:57;52272:5;52222:44;52255:10;52231:18;;52223:5;:26;52222:32;;:44;;;;:::i;:::-;52221:50;:57;:50;:57;:::i;:::-;52198:81;;52309:59;52352:15;52310:36;52340:5;52310:12;:25;;;:29;;:36;;;;:::i;52309:59::-;52412:5;:23;;;52378:26;;;:58;52286:83;-1:-1:-1;52175:516:0;;;52484:47;52525:5;52485:34;52500:18;;52485:10;:14;;:34;;;;:::i;52484:47::-;52461:71;;52562:55;52601:15;52563:32;52589:5;52563:12;:21;;;:25;;:32;;;;:::i;52562:55::-;52659:5;:23;;;52625:26;;;:58;52539:79;-1:-1:-1;52175:516:0;52807:1;52778:12;:26;;;:30;;:69;;;;;52842:5;52812:12;:26;;;:35;;52778:69;52770:78;;;;;;;;52921:25;52983:75;;;;-1:-1:-1;53023:23:0;52983:75;53099:26;53073:22;;;;;;;;;;;:52;;;;;;;;53070:831;;;53144:11;53141:178;;;53189:15;;;;:22;;53209:1;53189:22;:19;:22;:::i;:::-;53171:15;;;:40;53141:178;;;53279:19;;;;:26;;53303:1;53279:26;:23;:26;:::i;:::-;53257:19;;;:48;53141:178;53070:831;;;53480:22;;;;;;;;;;;53466:36;;;;;;;:10;:36;;;;;;;;;53463:438;;53534:23;53520:10;:37;;;;;;;;;53517:371;;;53593:19;;;;:26;;53617:1;53593:26;:23;:26;:::i;:::-;53571:19;;;:48;53650:15;;;;:22;;53670:1;53650:22;:19;:22;:::i;:::-;53632:15;;;:40;53517:371;;;53792:15;;;;:22;;53812:1;53792:22;:19;:22;:::i;:::-;53774:15;;;:40;53849:19;;;;:26;;53873:1;53849:26;:23;:26;:::i;:::-;53827:19;;;:48;53517:371;54027:6;54023:1641;;;54047:22;;;:49;;-1:-1:-1;;54047:49:0;;;54073:23;54108:32;;;:36;;;54156:30;;;:34;54292:19;;;;:53;;54316:28;54292:23;:53::i;:::-;54270:19;;;:75;54377:17;;;;:49;;54399:26;54377:49;:21;:49;:::i;:::-;54357:17;;;:69;54023:1641;;;54531:11;54527:1125;;;54559:22;;;:49;;-1:-1:-1;;54559:49:0;;;;;54659:21;;;;54624:32;;;:56;;;54696:30;;;:54;;;54879:19;;;;:91;;54659:21;54879:53;;54903:28;54879:23;:53::i;:::-;:57;:91;:57;:91;:::i;:::-;54857:19;;;:113;55060:30;;;;55006:17;;;;:85;;55060:30;55006:49;;55028:26;55006:49;:21;:49;:::i;54527:1125::-;55135:22;;;:49;;-1:-1:-1;;55135:49:0;;;55235:25;;;;55200:32;;;:60;;;55161:23;55276:30;;;:34;55463:19;;;;:91;;55235:25;55463:53;;55487:28;55463:23;:53::i;:91::-;55441:19;;;:113;55590:17;;;;:49;;55612:26;55590:49;:21;:49;:::i;:::-;55570:17;;;:69;54527:1125;55727:24;55741:9;55727:13;:24::i;:::-;55789:30;;;;55767:53;;55777:10;;55767:53;;;;;49035:6793;;;;;;;;;;;;;;;;;:::o;41206:1546::-;41458:23;;41443:10;41434:20;;;;:8;:20;;;;;;:47;;41426:56;;;;;;41567:48;41584:4;41591:23;;41567:8;:48::i;:::-;-1:-1:-1;41664:23:0;;41642:17;;:46;;;:21;:46;:::i;:::-;41622:17;:66;;;;41797:20;41841:5;41830:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41830:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41830:17:0;;;41820:28;;;;;;41797:51;;41873:22;41893:1;41873:15;;:19;;:22;;;;:::i;:::-;41855:15;:40;42038:27;;;;:13;:27;;;;;;:34;42035:47;;42074:8;;;42035:47;42313:15;42329:5;42313:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;42313:22:0;;;;;-1:-1:-1;42313:22:0;;;;;;;;;;;:27;;-1:-1:-1;42305:36:0;;-1:-1:-1;42305:36:0;;;;;42498:46;;;;;;;;;;;;;;;;;;42479:15;;-1:-1:-1;42470:25:0;;;:8;:25;;;;;;:74;;;;;;;;42498:46;;42470:25;:74;;;;;;;;;:::i;:::-;;;;;42641:15;;42611:13;:27;42625:12;42611:27;;;;;;;;;;;:45;;;;42687:12;42662:15;42678:5;42662:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;42662:22:0;;;;;-1:-1:-1;42662:22:0;;;;;;;;;;;:37;;;;42723:15;;42712:34;;;;;;;;;;;42723:15;;42712:34;;;;-1:-1:-1;42662:22:0;-1:-1:-1;42662:22:0;;42712:34;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42712:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41206:1546;;:::o;5001:24::-;;;;:::o;24660:27::-;;;;:::o;4863:::-;;;-1:-1:-1;;;;;4863:27:0;;:::o;20698:30::-;;;;:::o;10676:121::-;-1:-1:-1;;;;;10768:20:0;10736:12;10768:20;;;:8;:20;;;;;;;10676:121::o;26551:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18436:364::-;18625:51;;;;;;;;;;;18659:10;18625:51;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18625:51:0;;;;;;;18615:62;;;;;18568:12;;18696:28;;;18693:41;;;18726:8;;;18693:41;18758:26;;;;18436:364;-1:-1:-1;;;;18436:364:0:o;4186:22::-;;;;:::o;25307:55::-;;;;;;;;;;;;;:::o;4639:37::-;;;;:::o;24417:45::-;;;;;;;;;;;;;:::o;4704:24::-;;;;:::o;4737:30::-;;;;:::o;26491:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26491:57:0;;;;;;:::o;3041:28::-;;;;;;;;;;;;;;;-1:-1:-1;;3041:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18122:264;18294:51;;;;;;;;;;;18328:10;18294:51;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18294:51:0;;;;;;;18284:62;;;;;18122:264;;;;;:::o;20227:59::-;;;;:::o;25731:28::-;;;;:::o;10807:310::-;10866:12;10899:10;;;10891:19;;;;;;10956:10;10947:20;;;;:8;:20;;;;;;:32;;10972:6;10947:32;:24;:32;:::i;:::-;10933:10;10924:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;11008:12:0;;;;;;:24;;11025:6;11008:24;:16;:24;:::i;:::-;-1:-1:-1;;;;;10993:12:0;;;;;;:8;:12;;;;;;;;;:39;;;;11051:32;;;;;;;10993:12;;11060:10;;11051:32;;;;;;;;;;-1:-1:-1;11104:4:0;10807:310;;;;:::o;47527:688::-;47671:8;;47666:2;:14;47655:8;:25;47645:6;;:35;;47637:44;;;;;;;;47777:14;;47794:2;;47777:19;:24;47769:33;;;;;;47805:22;47830:32;47855:6;47830:20;47841:8;47830:6;;:10;;:20;;;;:::i;:32::-;47805:57;;47909:23;47935:32;47960:6;47935:20;47946:8;47935:6;;:10;;:20;;;;:::i;:32::-;48024:21;:42;;;48069:23;:43;;;48150:14;;48124:23;;47909:58;;-1:-1:-1;;48117:48:0;;;;-1:-1:-1;;48194:14:0;;48168:23;:40;47527:688::o;39913:998::-;40002:1;39988:15;;39980:24;;;;;;40070:1;40058:9;:13;:56;;;;-1:-1:-1;40103:10:0;40088:26;;;;:14;:26;;;;;;40075:39;;;40058:56;40050:65;;;;;;;;40180:10;40150:20;40173:18;;;:6;:18;;;;;;;;:29;;;;;;;;40275:13;;:27;-1:-1:-1;40267:36:0;;;;;;40370:13;;40351:16;;40370:30;;40388:11;40370:30;:17;:30;:::i;:::-;40441:27;;;40579:10;40441:13;40564:26;;;:14;:26;;;;;;40351:49;;-1:-1:-1;40564:33:0;;40595:1;40564:33;:30;:33;:::i;:::-;40550:10;40535:26;;;;:14;:26;;;;;;;;:62;;;40735:82;;;;;;;;;;40785:14;;;;;40735:82;;;;;;40686:18;;;:6;:18;;;;;:46;;;;;;;;;:131;;;;;;;;;;;40889:15;;40882:23;;;;39913:998;;;;:::o;64675:135::-;64747:20;64783:15;64799:5;64783:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;64783:22:0;;;;;-1:-1:-1;64783:22:0;;;;;;;;;;;;64675:135;-1:-1:-1;;;;64675:135:0:o;3385:54::-;;;;:::o;4246:43::-;;;;:::o;3135:25::-;;;;:::o;20599:37::-;;;;:::o;32685:434::-;32755:12;32781:10;-1:-1:-1;;;;;32781:21:0;;;32773:30;;;;;;32826:1;32816:11;;32808:20;;;;;;32997:32;33014:4;33021:7;32997:8;:32::i;:::-;;33067:26;33076:7;33085;33067:8;:26::i;:::-;-1:-1:-1;33109:4:0;32685:434;;;;:::o;26081:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;26867:44::-;;;;;;;;;;;;;;:::o;4132:41::-;;;;:::o;4829:23::-;;;;:::o;24382:32::-;;;;:::o;3249:29::-;;;;:::o;26770:46::-;;;;;;;;;;;;;:::o;24252:26::-;;;;:::o;4323:35::-;;;;:::o;9585:135::-;-1:-1:-1;;;;;9684:19:0;;;9661:4;9684:19;;;:7;:19;;;;;;;;:28;;;;;;;;;;;;;9585:135::o;26277:50::-;;;;;;;;;;;;;:::o;26171:52::-;;;;;;;;;;;;;:::o;21004:40::-;;;;:::o;24211:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35544:971::-;35653:1;35641:9;:13;:56;;;;-1:-1:-1;35686:10:0;35671:26;;;;:14;:26;;;;;;35658:39;;;35641:56;35633:65;;;;;;;;35763:10;35733:20;35756:18;;;:6;:18;;;;;;;;:29;;;;;;;;35847:14;;;;35829:15;:32;35821:41;;;;;;36126:10;36112:25;;;;:13;:25;;;;;;;;;36083:24;;;;;;;;:55;;;:28;:55;:::i;:::-;36066:13;;:72;;36058:81;;;;;;36249:13;;36238:4;36249:13;36221:23;;;:8;:23;;;;;;:42;;;:27;:42;:::i;:::-;36212:4;36195:23;;;;:8;:23;;;;;;:68;;;;36318:13;;36302:10;36293:20;;;;;;:39;;;:24;:39;:::i;:::-;36279:10;36270:20;;;;:8;:20;;;;;;;;;:62;;;;36380:13;;36344:50;;;;;;;36279:10;;36361:4;;36344:50;;;;;;;;;;36429:13;;36404:39;;;;;;;36417:10;;36404:39;;;;;;;;;;36474:35;36487:10;36499:9;36474:12;:35::i;:::-;35544:971;;:::o;64560:110::-;-1:-1:-1;;;;;64647:18:0;64619:12;64647:18;;;:6;:18;;;;;;;64560:110::o;56006:6798::-;56147:25;56175:33;;;:9;:33;;;;;56222:11;;56175:33;;-1:-1:-1;56222:75:0;;;;;56275:22;56241:8;:30;;;:56;56222:75;56214:84;;;;;;;;56308:33;56344:34;;;:10;:34;;;;;56486:22;;56461:20;;;;:48;;;:24;:48;:::i;:::-;56443:15;:66;56434:76;;;;;;56588:30;;;;56562:17;56582:37;;;:5;:37;;;;;;;;56620:10;56582:49;;;;;;;56646:18;;:44;;56638:53;;;;;;56762:15;;;;;;56761:16;56753:25;;;;;;56785:15;;;:22;;-1:-1:-1;;56785:22:0;56803:4;56785:22;;;56963:11;;;;56947:10;56785:15;56933:25;;;:13;:25;;;;;;:42;;;:29;:42;:::i;:::-;56919:10;56905:25;;;;:13;:25;;;;;;;;:70;;;;57050:18;;;;57042:27;;:7;:27;;;;;57129:15;;57042:27;;56905:25;57107:38;;57108:15;;57107:38;:21;:38;:::i;:::-;57077:69;;57225:19;57252:79;57329:1;57253:70;57307:15;;57254:47;57278:22;;57254:19;;:23;;:47;;;;:::i;57252:79::-;57405:15;;;;57225:107;;-1:-1:-1;57405:35:0;;57225:107;57405:35;:19;:35;:::i;:::-;57384:56;;;57376:65;;;;;;57604:22;57581:19;;;;;;;;:45;;;;;;;;57577:377;;;57695:23;57669:22;;;;;;;;;;;:49;;;;;;;;57665:188;;;57735:19;;;:45;;-1:-1:-1;;57735:45:0;57757:23;57735:45;;;57665:188;;;57802:19;;;:45;;-1:-1:-1;;57802:45:0;;;57665:188;57889:15;57859:27;;;:45;57577:377;58015:18;;;;;;;;;58014:19;58010:4735;;;58203:12;;;;58142:26;;58203:12;;58200:68;;;-1:-1:-1;58238:23:0;58200:68;58293:19;;;;;;;;58278:34;;;;;;;:11;:34;;;;;;;;;58275:4463;;58394:20;58417:4;:11;;;58394:34;;58436:18;58462:79;58535:5;58462:68;58503:12;:26;;;58462:36;58483:14;;58462:16;;:20;;:36;;;;:::i;:::-;:40;:68;:40;:68;:::i;:79::-;58555:14;;;;58436:106;;-1:-1:-1;58555:14:0;;;;;58552:95;;;58617:19;;58599:38;;:13;;:38;:17;:38;:::i;:::-;58578:60;;58552:95;58741:4;58712:12;:26;;;:33;58709:1283;;;58827:18;58853:28;58877:3;58853:19;58869:2;58853:4;:11;;;:15;;:19;;;;:::i;:28::-;58894:14;;;;58827:55;;-1:-1:-1;58894:14:0;;;;;58891:66;;;-1:-1:-1;58936:11:0;;;;58891:66;59002:18;;58968:53;;;;;;;;;;;;;;;58975:10;;58968:53;;;;;;;;;59050:17;;:36;;59072:13;59050:36;:21;:36;:::i;:::-;59030:17;:56;59146:11;;;;:30;;59162:13;59146:30;:15;:30;:::i;:::-;59128:48;-1:-1:-1;59212:1:0;59190:799;59244:10;59229:26;;;;:14;:26;;;;;;59215:40;;59190:799;;59364:10;59357:18;;;;:6;:18;;;;;;;;:30;;;;;;;;:37;:53;-1:-1:-1;59354:628:0;;;59473:10;59466:18;;;;:6;:18;;;;;;;;:30;;;;;;;;:37;:56;;59508:13;59466:56;:41;:56;:::i;:::-;59433:10;59426:18;;;;:6;:18;;;;;;;;:30;;;;;;;;:96;;;;59560:24;;;;;;;;;:43;;59589:13;59560:43;:28;:43;:::i;:::-;59546:10;59533:24;;;;:12;:24;;;;;;:70;;;;:24;-1:-1:-1;59643:5:0;;59354:628;59825:10;59818:18;;;;:6;:18;;;;;;;;:30;;;;;;;;:37;59800:56;;:13;;:56;:17;:56;:::i;:::-;59784:72;;59869:36;59882:10;59894;59869:12;:36::i;:::-;59921:18;;59918:55;;;59954:5;;59918:55;59258:12;;59190:799;;;;58709:1283;;60059:1;60041:15;:19;60038:1454;;;60109:18;;60071:57;;;;;;;;;;;;;;;60080:10;;60071:57;;;;;;;;;60161:1;60140:1349;60192:10;60177:26;;;;:14;:26;;;;;;60164:39;;60140:1349;;60333:10;60326:18;;;;:6;:18;;;;;;;;:29;;;;;;;;:36;:55;-1:-1:-1;60323:1159:0;;60444:10;60437:18;;;;:6;:18;;;;;;;;:29;;;;;;;;:37;;;:56;;60479:13;60437:56;:41;:56;:::i;:::-;60404:10;60397:18;;;;:6;:18;;;;;;;;:29;;;;;;;;:37;;;:96;;;;60542:36;60522:57;;:15;;:19;:57::i;:::-;60504:75;-1:-1:-1;60602:20:0;;60599:52;;;60635:5;;60599:52;60323:1159;;;60796:10;60772:14;60789:18;;;:6;:18;;;;;;;;:29;;;;;;;;:36;:57;;60830:15;60789:57;:40;:57;:::i;:::-;60889:10;60857:22;60882:18;;;:6;:18;;;;;;;;:29;;;;;;;;:37;;;;60996:54;;;;60772:74;;-1:-1:-1;61169:56:0;60882:37;61211:13;61169:41;:56::i;:::-;61136:10;61129:18;;;;:6;:18;;;;;;;;:29;;;;;;;;:37;;:96;;;;61260:13;;61257:198;;;61391:52;61402:10;61414:9;61425:17;61391:10;:52::i;:::-;;61257:198;61467:5;;;;60323:1159;60206:11;;60140:1349;;;;60038:1454;58275:4463;;;;;61614:19;;;;61542;;61614:23;-1:-1:-1;61606:32:0;;;;;;61739:14;;;;;;;;;61738:15;61734:140;;;61777:90;61796:70;61846:6;:19;;;61797:43;61813:6;:26;;;61797:4;:11;;;:15;;:43;;;;:::i;61796:70::-;61777:14;;:90;:18;:90;:::i;:::-;61760:107;;61734:140;61939:14;;;;;;;;;:64;;;;-1:-1:-1;61980:23:0;61957:19;;;;;;;;:46;;;;;;;;61939:64;61935:323;;;62067:17;;;;62087:1;-1:-1:-1;62058:31:0;;;;;;62145:105;62164:85;62231:6;:17;;;62165:60;62200:6;:24;;;62165:12;:30;;;:34;;:60;;;;:::i;62145:105::-;62128:122;;61935:323;62323:24;;;;62292:26;;;;:56;;;:30;:56;:::i;:::-;62274:74;;;62266:83;;;;;;62493:4;62476:23;;;;:8;:23;;;;;;:43;;62504:14;62476:43;:27;:43;:::i;:::-;62467:4;62450:23;;;;:8;:23;;;;;;:69;;;;62558:10;62549:20;;;;:40;;62574:14;62549:40;:24;:40;:::i;:::-;62535:10;62526:20;;;;:8;:20;;;;;;;;;:63;;;;62603:51;;;;;;;62535:10;;62620:4;;62603:51;;;;;;;;;;62666:65;;;;;;;;;;;;;;62680:10;;62666:65;;;;;;;;58275:4463;;58010:4735;56006:6798;;;;;;;:::o;24281:42::-;;;;;;;;;;;;;:::o;27122:45::-;;;;;;;;;;;;;:::o;1835:119::-;1887:6;1916:5;;;1908:14;;;;;;1943:1;1939;:5;;;;;;;;;1835:119;-1:-1:-1;;;1835:119:0:o;1437:120::-;1514:5;;;1540:6;;;;1532:15;;;;;14436:681;14504:10;;:17;;14519:1;14504:17;:14;:17;:::i;:::-;14491:10;:30;;;14625:24;;;14612:37;;;;;;;;:42;14609:99;;;14676:21;:19;:21::i;:::-;14951:19;:12;14968:1;14951:19;:16;:19;:::i;:::-;15037:10;;15009:39;;;14941:30;;15009:39;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;15009:39:0;;;;;;14999:50;;;;;14923:15;14981:68;14436:681::o;29442:1058::-;29479:14;29501:38;29523:15;;29502;29501:21;;:38;;;;:::i;:::-;29592:8;29603:27;;;:16;:27;;;;;;29479:61;;-1:-1:-1;29638:10:0;;29635:23;;29650:8;;;29635:23;29735:14;;:21;;29754:1;29735:21;:18;:21;:::i;:::-;29718:14;:38;;;29822:211;;;;;;;;;;;;;;;;;;-1:-1:-1;29822:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29796:23;;;:7;:23;;;;;:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30110:14;;30080:27;;;:16;:27;;;;;:44;30155:23;;:30;;;:27;:30;:::i;:::-;30129:23;:56;30237:14;;30231:21;;:5;:21::i;:::-;-1:-1:-1;30360:21:0;;30335:14;;:21;;30354:1;30335:21;:18;:21;:::i;:::-;30334:47;;;;;;;;:52;:74;;;;;30407:1;30390:14;;:18;30334:74;30331:114;;;30420:19;:17;:19::i;:::-;30470:14;;30456:40;;;;;;;;;;;;;;;;;29442:1058;;:::o;1565:120::-;1617:6;1646;;;;1638:15;;;;;;-1:-1:-1;1670:5:0;;;1565:120::o;36595:693::-;36714:1;36705:6;:10;:47;;;;-1:-1:-1;;;;;;36729:23:0;;;;;;:14;:23;;;;;;36719:33;;;36705:47;36697:56;;;;;;;;-1:-1:-1;;;;;36883:15:0;;;;;;:6;:15;;;;;;;;:23;;;;;;;;:30;36857:21;;;;;;;;;;:57;;;:25;:57;:::i;:::-;-1:-1:-1;;;;;36833:21:0;;;;;;:12;:21;;;;;;;:81;;;;37013:6;:15;;;;;37029:14;:23;;;;;;;;37013:40;;;;;;;;36987:23;;;;;;:66;;;;;;;;;;;;;37127:53;;;;;;;;;;;;;;;;37100:23;;37084:40;;;;;;;;:96;;;;;;;;;;;;;37252:23;;;;;;;;;:30;;:27;:30::i;:::-;-1:-1:-1;;;;;37226:23:0;;;;;;;:14;:23;;;;;:56;;;;-1:-1:-1;36595:693:0:o;34183:677::-;34273:12;34304:11;;;34296:20;;;;;;-1:-1:-1;;;;;34349:23:0;;;;;;:14;:23;;;;;;:30;;34377:1;34349:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;34323:23:0;;;;;;:14;:23;;;;;;;;:56;;;;34554:21;;;;;:34;;34580:7;34554:34;:25;:34;:::i;:::-;-1:-1:-1;;;;;34530:21:0;;;;;;:12;:21;;;;;;;:58;;;;34724:72;;;;;;;;;;;;;;;;34681:15;;;:6;:15;;;;;34697:14;:23;;;;;;34681:40;;;;;;;;:115;;;;;;;;;;;;;;34810:26;;;;;;;34530:21;;34810:26;;;;;;;;;-1:-1:-1;34852:4:0;34183:677;;;;;:::o;1693:134::-;1770:5;;;1796:6;;;:20;;;1815:1;1810;1806;:5;;;;;;;;:10;1796:20;1788:29;;;;;;;55834:164;55904:10;55936:1;55896:19;;;:7;:19;;;;;;;;:30;;;;;;;;;:41;;;55948:40;;:44;55834:164::o;33248:145::-;33312:26;33321:7;33330;33312:8;:26::i;:::-;-1:-1:-1;;;;;;33359:15:0;;;;;;:6;:15;;;;;;:28;;33379:7;33359:28;:19;:28;:::i;:::-;-1:-1:-1;;;;;33341:15:0;;;;;;;:6;:15;;;;;:46;;;;-1:-1:-1;33248:145:0:o;34932:489::-;35016:12;35047:11;;;35039:20;;;;;;-1:-1:-1;;;;;35092:23:0;;;;;;:14;:23;;;;;;:30;;35120:1;35092:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;35066:23:0;;;;;;;;:14;:23;;;;;;;;:56;;;35323:72;;;;;;;;;;;;;;;;35280:15;;;:6;:15;;;;;:40;;;;;;;;;;:115;;;;;;;;;;;34932:489;-1:-1:-1;34932:489:0:o;15187:2052::-;15259:12;;15443:29;;15241:15;;15423:50;;:15;;:50;:19;:50;:::i;:::-;15383:90;;15561:28;15592:40;15621:10;15592:24;;:28;;:40;;;;:::i;:::-;15561:71;;15880:23;15845:32;:58;15841:1058;;;16075:79;16130:23;16075:50;16092:32;16075:12;;:16;;:50;;;;:::i;:79::-;16060:12;:94;16263:17;:10;16278:1;16263:17;:14;:17;:::i;:::-;16248:12;;:32;16245:139;;;16347:17;:10;16362:1;16347:17;:14;:17;:::i;:::-;16332:12;:32;16245:139;15841:1058;;;16564:79;16619:23;16564:50;16581:32;16564:12;;:16;;:50;;;;:::i;:79::-;16549:12;:94;16756:17;:10;16771:1;16756:17;:14;:17;:::i;:::-;16741:12;;:32;16738:147;;;16846:17;:10;16861:1;16846:17;:14;:17;:::i;:::-;16831:12;:32;16738:147;16956:15;16924:29;:47;17003:15;;16988:12;;:30;16985:119;;;17076:15;;17061:12;:30;16985:119;17135:15;;17120:12;;:30;17117:114;;;17203:15;;17188:12;:30;17117:114;15187:2052;;;:::o;28122:1294::-;28165:12;28261:1;28244:14;;:18;28236:27;;;;;;;;28322:1;28316:3;:7;:32;;;;;28334:14;;28327:3;:21;;28316:32;28308:41;;;;;;;;28385:21;28409:12;;;:7;:12;;;;;28499:9;;:14;;28491:23;;;;;;28589:9;;28564:8;28575:24;;;:13;:24;;;;;;28605:10;;28602:23;;28617:8;;;28602:23;28676:18;28780:8;;28775:2;:14;28764:8;:25;28754:6;;:35;;28751:210;;;28814:41;28846:8;28815:25;28826:13;;28815:6;;:10;;:25;;;;:::i;28814:41::-;28793:63;;28751:210;;;-1:-1:-1;28941:16:0;;28751:210;29025:63;29079:8;29026:47;29044:28;;29026:13;:17;;:47;;;;:::i;29025:63::-;28991:26;;;:98;29143:26;;29124:61;;29176:8;;29125:45;;:13;;:45;:17;:45;:::i;29124:61::-;29092:24;;;:94;29202:6;;:25;;29213:13;29202:25;:10;:25;:::i;:::-;29193:6;:34;29273:4;29256:23;;;;:8;:23;;;;;;:42;;29284:13;29256:42;:27;:42;:::i;:::-;29247:4;29230:23;;;;:8;:23;;;;;;;;:68;;;;29315:9;;29301:24;;:13;:24;;;:40;;;29367:20;;:27;;29392:1;29367:27;:24;:27;:::i;:::-;29344:20;:50;-1:-1:-1;29406:4:0;;28122:1294;-1:-1:-1;;;;28122:1294:0:o;30504:1984::-;30827:21;;30808:14;;30547:18;;;;;;;;30808:41;;;:18;:41;:::i;:::-;30790:59;;30786:255;30865:14;;:21;;30884:1;30865:21;:18;:21;:::i;:::-;30851:35;;30786:255;;30934:19;;;;:7;:19;;;;;:28;;;30920:43;;:9;;:43;:13;:43;:::i;:::-;31003:19;;;;:7;:19;;;;;:32;;;30908:55;;-1:-1:-1;30985:51:0;;:13;;:51;:17;:51;:::i;:::-;30969:67;-1:-1:-1;30889:12:0;;30786:255;;;-1:-1:-1;31050:28:0;:9;31064:13;31050:28;:13;:28;:::i;:::-;:33;31047:165;;;31106:4;31090:20;;31047:165;;;31151:54;31176:28;:9;31190:13;31176:28;:13;:28;:::i;:::-;31151:20;:9;31165:5;31151:20;:13;:20;:::i;:54::-;31130:76;;31047:165;31409:21;;31393:13;:37;31389:788;;;31489:21;;31457:28;;31489:40;;31515:13;31489:40;:25;:40;:::i;:::-;31457:73;;31637:96;31660:72;31726:5;31661:59;31696:23;31662:28;31685:4;31662:18;;:22;;:28;;;;:::i;31660:72::-;31637:18;;;:96;:22;:96;:::i;:::-;31611:18;:123;-1:-1:-1;31389:788:0;;;31825:26;31860:40;31878:21;;31860:13;:17;;:40;;;;:::i;:::-;31825:77;;32010:92;32033:68;32095:5;32034:55;32067:21;32043:18;;32035:5;:26;32034:32;;:55;;;;:::i;32033:68::-;32010:18;;;:92;:22;:92;:::i;:::-;31984:18;:119;-1:-1:-1;31389:788:0;32216:4;32195:18;;:25;32192:141;;;32316:4;32295:18;:25;32192:141;32370:4;32349:18;;:25;32346:137;;;32466:4;32445:18;:25;30504:1984;;;:::o;33465:714::-;33532:12;33563:11;;;33555:20;;;;;;-1:-1:-1;;;;;33608:23:0;;;;;;:14;:23;;;;;;:30;;33636:1;33608:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;33582:23:0;;;;;;:14;:23;;;;;;;;:56;;;;33813:21;;;;;:34;;33839:7;33813:34;:25;:34;:::i;:::-;-1:-1:-1;;;;;33789:21:0;;;;;;:12;:21;;;;;;:58;;;;33891:16;;33871:37;;:15;;:37;:19;:37;:::i;:::-;34044:71;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34001:15:0;;-1:-1:-1;34001:15:0;;;:6;:15;;;;;34017:14;:23;;;;;;34001:40;;;;;;;:114;;;;;;;;;;;;;;34129:26;;;;;;;33856:52;;-1:-1:-1;34001:15:0;;34129:26;;;;;;;;;;-1:-1:-1;34171:4:0;;33465:714;-1:-1:-1;;;33465:714:0:o;19140:45731::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19140:45731:0;;;-1:-1:-1;19140:45731:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://a5cd15fb8a7b562dc4664ff38498fb4da05d55ec6573729d7f6af4ce097e8bec
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.