Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- GovernorAlpha
- Optimization enabled
- false
- Compiler version
- v0.8.10+commit.fc410830
- EVM Version
- default
- Verified at
- 2023-10-24T16:00:34.829685Z
Constructor Arguments
000000000000000000000000395179acf0ec5cbd48bb9ea20606889a8f0427f0000000000000000000000000e18c200a70908c89ffa18c628fe1b83ac0065ea4000000000000000000000000f33da2a3fd5e02ad8005cec0a6d3679959e75e5d
Arg [0] (address) : 0x395179acf0ec5cbd48bb9ea20606889a8f0427f0
Arg [1] (address) : 0xe18c200a70908c89ffa18c628fe1b83ac0065ea4
Arg [2] (address) : 0xf33da2a3fd5e02ad8005cec0a6d3679959e75e5d
Contract source code
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.10; contract GovernorAlpha { /// @notice The name of this contract string public constant name = "Pegasys Governor Alpha"; /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed function quorumVotes() public pure returns (uint) { return 4000000e18; } // 4,000,000 = 4% of PSYS /// @notice The number of votes required in order for a voter to become a proposer function proposalThreshold() public pure returns (uint) { return 1000000e18; } // 1,000,000 = 1% of PSYS /// @notice The maximum number of actions that can be included in a proposal function proposalMaxOperations() public pure returns (uint) { return 10; } // 10 actions /// @notice The delay before voting on a proposal may take place, once proposed function votingDelay() public pure returns (uint) { return 1; } // 1 block /// @notice The duration of voting on a proposal, in blocks function votingPeriod() public pure virtual returns (uint) { return 1728; } // ~3 days in blocks (assuming 150s blocks) /// @notice The address of the Pegasys Protocol Timelock TimelockInterface public timelock; /// @notice The address of the Pegasys governance token PsysInterface public psys; /// @notice The address of the Governor Guardian address public guardian; /// @notice The total number of proposals uint public proposalCount; struct Proposal { /// @notice Unique id for looking up a proposal uint id; /// @notice Creator of the proposal address proposer; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint endBlock; /// @notice Current number of votes in favor of this proposal uint forVotes; /// @notice Current number of votes in opposition to this proposal uint againstVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal bool support; /// @notice The number of votes the voter had, which were cast uint96 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed } /// @notice The official record of all proposals ever proposed mapping(uint => Proposal) public proposals; /// @notice The latest proposal for each proposer mapping(address => uint) public latestProposalIds; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); /// @notice The EIP-712 typehash for the ballot struct used by the contract bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,bool support)"); /// @notice An event emitted when a new proposal is created event ProposalCreated( uint id, address proposer, address[] targets, uint[] values, string[] signatures, bytes[] calldatas, uint startBlock, uint endBlock, string description ); /// @notice An event emitted when a vote has been cast on a proposal event VoteCast(address voter, uint proposalId, bool support, uint votes); /// @notice An event emitted when a proposal has been canceled event ProposalCanceled(uint id); /// @notice An event emitted when a proposal has been queued in the Timelock event ProposalQueued(uint id, uint eta); /// @notice An event emitted when a proposal has been executed in the Timelock event ProposalExecuted(uint id); constructor( address timelock_, address psys_, address guardian_ ) { timelock = TimelockInterface(timelock_); psys = PsysInterface(psys_); guardian = guardian_; } function propose( address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description ) public returns (uint) { require( psys.getPriorVotes(msg.sender, sub256(block.number, 1)) > proposalThreshold(), "GovernorAlpha::propose: proposer votes below proposal threshold" ); require( targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "GovernorAlpha::propose: proposal function information arity mismatch" ); require( targets.length != 0, "GovernorAlpha::propose: must provide actions" ); require( targets.length <= proposalMaxOperations(), "GovernorAlpha::propose: too many actions" ); uint latestProposalId = latestProposalIds[msg.sender]; if (latestProposalId != 0) { ProposalState proposersLatestProposalState = state( latestProposalId ); require( proposersLatestProposalState != ProposalState.Active, "GovernorAlpha::propose: one live proposal per proposer, found an already active proposal" ); require( proposersLatestProposalState != ProposalState.Pending, "GovernorAlpha::propose: one live proposal per proposer, found an already pending proposal" ); } uint startBlock = add256(block.number, votingDelay()); uint endBlock = add256(startBlock, votingPeriod()); proposalCount++; uint proposalId = proposalCount; Proposal storage newProposal = proposals[proposalId]; // This should never happen but add a check in case. require( newProposal.id == 0, "GovernorAlpha::propose: ProposalID collsion" ); newProposal.id = proposalId; newProposal.proposer = msg.sender; newProposal.eta = 0; newProposal.targets = targets; newProposal.values = values; newProposal.signatures = signatures; newProposal.calldatas = calldatas; newProposal.startBlock = startBlock; newProposal.endBlock = endBlock; newProposal.forVotes = 0; newProposal.againstVotes = 0; newProposal.canceled = false; newProposal.executed = false; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( newProposal.id, msg.sender, targets, values, signatures, calldatas, startBlock, endBlock, description ); return newProposal.id; } function queue(uint proposalId) public { require( state(proposalId) == ProposalState.Succeeded, "GovernorAlpha::queue: proposal can only be queued if it is succeeded" ); Proposal storage proposal = proposals[proposalId]; uint eta = add256(block.timestamp, timelock.delay()); for (uint i = 0; i < proposal.targets.length; i++) { _queueOrRevert( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta ); } proposal.eta = eta; emit ProposalQueued(proposalId, eta); } function _queueOrRevert( address target, uint value, string memory signature, bytes memory data, uint eta ) internal { require( !timelock.queuedTransactions( keccak256(abi.encode(target, value, signature, data, eta)) ), "GovernorAlpha::_queueOrRevert: proposal action already queued at eta" ); timelock.queueTransaction(target, value, signature, data, eta); } function execute(uint proposalId) public payable { require( state(proposalId) == ProposalState.Queued, "GovernorAlpha::execute: proposal can only be executed if it is queued" ); Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { timelock.executeTransaction{value: proposal.values[i]}( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta ); } emit ProposalExecuted(proposalId); } function cancel(uint proposalId) public { ProposalState state = state(proposalId); require( state != ProposalState.Executed, "GovernorAlpha::cancel: cannot cancel executed proposal" ); Proposal storage proposal = proposals[proposalId]; require( msg.sender == guardian || psys.getPriorVotes(proposal.proposer, sub256(block.number, 1)) < proposalThreshold(), "GovernorAlpha::cancel: proposer above threshold" ); proposal.canceled = true; for (uint i = 0; i < proposal.targets.length; i++) { timelock.cancelTransaction( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta ); } emit ProposalCanceled(proposalId); } function getActions(uint proposalId) public view returns ( address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas ) { Proposal storage p = proposals[proposalId]; return (p.targets, p.values, p.signatures, p.calldatas); } function getReceipt(uint proposalId, address voter) public view returns (Receipt memory) { return proposals[proposalId].receipts[voter]; } function state(uint proposalId) public view returns (ProposalState) { require( proposalCount >= proposalId && proposalId > 0, "GovernorAlpha::state: invalid proposal id" ); Proposal storage proposal = proposals[proposalId]; if (proposal.canceled) { return ProposalState.Canceled; } else if (block.number <= proposal.startBlock) { return ProposalState.Pending; } else if (block.number <= proposal.endBlock) { return ProposalState.Active; } else if ( proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes() ) { return ProposalState.Defeated; } else if (proposal.eta == 0) { return ProposalState.Succeeded; } else if (proposal.executed) { return ProposalState.Executed; } else if ( block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD()) ) { return ProposalState.Expired; } else { return ProposalState.Queued; } } function castVote(uint proposalId, bool support) public { return _castVote(msg.sender, proposalId, support); } function castVoteBySig( uint proposalId, bool support, uint8 v, bytes32 r, bytes32 s ) public { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(BALLOT_TYPEHASH, proposalId, support) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "GovernorAlpha::castVoteBySig: invalid signature" ); return _castVote(signatory, proposalId, support); } function _castVote( address voter, uint proposalId, bool support ) internal { require( state(proposalId) == ProposalState.Active, "GovernorAlpha::_castVote: voting is closed" ); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[voter]; require( receipt.hasVoted == false, "GovernorAlpha::_castVote: voter already voted" ); uint96 votes = psys.getPriorVotes(voter, proposal.startBlock); if (support) { proposal.forVotes = add256(proposal.forVotes, votes); } else { proposal.againstVotes = add256(proposal.againstVotes, votes); } receipt.hasVoted = true; receipt.support = support; receipt.votes = votes; emit VoteCast(voter, proposalId, support, votes); } function __acceptAdmin() public { require( msg.sender == guardian, "GovernorAlpha::__acceptAdmin: sender must be gov guardian" ); timelock.acceptAdmin(); } function __abdicate() public { require( msg.sender == guardian, "GovernorAlpha::__abdicate: sender must be gov guardian" ); guardian = address(0); } function __queueSetTimelockPendingAdmin(address newPendingAdmin, uint eta) public { require( msg.sender == guardian, "GovernorAlpha::__queueSetTimelockPendingAdmin: sender must be gov guardian" ); timelock.queueTransaction( address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta ); } function __executeSetTimelockPendingAdmin(address newPendingAdmin, uint eta) public { require( msg.sender == guardian, "GovernorAlpha::__executeSetTimelockPendingAdmin: sender must be gov guardian" ); timelock.executeTransaction( address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta ); } function add256(uint256 a, uint256 b) internal pure returns (uint) { uint c = a + b; require(c >= a, "addition overflow"); return c; } function sub256(uint256 a, uint256 b) internal pure returns (uint) { require(b <= a, "subtraction underflow"); return a - b; } function getChainId() internal view returns (uint) { uint chainId; assembly { chainId := chainid() } return chainId; } } interface TimelockInterface { function delay() external view returns (uint); function GRACE_PERIOD() external view returns (uint); function acceptAdmin() external; function queuedTransactions(bytes32 hash) external view returns (bool); function queueTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external returns (bytes32); function cancelTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external; function executeTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external payable returns (bytes memory); } interface PsysInterface { function getPriorVotes(address account, uint blockNumber) external view returns (uint96); }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"timelock_","internalType":"address"},{"type":"address","name":"psys_","internalType":"address"},{"type":"address","name":"guardian_","internalType":"address"}]},{"type":"event","name":"ProposalCanceled","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCreated","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"address","name":"proposer","internalType":"address","indexed":false},{"type":"address[]","name":"targets","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false},{"type":"string[]","name":"signatures","internalType":"string[]","indexed":false},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]","indexed":false},{"type":"uint256","name":"startBlock","internalType":"uint256","indexed":false},{"type":"uint256","name":"endBlock","internalType":"uint256","indexed":false},{"type":"string","name":"description","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalExecuted","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalQueued","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VoteCast","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":false},{"type":"uint256","name":"proposalId","internalType":"uint256","indexed":false},{"type":"bool","name":"support","internalType":"bool","indexed":false},{"type":"uint256","name":"votes","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BALLOT_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__abdicate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__acceptAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__executeSetTimelockPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__queueSetTimelockPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancel","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVote","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"bool","name":"support","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteBySig","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"}],"name":"getActions","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernorAlpha.Receipt","components":[{"type":"bool","name":"hasVoted","internalType":"bool"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint96","name":"votes","internalType":"uint96"}]}],"name":"getReceipt","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"address","name":"voter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"guardian","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestProposalIds","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalCount","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalMaxOperations","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"proposer","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"uint256","name":"forVotes","internalType":"uint256"},{"type":"uint256","name":"againstVotes","internalType":"uint256"},{"type":"bool","name":"canceled","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"}],"name":"proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"propose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract PsysInterface"}],"name":"psys","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"queue","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quorumVotes","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum GovernorAlpha.ProposalState"}],"name":"state","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TimelockInterface"}],"name":"timelock","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingDelay","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingPeriod","inputs":[]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604051620056503803806200565083398181016040528101906200003791906200016c565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620001c8565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001348262000107565b9050919050565b620001468162000127565b81146200015257600080fd5b50565b60008151905062000166816200013b565b92915050565b60008060006060848603121562000188576200018762000102565b5b6000620001988682870162000155565b9350506020620001ab8682870162000155565b9250506040620001be8682870162000155565b9150509250925092565b61547880620001d86000396000f3fe60806040526004361061019c5760003560e01c8063452a9320116100ec578063d33219b41161008a578063ddf0b00911610064578063ddf0b009146105b1578063deaaa7cc146105da578063e23a9a5214610605578063fe0d94c1146106425761019c565b8063d33219b41461051e578063da35c66414610549578063da95691a146105745761019c565b80637bdbe4d0116100c65780637bdbe4d01461048857806391500671146104b3578063b58131b0146104dc578063b9a61961146105075761019c565b8063452a93201461041d5780634634c61f14610448578063760fbc13146104715761019c565b806321f43e42116101595780633932abb1116101335780633932abb114610361578063393aac271461038c5780633e4f49e6146103b757806340e58ee5146103f45761019c565b806321f43e42146102cd57806324bc1a64146102f6578063328dd982146103215761019c565b8063013cf08b146101a157806302a251a3146101e657806306fdde031461021157806315373e3d1461023c57806317977c611461026557806320606b70146102a2575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612ce1565b61065e565b6040516101dd99989796959493929190612d79565b60405180910390f35b3480156101f257600080fd5b506101fb6106e6565b6040516102089190612e06565b60405180910390f35b34801561021d57600080fd5b506102266106f0565b6040516102339190612eba565b60405180910390f35b34801561024857600080fd5b50610263600480360381019061025e9190612f08565b610729565b005b34801561027157600080fd5b5061028c60048036038101906102879190612f74565b610738565b6040516102999190612e06565b60405180910390f35b3480156102ae57600080fd5b506102b7610750565b6040516102c49190612fba565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190612fd5565b610774565b005b34801561030257600080fd5b5061030b6108f0565b6040516103189190612e06565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612ce1565b610903565b60405161035894939291906133b4565b60405180910390f35b34801561036d57600080fd5b50610376610bc0565b6040516103839190612e06565b60405180910390f35b34801561039857600080fd5b506103a1610bc9565b6040516103ae9190613474565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612ce1565b610bef565b6040516103eb9190613506565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190612ce1565b610dc3565b005b34801561042957600080fd5b5061043261117c565b60405161043f9190613521565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a91906135a1565b6111a2565b005b34801561047d57600080fd5b5061048661138b565b005b34801561049457600080fd5b5061049d61145f565b6040516104aa9190612e06565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612fd5565b611468565b005b3480156104e857600080fd5b506104f16115df565b6040516104fe9190612e06565b60405180910390f35b34801561051357600080fd5b5061051c6115f1565b005b34801561052a57600080fd5b50610533611703565b604051610540919061363d565b60405180910390f35b34801561055557600080fd5b5061055e611727565b60405161056b9190612e06565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613b7b565b61172d565b6040516105a89190612e06565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190612ce1565b611cd3565b005b3480156105e657600080fd5b506105ef61201f565b6040516105fc9190612fba565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613c82565b612043565b6040516106399190613d3a565b60405180910390f35b61065c60048036038101906106579190612ce1565b612125565b005b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff16905089565b60006106c0905090565b6040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525081565b610734338383612396565b5050565b60056020528060005260406000206000915090505481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fb90613ded565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016108749190613521565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016108a39493929190613ede565b6000604051808303816000875af11580156108c2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108eb9190613fad565b505050565b60006a034f086f3b33b684000000905090565b606080606080600060046000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156109b157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610967575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610a0357602002820191906000526020600020905b8154815260200190600101908083116109ef575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610ad7578382906000526020600020018054610a4a90614025565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7690614025565b8015610ac35780601f10610a9857610100808354040283529160200191610ac3565b820191906000526020600020905b815481529060010190602001808311610aa657829003601f168201915b505050505081526020019060010190610a2b565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610baa578382906000526020600020018054610b1d90614025565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4990614025565b8015610b965780601f10610b6b57610100808354040283529160200191610b96565b820191906000526020600020905b815481529060010190602001808311610b7957829003601f168201915b505050505081526020019060010190610afe565b5050505090509450945094509450509193509193565b60006001905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160035410158015610c035750600082115b610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906140c9565b60405180910390fd5b600060046000848152602001908152602001600020905080600b0160009054906101000a900460ff1615610c7a576002915050610dbe565b80600701544311610c8f576000915050610dbe565b80600801544311610ca4576001915050610dbe565b80600a01548160090154111580610cc55750610cbe6108f0565b8160090154105b15610cd4576003915050610dbe565b600081600201541415610ceb576004915050610dbe565b80600b0160019054906101000a900460ff1615610d0c576007915050610dbe565b610da8816002015460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da391906140fe565b612664565b4210610db8576006915050610dbe565b60059150505b919050565b6000610dce82610bef565b9050600780811115610de357610de261348f565b5b816007811115610df657610df561348f565b5b1415610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e9061419d565b60405180910390fd5b6000600460008481526020019081526020016000209050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f895750610ead6115df565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f1b4360016126c2565b6040518363ffffffff1660e01b8152600401610f389291906141bd565b602060405180830381865afa158015610f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f799190614212565b6bffffffffffffffffffffffff16105b610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf906142b1565b60405180910390fd5b600181600b0160006101000a81548160ff02191690831515021790555060005b816003018054905081101561113f5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663591fcdfe836003018381548110611049576110486142d1565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600401848154811061108a576110896142d1565b5b90600052602060002001548560050185815481106110ab576110aa6142d1565b5b906000526020600020018660060186815481106110cb576110ca6142d1565b5b9060005260206000200187600201546040518663ffffffff1660e01b81526004016110fa95949392919061442a565b600060405180830381600087803b15801561111457600080fd5b505af1158015611128573d6000803e3d6000fd5b505050508080611137906144ba565b915050610fe8565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c8360405161116f9190612e06565b60405180910390a1505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c706861000000000000000000008152508051906020012061120a61271b565b3060405160200161121e9493929190614503565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee878760405160200161126d93929190614548565b6040516020818303038152906040528051906020012090506000828260405160200161129a9291906145f7565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516112d7949392919061463d565b6020604051602081039080840390855afa1580156112f9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c906146f4565b60405180910390fd5b611380818a8a612396565b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290614786565b60405180910390fd5b6000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef9061483e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016115689190613521565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016115979493929190613ede565b6020604051808303816000875af11580156115b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115da9190614873565b505050565b600069d3c21bcecceda1000000905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614912565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e957600080fd5b505af11580156116fd573d6000803e3d6000fd5b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60006117376115df565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe1336117814360016126c2565b6040518363ffffffff1660e01b815260040161179e9291906141bd565b602060405180830381865afa1580156117bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df9190614212565b6bffffffffffffffffffffffff161161182d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611824906149a4565b60405180910390fd5b8451865114801561183f575083518651145b801561184c575082518651145b61188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290614a5c565b60405180910390fd5b6000865114156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c790614aee565b60405180910390fd5b6118d861145f565b8651111561191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290614b80565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114611a4657600061197282610bef565b9050600160078111156119885761198761348f565b5b81600781111561199b5761199a61348f565b5b14156119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390614c38565b60405180910390fd5b600060078111156119f0576119ef61348f565b5b816007811115611a0357611a0261348f565b5b1415611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b90614cf0565b60405180910390fd5b505b6000611a5943611a54610bc0565b612664565b90506000611a6e82611a696106e6565b612664565b905060036000815480929190611a83906144ba565b91905055506000600354905060006004600083815260200190815260200160002090506000816000015414611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490614d82565b60405180910390fd5b818160000181905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081600201819055508a816003019080519060200190611b5b9291906128dc565b5089816004019080519060200190611b74929190612966565b5088816005019080519060200190611b8d9291906129b3565b5087816006019080519060200190611ba6929190612a13565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0160006101000a81548160ff021916908315150217905550600081600b0160016101000a81548160ff0219169083151502179055508060000154600560008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f604051611cb699989796959493929190614da2565b60405180910390a180600001549550505050505095945050505050565b60046007811115611ce757611ce661348f565b5b611cf082610bef565b6007811115611d0257611d0161348f565b5b14611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990614eea565b60405180910390fd5b60006004600083815260200190815260200160002090506000611df34260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dee91906140fe565b612664565b905060005b8260030180549050811015611fd757611fc4836003018281548110611e2057611e1f6142d1565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018381548110611e6157611e606142d1565b5b9060005260206000200154856005018481548110611e8257611e816142d1565b5b906000526020600020018054611e9790614025565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec390614025565b8015611f105780601f10611ee557610100808354040283529160200191611f10565b820191906000526020600020905b815481529060010190602001808311611ef357829003601f168201915b5050505050866006018581548110611f2b57611f2a6142d1565b5b906000526020600020018054611f4090614025565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6c90614025565b8015611fb95780601f10611f8e57610100808354040283529160200191611fb9565b820191906000526020600020905b815481529060010190602001808311611f9c57829003601f168201915b505050505086612728565b8080611fcf906144ba565b915050611df8565b508082600201819055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928382604051612012929190614f0a565b60405180910390a1505050565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b61204b612a73565b60046000848152602001908152602001600020600c0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b600560078111156121395761213861348f565b5b61214282610bef565b60078111156121545761215361348f565b5b14612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b90614fcb565b60405180910390fd5b6000600460008381526020019081526020016000209050600181600b0160016101000a81548160ff02191690831515021790555060005b816003018054905081101561235a5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f83600401838154811061222c5761222b6142d1565b5b906000526020600020015484600301848154811061224d5761224c6142d1565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600401858154811061228e5761228d6142d1565b5b90600052602060002001548660050186815481106122af576122ae6142d1565b5b906000526020600020018760060187815481106122cf576122ce6142d1565b5b9060005260206000200188600201546040518763ffffffff1660e01b81526004016122fe95949392919061442a565b60006040518083038185885af115801561231c573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906123469190613fad565b508080612352906144ba565b9150506121cb565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f8260405161238a9190612e06565b60405180910390a15050565b600160078111156123aa576123a961348f565b5b6123b383610bef565b60078111156123c5576123c461348f565b5b14612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc9061505d565b60405180910390fd5b6000600460008481526020019081526020016000209050600081600c0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b0906150ef565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18785600701546040518363ffffffff1660e01b815260040161251c9291906141bd565b602060405180830381865afa158015612539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255d9190614212565b9050831561258e576125818360090154826bffffffffffffffffffffffff16612664565b83600901819055506125b3565b6125aa83600a0154826bffffffffffffffffffffffff16612664565b83600a01819055505b60018260000160006101000a81548160ff021916908315150217905550838260000160016101000a81548160ff021916908315150217905550808260000160026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055507f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c46868686846040516126549493929190615140565b60405180910390a1505050505050565b60008082846126739190615185565b9050838110156126b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126af90615227565b60405180910390fd5b8091505092915050565b600082821115612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90615293565b60405180910390fd5b818361271391906152b3565b905092915050565b6000804690508091505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2b06537868686868660405160200161277d9594939291906152e7565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016127af9190612fba565b602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f0919061535d565b15612830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282790615422565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90186868686866040518663ffffffff1660e01b81526004016128919594939291906152e7565b6020604051808303816000875af11580156128b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d49190614873565b505050505050565b828054828255906000526020600020908101928215612955579160200282015b828111156129545782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906128fc565b5b5090506129629190612aa6565b5090565b8280548282559060005260206000209081019282156129a2579160200282015b828111156129a1578251825591602001919060010190612986565b5b5090506129af9190612aa6565b5090565b828054828255906000526020600020908101928215612a02579160200282015b82811115612a015782518290805190602001906129f1929190612ac3565b50916020019190600101906129d3565b5b509050612a0f9190612b49565b5090565b828054828255906000526020600020908101928215612a62579160200282015b82811115612a61578251829080519060200190612a51929190612b6d565b5091602001919060010190612a33565b5b509050612a6f9190612bf3565b5090565b604051806060016040528060001515815260200160001515815260200160006bffffffffffffffffffffffff1681525090565b5b80821115612abf576000816000905550600101612aa7565b5090565b828054612acf90614025565b90600052602060002090601f016020900481019282612af15760008555612b38565b82601f10612b0a57805160ff1916838001178555612b38565b82800160010185558215612b38579182015b82811115612b37578251825591602001919060010190612b1c565b5b509050612b459190612aa6565b5090565b5b80821115612b695760008181612b609190612c17565b50600101612b4a565b5090565b828054612b7990614025565b90600052602060002090601f016020900481019282612b9b5760008555612be2565b82601f10612bb457805160ff1916838001178555612be2565b82800160010185558215612be2579182015b82811115612be1578251825591602001919060010190612bc6565b5b509050612bef9190612aa6565b5090565b5b80821115612c135760008181612c0a9190612c57565b50600101612bf4565b5090565b508054612c2390614025565b6000825580601f10612c355750612c54565b601f016020900490600052602060002090810190612c539190612aa6565b5b50565b508054612c6390614025565b6000825580601f10612c755750612c94565b601f016020900490600052602060002090810190612c939190612aa6565b5b50565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612cbe81612cab565b8114612cc957600080fd5b50565b600081359050612cdb81612cb5565b92915050565b600060208284031215612cf757612cf6612ca1565b5b6000612d0584828501612ccc565b91505092915050565b612d1781612cab565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d4882612d1d565b9050919050565b612d5881612d3d565b82525050565b60008115159050919050565b612d7381612d5e565b82525050565b600061012082019050612d8f600083018c612d0e565b612d9c602083018b612d4f565b612da9604083018a612d0e565b612db66060830189612d0e565b612dc36080830188612d0e565b612dd060a0830187612d0e565b612ddd60c0830186612d0e565b612dea60e0830185612d6a565b612df8610100830184612d6a565b9a9950505050505050505050565b6000602082019050612e1b6000830184612d0e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e5b578082015181840152602081019050612e40565b83811115612e6a576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e8c82612e21565b612e968185612e2c565b9350612ea6818560208601612e3d565b612eaf81612e70565b840191505092915050565b60006020820190508181036000830152612ed48184612e81565b905092915050565b612ee581612d5e565b8114612ef057600080fd5b50565b600081359050612f0281612edc565b92915050565b60008060408385031215612f1f57612f1e612ca1565b5b6000612f2d85828601612ccc565b9250506020612f3e85828601612ef3565b9150509250929050565b612f5181612d3d565b8114612f5c57600080fd5b50565b600081359050612f6e81612f48565b92915050565b600060208284031215612f8a57612f89612ca1565b5b6000612f9884828501612f5f565b91505092915050565b6000819050919050565b612fb481612fa1565b82525050565b6000602082019050612fcf6000830184612fab565b92915050565b60008060408385031215612fec57612feb612ca1565b5b6000612ffa85828601612f5f565b925050602061300b85828601612ccc565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61304a81612d3d565b82525050565b600061305c8383613041565b60208301905092915050565b6000602082019050919050565b600061308082613015565b61308a8185613020565b935061309583613031565b8060005b838110156130c65781516130ad8882613050565b97506130b883613068565b925050600181019050613099565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61310881612cab565b82525050565b600061311a83836130ff565b60208301905092915050565b6000602082019050919050565b600061313e826130d3565b61314881856130de565b9350613153836130ef565b8060005b8381101561318457815161316b888261310e565b975061317683613126565b925050600181019050613157565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006131d982612e21565b6131e381856131bd565b93506131f3818560208601612e3d565b6131fc81612e70565b840191505092915050565b600061321383836131ce565b905092915050565b6000602082019050919050565b600061323382613191565b61323d818561319c565b93508360208202850161324f856131ad565b8060005b8581101561328b578484038952815161326c8582613207565b94506132778361321b565b925060208a01995050600181019050613253565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006132f0826132c9565b6132fa81856132d4565b935061330a818560208601612e3d565b61331381612e70565b840191505092915050565b600061332a83836132e5565b905092915050565b6000602082019050919050565b600061334a8261329d565b61335481856132a8565b935083602082028501613366856132b9565b8060005b858110156133a25784840389528151613383858261331e565b945061338e83613332565b925060208a0199505060018101905061336a565b50829750879550505050505092915050565b600060808201905081810360008301526133ce8187613075565b905081810360208301526133e28186613133565b905081810360408301526133f68185613228565b9050818103606083015261340a818461333f565b905095945050505050565b6000819050919050565b600061343a61343561343084612d1d565b613415565b612d1d565b9050919050565b600061344c8261341f565b9050919050565b600061345e82613441565b9050919050565b61346e81613453565b82525050565b60006020820190506134896000830184613465565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106134cf576134ce61348f565b5b50565b60008190506134e0826134be565b919050565b60006134f0826134d2565b9050919050565b613500816134e5565b82525050565b600060208201905061351b60008301846134f7565b92915050565b60006020820190506135366000830184612d4f565b92915050565b600060ff82169050919050565b6135528161353c565b811461355d57600080fd5b50565b60008135905061356f81613549565b92915050565b61357e81612fa1565b811461358957600080fd5b50565b60008135905061359b81613575565b92915050565b600080600080600060a086880312156135bd576135bc612ca1565b5b60006135cb88828901612ccc565b95505060206135dc88828901612ef3565b94505060406135ed88828901613560565b93505060606135fe8882890161358c565b925050608061360f8882890161358c565b9150509295509295909350565b600061362782613441565b9050919050565b6136378161361c565b82525050565b6000602082019050613652600083018461362e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61369582612e70565b810181811067ffffffffffffffff821117156136b4576136b361365d565b5b80604052505050565b60006136c7612c97565b90506136d3828261368c565b919050565b600067ffffffffffffffff8211156136f3576136f261365d565b5b602082029050602081019050919050565b600080fd5b600061371c613717846136d8565b6136bd565b9050808382526020820190506020840283018581111561373f5761373e613704565b5b835b8181101561376857806137548882612f5f565b845260208401935050602081019050613741565b5050509392505050565b600082601f83011261378757613786613658565b5b8135613797848260208601613709565b91505092915050565b600067ffffffffffffffff8211156137bb576137ba61365d565b5b602082029050602081019050919050565b60006137df6137da846137a0565b6136bd565b9050808382526020820190506020840283018581111561380257613801613704565b5b835b8181101561382b57806138178882612ccc565b845260208401935050602081019050613804565b5050509392505050565b600082601f83011261384a57613849613658565b5b813561385a8482602086016137cc565b91505092915050565b600067ffffffffffffffff82111561387e5761387d61365d565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156138af576138ae61365d565b5b6138b882612e70565b9050602081019050919050565b82818337600083830152505050565b60006138e76138e284613894565b6136bd565b9050828152602081018484840111156139035761390261388f565b5b61390e8482856138c5565b509392505050565b600082601f83011261392b5761392a613658565b5b813561393b8482602086016138d4565b91505092915050565b600061395761395284613863565b6136bd565b9050808382526020820190506020840283018581111561397a57613979613704565b5b835b818110156139c157803567ffffffffffffffff81111561399f5761399e613658565b5b8086016139ac8982613916565b8552602085019450505060208101905061397c565b5050509392505050565b600082601f8301126139e0576139df613658565b5b81356139f0848260208601613944565b91505092915050565b600067ffffffffffffffff821115613a1457613a1361365d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a4057613a3f61365d565b5b613a4982612e70565b9050602081019050919050565b6000613a69613a6484613a25565b6136bd565b905082815260208101848484011115613a8557613a8461388f565b5b613a908482856138c5565b509392505050565b600082601f830112613aad57613aac613658565b5b8135613abd848260208601613a56565b91505092915050565b6000613ad9613ad4846139f9565b6136bd565b90508083825260208201905060208402830185811115613afc57613afb613704565b5b835b81811015613b4357803567ffffffffffffffff811115613b2157613b20613658565b5b808601613b2e8982613a98565b85526020850194505050602081019050613afe565b5050509392505050565b600082601f830112613b6257613b61613658565b5b8135613b72848260208601613ac6565b91505092915050565b600080600080600060a08688031215613b9757613b96612ca1565b5b600086013567ffffffffffffffff811115613bb557613bb4612ca6565b5b613bc188828901613772565b955050602086013567ffffffffffffffff811115613be257613be1612ca6565b5b613bee88828901613835565b945050604086013567ffffffffffffffff811115613c0f57613c0e612ca6565b5b613c1b888289016139cb565b935050606086013567ffffffffffffffff811115613c3c57613c3b612ca6565b5b613c4888828901613b4d565b925050608086013567ffffffffffffffff811115613c6957613c68612ca6565b5b613c7588828901613916565b9150509295509295909350565b60008060408385031215613c9957613c98612ca1565b5b6000613ca785828601612ccc565b9250506020613cb885828601612f5f565b9150509250929050565b613ccb81612d5e565b82525050565b60006bffffffffffffffffffffffff82169050919050565b613cf281613cd1565b82525050565b606082016000820151613d0e6000850182613cc2565b506020820151613d216020850182613cc2565b506040820151613d346040850182613ce9565b50505050565b6000606082019050613d4f6000830184613cf8565b92915050565b7f476f7665726e6f72416c7068613a3a5f5f6578656375746553657454696d656c60008201527f6f636b50656e64696e6741646d696e3a2073656e646572206d7573742062652060208201527f676f7620677561726469616e0000000000000000000000000000000000000000604082015250565b6000613dd7604c83612e2c565b9150613de282613d55565b606082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b6000819050919050565b6000613e32613e2d613e2884613e0d565b613415565b612cab565b9050919050565b613e4281613e17565b82525050565b7f73657450656e64696e6741646d696e2861646472657373290000000000000000600082015250565b6000613e7e601883612e2c565b9150613e8982613e48565b602082019050919050565b600082825260208201905092915050565b6000613eb0826132c9565b613eba8185613e94565b9350613eca818560208601612e3d565b613ed381612e70565b840191505092915050565b600060a082019050613ef36000830187612d4f565b613f006020830186613e39565b8181036040830152613f1181613e71565b90508181036060830152613f258185613ea5565b9050613f346080830184612d0e565b95945050505050565b6000613f50613f4b84613a25565b6136bd565b905082815260208101848484011115613f6c57613f6b61388f565b5b613f77848285612e3d565b509392505050565b600082601f830112613f9457613f93613658565b5b8151613fa4848260208601613f3d565b91505092915050565b600060208284031215613fc357613fc2612ca1565b5b600082015167ffffffffffffffff811115613fe157613fe0612ca6565b5b613fed84828501613f7f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403d57607f821691505b6020821081141561405157614050613ff6565b5b50919050565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c696420707260008201527f6f706f73616c2069640000000000000000000000000000000000000000000000602082015250565b60006140b3602983612e2c565b91506140be82614057565b604082019050919050565b600060208201905081810360008301526140e2816140a6565b9050919050565b6000815190506140f881612cb5565b92915050565b60006020828403121561411457614113612ca1565b5b6000614122848285016140e9565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f7420636160008201527f6e63656c2065786563757465642070726f706f73616c00000000000000000000602082015250565b6000614187603683612e2c565b91506141928261412b565b604082019050919050565b600060208201905081810360008301526141b68161417a565b9050919050565b60006040820190506141d26000830185612d4f565b6141df6020830184612d0e565b9392505050565b6141ef81613cd1565b81146141fa57600080fd5b50565b60008151905061420c816141e6565b92915050565b60006020828403121561422857614227612ca1565b5b6000614236848285016141fd565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722060008201527f61626f7665207468726573686f6c640000000000000000000000000000000000602082015250565b600061429b602f83612e2c565b91506142a68261423f565b604082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b6000815461432281614025565b61432c8186612e2c565b9450600182166000811461434757600181146143595761438c565b60ff198316865260208601935061438c565b61436285614300565b60005b8381101561438457815481890152600182019150602081019050614365565b808801955050505b50505092915050565b60008190508160005260206000209050919050565b600081546143b781614025565b6143c18186613e94565b945060018216600081146143dc57600181146143ee57614421565b60ff1983168652602086019350614421565b6143f785614395565b60005b83811015614419578154818901526001820191506020810190506143fa565b808801955050505b50505092915050565b600060a08201905061443f6000830188612d4f565b61444c6020830187612d0e565b818103604083015261445e8186614315565b9050818103606083015261447281856143aa565b90506144816080830184612d0e565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144c582612cab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144f8576144f761448b565b5b600182019050919050565b60006080820190506145186000830187612fab565b6145256020830186612fab565b6145326040830185612d0e565b61453f6060830184612d4f565b95945050505050565b600060608201905061455d6000830186612fab565b61456a6020830185612d0e565b6145776040830184612d6a565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006145c060028361457f565b91506145cb8261458a565b600282019050919050565b6000819050919050565b6145f16145ec82612fa1565b6145d6565b82525050565b6000614602826145b3565b915061460e82856145e0565b60208201915061461e82846145e0565b6020820191508190509392505050565b6146378161353c565b82525050565b60006080820190506146526000830187612fab565b61465f602083018661462e565b61466c6040830185612fab565b6146796060830184612fab565b95945050505050565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e60008201527f76616c6964207369676e61747572650000000000000000000000000000000000602082015250565b60006146de602f83612e2c565b91506146e982614682565b604082019050919050565b6000602082019050818103600083015261470d816146d1565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e646560008201527f72206d75737420626520676f7620677561726469616e00000000000000000000602082015250565b6000614770603683612e2c565b915061477b82614714565b604082019050919050565b6000602082019050818103600083015261479f81614763565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f717565756553657454696d656c6f6360008201527f6b50656e64696e6741646d696e3a2073656e646572206d75737420626520676f60208201527f7620677561726469616e00000000000000000000000000000000000000000000604082015250565b6000614828604a83612e2c565b9150614833826147a6565b606082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b60008151905061486d81613575565b92915050565b60006020828403121561488957614888612ca1565b5b60006148978482850161485e565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f5f61636365707441646d696e3a20736560008201527f6e646572206d75737420626520676f7620677561726469616e00000000000000602082015250565b60006148fc603983612e2c565b9150614907826148a0565b604082019050919050565b6000602082019050818103600083015261492b816148ef565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657260008201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015250565b600061498e603f83612e2c565b915061499982614932565b604082019050919050565b600060208201905081810360008301526149bd81614981565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c60008201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d60208201527f6174636800000000000000000000000000000000000000000000000000000000604082015250565b6000614a46604483612e2c565b9150614a51826149c4565b606082019050919050565b60006020820190508181036000830152614a7581614a39565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f60008201527f7669646520616374696f6e730000000000000000000000000000000000000000602082015250565b6000614ad8602c83612e2c565b9150614ae382614a7c565b604082019050919050565b60006020820190508181036000830152614b0781614acb565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7960008201527f20616374696f6e73000000000000000000000000000000000000000000000000602082015250565b6000614b6a602883612e2c565b9150614b7582614b0e565b604082019050919050565b60006020820190508181036000830152614b9981614b5d565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015250565b6000614c22605883612e2c565b9150614c2d82614ba0565b606082019050919050565b60006020820190508181036000830152614c5181614c15565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015250565b6000614cda605983612e2c565b9150614ce582614c58565b606082019050919050565b60006020820190508181036000830152614d0981614ccd565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2050726f706f73616c60008201527f494420636f6c6c73696f6e000000000000000000000000000000000000000000602082015250565b6000614d6c602b83612e2c565b9150614d7782614d10565b604082019050919050565b60006020820190508181036000830152614d9b81614d5f565b9050919050565b600061012082019050614db8600083018c612d0e565b614dc5602083018b612d4f565b8181036040830152614dd7818a613075565b90508181036060830152614deb8189613133565b90508181036080830152614dff8188613228565b905081810360a0830152614e13818761333f565b9050614e2260c0830186612d0e565b614e2f60e0830185612d0e565b818103610100830152614e428184612e81565b90509a9950505050505050505050565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206360008201527f616e206f6e6c792062652071756575656420696620697420697320737563636560208201527f6564656400000000000000000000000000000000000000000000000000000000604082015250565b6000614ed4604483612e2c565b9150614edf82614e52565b606082019050919050565b60006020820190508181036000830152614f0381614ec7565b9050919050565b6000604082019050614f1f6000830185612d0e565b614f2c6020830184612d0e565b9392505050565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c60008201527f2063616e206f6e6c79206265206578656375746564206966206974206973207160208201527f7565756564000000000000000000000000000000000000000000000000000000604082015250565b6000614fb5604583612e2c565b9150614fc082614f33565b606082019050919050565b60006020820190508181036000830152614fe481614fa8565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e6760008201527f20697320636c6f73656400000000000000000000000000000000000000000000602082015250565b6000615047602a83612e2c565b915061505282614feb565b604082019050919050565b600060208201905081810360008301526150768161503a565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722060008201527f616c726561647920766f74656400000000000000000000000000000000000000602082015250565b60006150d9602d83612e2c565b91506150e48261507d565b604082019050919050565b60006020820190508181036000830152615108816150cc565b9050919050565b600061512a61512561512084613cd1565b613415565b612cab565b9050919050565b61513a8161510f565b82525050565b60006080820190506151556000830187612d4f565b6151626020830186612d0e565b61516f6040830185612d6a565b61517c6060830184615131565b95945050505050565b600061519082612cab565b915061519b83612cab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151d0576151cf61448b565b5b828201905092915050565b7f6164646974696f6e206f766572666c6f77000000000000000000000000000000600082015250565b6000615211601183612e2c565b915061521c826151db565b602082019050919050565b6000602082019050818103600083015261524081615204565b9050919050565b7f7375627472616374696f6e20756e646572666c6f770000000000000000000000600082015250565b600061527d601583612e2c565b915061528882615247565b602082019050919050565b600060208201905081810360008301526152ac81615270565b9050919050565b60006152be82612cab565b91506152c983612cab565b9250828210156152dc576152db61448b565b5b828203905092915050565b600060a0820190506152fc6000830188612d4f565b6153096020830187612d0e565b818103604083015261531b8186612e81565b9050818103606083015261532f8185613ea5565b905061533e6080830184612d0e565b9695505050505050565b60008151905061535781612edc565b92915050565b60006020828403121561537357615372612ca1565b5b600061538184828501615348565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207060008201527f726f706f73616c20616374696f6e20616c72656164792071756575656420617460208201527f2065746100000000000000000000000000000000000000000000000000000000604082015250565b600061540c604483612e2c565b91506154178261538a565b606082019050919050565b6000602082019050818103600083015261543b816153ff565b905091905056fea2646970667358221220d5a5928ca4abfc01e94754932cbf8773c9253141cc0797b8a2a897ee1af436f264736f6c634300080a0033000000000000000000000000395179acf0ec5cbd48bb9ea20606889a8f0427f0000000000000000000000000e18c200a70908c89ffa18c628fe1b83ac0065ea4000000000000000000000000f33da2a3fd5e02ad8005cec0a6d3679959e75e5d
Deployed ByteCode
0x60806040526004361061019c5760003560e01c8063452a9320116100ec578063d33219b41161008a578063ddf0b00911610064578063ddf0b009146105b1578063deaaa7cc146105da578063e23a9a5214610605578063fe0d94c1146106425761019c565b8063d33219b41461051e578063da35c66414610549578063da95691a146105745761019c565b80637bdbe4d0116100c65780637bdbe4d01461048857806391500671146104b3578063b58131b0146104dc578063b9a61961146105075761019c565b8063452a93201461041d5780634634c61f14610448578063760fbc13146104715761019c565b806321f43e42116101595780633932abb1116101335780633932abb114610361578063393aac271461038c5780633e4f49e6146103b757806340e58ee5146103f45761019c565b806321f43e42146102cd57806324bc1a64146102f6578063328dd982146103215761019c565b8063013cf08b146101a157806302a251a3146101e657806306fdde031461021157806315373e3d1461023c57806317977c611461026557806320606b70146102a2575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612ce1565b61065e565b6040516101dd99989796959493929190612d79565b60405180910390f35b3480156101f257600080fd5b506101fb6106e6565b6040516102089190612e06565b60405180910390f35b34801561021d57600080fd5b506102266106f0565b6040516102339190612eba565b60405180910390f35b34801561024857600080fd5b50610263600480360381019061025e9190612f08565b610729565b005b34801561027157600080fd5b5061028c60048036038101906102879190612f74565b610738565b6040516102999190612e06565b60405180910390f35b3480156102ae57600080fd5b506102b7610750565b6040516102c49190612fba565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190612fd5565b610774565b005b34801561030257600080fd5b5061030b6108f0565b6040516103189190612e06565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612ce1565b610903565b60405161035894939291906133b4565b60405180910390f35b34801561036d57600080fd5b50610376610bc0565b6040516103839190612e06565b60405180910390f35b34801561039857600080fd5b506103a1610bc9565b6040516103ae9190613474565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612ce1565b610bef565b6040516103eb9190613506565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190612ce1565b610dc3565b005b34801561042957600080fd5b5061043261117c565b60405161043f9190613521565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a91906135a1565b6111a2565b005b34801561047d57600080fd5b5061048661138b565b005b34801561049457600080fd5b5061049d61145f565b6040516104aa9190612e06565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612fd5565b611468565b005b3480156104e857600080fd5b506104f16115df565b6040516104fe9190612e06565b60405180910390f35b34801561051357600080fd5b5061051c6115f1565b005b34801561052a57600080fd5b50610533611703565b604051610540919061363d565b60405180910390f35b34801561055557600080fd5b5061055e611727565b60405161056b9190612e06565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613b7b565b61172d565b6040516105a89190612e06565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190612ce1565b611cd3565b005b3480156105e657600080fd5b506105ef61201f565b6040516105fc9190612fba565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613c82565b612043565b6040516106399190613d3a565b60405180910390f35b61065c60048036038101906106579190612ce1565b612125565b005b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff16905089565b60006106c0905090565b6040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525081565b610734338383612396565b5050565b60056020528060005260406000206000915090505481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fb90613ded565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016108749190613521565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016108a39493929190613ede565b6000604051808303816000875af11580156108c2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108eb9190613fad565b505050565b60006a034f086f3b33b684000000905090565b606080606080600060046000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156109b157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610967575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610a0357602002820191906000526020600020905b8154815260200190600101908083116109ef575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610ad7578382906000526020600020018054610a4a90614025565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7690614025565b8015610ac35780601f10610a9857610100808354040283529160200191610ac3565b820191906000526020600020905b815481529060010190602001808311610aa657829003601f168201915b505050505081526020019060010190610a2b565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610baa578382906000526020600020018054610b1d90614025565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4990614025565b8015610b965780601f10610b6b57610100808354040283529160200191610b96565b820191906000526020600020905b815481529060010190602001808311610b7957829003601f168201915b505050505081526020019060010190610afe565b5050505090509450945094509450509193509193565b60006001905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160035410158015610c035750600082115b610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c39906140c9565b60405180910390fd5b600060046000848152602001908152602001600020905080600b0160009054906101000a900460ff1615610c7a576002915050610dbe565b80600701544311610c8f576000915050610dbe565b80600801544311610ca4576001915050610dbe565b80600a01548160090154111580610cc55750610cbe6108f0565b8160090154105b15610cd4576003915050610dbe565b600081600201541415610ceb576004915050610dbe565b80600b0160019054906101000a900460ff1615610d0c576007915050610dbe565b610da8816002015460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da391906140fe565b612664565b4210610db8576006915050610dbe565b60059150505b919050565b6000610dce82610bef565b9050600780811115610de357610de261348f565b5b816007811115610df657610df561348f565b5b1415610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e9061419d565b60405180910390fd5b6000600460008481526020019081526020016000209050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f895750610ead6115df565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f1b4360016126c2565b6040518363ffffffff1660e01b8152600401610f389291906141bd565b602060405180830381865afa158015610f55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f799190614212565b6bffffffffffffffffffffffff16105b610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf906142b1565b60405180910390fd5b600181600b0160006101000a81548160ff02191690831515021790555060005b816003018054905081101561113f5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663591fcdfe836003018381548110611049576110486142d1565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600401848154811061108a576110896142d1565b5b90600052602060002001548560050185815481106110ab576110aa6142d1565b5b906000526020600020018660060186815481106110cb576110ca6142d1565b5b9060005260206000200187600201546040518663ffffffff1660e01b81526004016110fa95949392919061442a565b600060405180830381600087803b15801561111457600080fd5b505af1158015611128573d6000803e3d6000fd5b505050508080611137906144ba565b915050610fe8565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c8360405161116f9190612e06565b60405180910390a1505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c706861000000000000000000008152508051906020012061120a61271b565b3060405160200161121e9493929190614503565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee878760405160200161126d93929190614548565b6040516020818303038152906040528051906020012090506000828260405160200161129a9291906145f7565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516112d7949392919061463d565b6020604051602081039080840390855afa1580156112f9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c906146f4565b60405180910390fd5b611380818a8a612396565b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461141b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141290614786565b60405180910390fd5b6000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef9061483e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016115689190613521565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016115979493929190613ede565b6020604051808303816000875af11580156115b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115da9190614873565b505050565b600069d3c21bcecceda1000000905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167890614912565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e957600080fd5b505af11580156116fd573d6000803e3d6000fd5b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60006117376115df565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe1336117814360016126c2565b6040518363ffffffff1660e01b815260040161179e9291906141bd565b602060405180830381865afa1580156117bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117df9190614212565b6bffffffffffffffffffffffff161161182d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611824906149a4565b60405180910390fd5b8451865114801561183f575083518651145b801561184c575082518651145b61188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188290614a5c565b60405180910390fd5b6000865114156118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c790614aee565b60405180910390fd5b6118d861145f565b8651111561191b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191290614b80565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114611a4657600061197282610bef565b9050600160078111156119885761198761348f565b5b81600781111561199b5761199a61348f565b5b14156119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390614c38565b60405180910390fd5b600060078111156119f0576119ef61348f565b5b816007811115611a0357611a0261348f565b5b1415611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b90614cf0565b60405180910390fd5b505b6000611a5943611a54610bc0565b612664565b90506000611a6e82611a696106e6565b612664565b905060036000815480929190611a83906144ba565b91905055506000600354905060006004600083815260200190815260200160002090506000816000015414611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490614d82565b60405180910390fd5b818160000181905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081600201819055508a816003019080519060200190611b5b9291906128dc565b5089816004019080519060200190611b74929190612966565b5088816005019080519060200190611b8d9291906129b3565b5087816006019080519060200190611ba6929190612a13565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0160006101000a81548160ff021916908315150217905550600081600b0160016101000a81548160ff0219169083151502179055508060000154600560008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f604051611cb699989796959493929190614da2565b60405180910390a180600001549550505050505095945050505050565b60046007811115611ce757611ce661348f565b5b611cf082610bef565b6007811115611d0257611d0161348f565b5b14611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990614eea565b60405180910390fd5b60006004600083815260200190815260200160002090506000611df34260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dee91906140fe565b612664565b905060005b8260030180549050811015611fd757611fc4836003018281548110611e2057611e1f6142d1565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018381548110611e6157611e606142d1565b5b9060005260206000200154856005018481548110611e8257611e816142d1565b5b906000526020600020018054611e9790614025565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec390614025565b8015611f105780601f10611ee557610100808354040283529160200191611f10565b820191906000526020600020905b815481529060010190602001808311611ef357829003601f168201915b5050505050866006018581548110611f2b57611f2a6142d1565b5b906000526020600020018054611f4090614025565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6c90614025565b8015611fb95780601f10611f8e57610100808354040283529160200191611fb9565b820191906000526020600020905b815481529060010190602001808311611f9c57829003601f168201915b505050505086612728565b8080611fcf906144ba565b915050611df8565b508082600201819055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928382604051612012929190614f0a565b60405180910390a1505050565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b61204b612a73565b60046000848152602001908152602001600020600c0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b600560078111156121395761213861348f565b5b61214282610bef565b60078111156121545761215361348f565b5b14612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b90614fcb565b60405180910390fd5b6000600460008381526020019081526020016000209050600181600b0160016101000a81548160ff02191690831515021790555060005b816003018054905081101561235a5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f83600401838154811061222c5761222b6142d1565b5b906000526020600020015484600301848154811061224d5761224c6142d1565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600401858154811061228e5761228d6142d1565b5b90600052602060002001548660050186815481106122af576122ae6142d1565b5b906000526020600020018760060187815481106122cf576122ce6142d1565b5b9060005260206000200188600201546040518763ffffffff1660e01b81526004016122fe95949392919061442a565b60006040518083038185885af115801561231c573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906123469190613fad565b508080612352906144ba565b9150506121cb565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f8260405161238a9190612e06565b60405180910390a15050565b600160078111156123aa576123a961348f565b5b6123b383610bef565b60078111156123c5576123c461348f565b5b14612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc9061505d565b60405180910390fd5b6000600460008481526020019081526020016000209050600081600c0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b0906150ef565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18785600701546040518363ffffffff1660e01b815260040161251c9291906141bd565b602060405180830381865afa158015612539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255d9190614212565b9050831561258e576125818360090154826bffffffffffffffffffffffff16612664565b83600901819055506125b3565b6125aa83600a0154826bffffffffffffffffffffffff16612664565b83600a01819055505b60018260000160006101000a81548160ff021916908315150217905550838260000160016101000a81548160ff021916908315150217905550808260000160026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055507f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c46868686846040516126549493929190615140565b60405180910390a1505050505050565b60008082846126739190615185565b9050838110156126b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126af90615227565b60405180910390fd5b8091505092915050565b600082821115612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90615293565b60405180910390fd5b818361271391906152b3565b905092915050565b6000804690508091505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2b06537868686868660405160200161277d9594939291906152e7565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016127af9190612fba565b602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f0919061535d565b15612830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282790615422565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90186868686866040518663ffffffff1660e01b81526004016128919594939291906152e7565b6020604051808303816000875af11580156128b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d49190614873565b505050505050565b828054828255906000526020600020908101928215612955579160200282015b828111156129545782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906128fc565b5b5090506129629190612aa6565b5090565b8280548282559060005260206000209081019282156129a2579160200282015b828111156129a1578251825591602001919060010190612986565b5b5090506129af9190612aa6565b5090565b828054828255906000526020600020908101928215612a02579160200282015b82811115612a015782518290805190602001906129f1929190612ac3565b50916020019190600101906129d3565b5b509050612a0f9190612b49565b5090565b828054828255906000526020600020908101928215612a62579160200282015b82811115612a61578251829080519060200190612a51929190612b6d565b5091602001919060010190612a33565b5b509050612a6f9190612bf3565b5090565b604051806060016040528060001515815260200160001515815260200160006bffffffffffffffffffffffff1681525090565b5b80821115612abf576000816000905550600101612aa7565b5090565b828054612acf90614025565b90600052602060002090601f016020900481019282612af15760008555612b38565b82601f10612b0a57805160ff1916838001178555612b38565b82800160010185558215612b38579182015b82811115612b37578251825591602001919060010190612b1c565b5b509050612b459190612aa6565b5090565b5b80821115612b695760008181612b609190612c17565b50600101612b4a565b5090565b828054612b7990614025565b90600052602060002090601f016020900481019282612b9b5760008555612be2565b82601f10612bb457805160ff1916838001178555612be2565b82800160010185558215612be2579182015b82811115612be1578251825591602001919060010190612bc6565b5b509050612bef9190612aa6565b5090565b5b80821115612c135760008181612c0a9190612c57565b50600101612bf4565b5090565b508054612c2390614025565b6000825580601f10612c355750612c54565b601f016020900490600052602060002090810190612c539190612aa6565b5b50565b508054612c6390614025565b6000825580601f10612c755750612c94565b601f016020900490600052602060002090810190612c939190612aa6565b5b50565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612cbe81612cab565b8114612cc957600080fd5b50565b600081359050612cdb81612cb5565b92915050565b600060208284031215612cf757612cf6612ca1565b5b6000612d0584828501612ccc565b91505092915050565b612d1781612cab565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d4882612d1d565b9050919050565b612d5881612d3d565b82525050565b60008115159050919050565b612d7381612d5e565b82525050565b600061012082019050612d8f600083018c612d0e565b612d9c602083018b612d4f565b612da9604083018a612d0e565b612db66060830189612d0e565b612dc36080830188612d0e565b612dd060a0830187612d0e565b612ddd60c0830186612d0e565b612dea60e0830185612d6a565b612df8610100830184612d6a565b9a9950505050505050505050565b6000602082019050612e1b6000830184612d0e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e5b578082015181840152602081019050612e40565b83811115612e6a576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e8c82612e21565b612e968185612e2c565b9350612ea6818560208601612e3d565b612eaf81612e70565b840191505092915050565b60006020820190508181036000830152612ed48184612e81565b905092915050565b612ee581612d5e565b8114612ef057600080fd5b50565b600081359050612f0281612edc565b92915050565b60008060408385031215612f1f57612f1e612ca1565b5b6000612f2d85828601612ccc565b9250506020612f3e85828601612ef3565b9150509250929050565b612f5181612d3d565b8114612f5c57600080fd5b50565b600081359050612f6e81612f48565b92915050565b600060208284031215612f8a57612f89612ca1565b5b6000612f9884828501612f5f565b91505092915050565b6000819050919050565b612fb481612fa1565b82525050565b6000602082019050612fcf6000830184612fab565b92915050565b60008060408385031215612fec57612feb612ca1565b5b6000612ffa85828601612f5f565b925050602061300b85828601612ccc565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61304a81612d3d565b82525050565b600061305c8383613041565b60208301905092915050565b6000602082019050919050565b600061308082613015565b61308a8185613020565b935061309583613031565b8060005b838110156130c65781516130ad8882613050565b97506130b883613068565b925050600181019050613099565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61310881612cab565b82525050565b600061311a83836130ff565b60208301905092915050565b6000602082019050919050565b600061313e826130d3565b61314881856130de565b9350613153836130ef565b8060005b8381101561318457815161316b888261310e565b975061317683613126565b925050600181019050613157565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006131d982612e21565b6131e381856131bd565b93506131f3818560208601612e3d565b6131fc81612e70565b840191505092915050565b600061321383836131ce565b905092915050565b6000602082019050919050565b600061323382613191565b61323d818561319c565b93508360208202850161324f856131ad565b8060005b8581101561328b578484038952815161326c8582613207565b94506132778361321b565b925060208a01995050600181019050613253565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006132f0826132c9565b6132fa81856132d4565b935061330a818560208601612e3d565b61331381612e70565b840191505092915050565b600061332a83836132e5565b905092915050565b6000602082019050919050565b600061334a8261329d565b61335481856132a8565b935083602082028501613366856132b9565b8060005b858110156133a25784840389528151613383858261331e565b945061338e83613332565b925060208a0199505060018101905061336a565b50829750879550505050505092915050565b600060808201905081810360008301526133ce8187613075565b905081810360208301526133e28186613133565b905081810360408301526133f68185613228565b9050818103606083015261340a818461333f565b905095945050505050565b6000819050919050565b600061343a61343561343084612d1d565b613415565b612d1d565b9050919050565b600061344c8261341f565b9050919050565b600061345e82613441565b9050919050565b61346e81613453565b82525050565b60006020820190506134896000830184613465565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106134cf576134ce61348f565b5b50565b60008190506134e0826134be565b919050565b60006134f0826134d2565b9050919050565b613500816134e5565b82525050565b600060208201905061351b60008301846134f7565b92915050565b60006020820190506135366000830184612d4f565b92915050565b600060ff82169050919050565b6135528161353c565b811461355d57600080fd5b50565b60008135905061356f81613549565b92915050565b61357e81612fa1565b811461358957600080fd5b50565b60008135905061359b81613575565b92915050565b600080600080600060a086880312156135bd576135bc612ca1565b5b60006135cb88828901612ccc565b95505060206135dc88828901612ef3565b94505060406135ed88828901613560565b93505060606135fe8882890161358c565b925050608061360f8882890161358c565b9150509295509295909350565b600061362782613441565b9050919050565b6136378161361c565b82525050565b6000602082019050613652600083018461362e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61369582612e70565b810181811067ffffffffffffffff821117156136b4576136b361365d565b5b80604052505050565b60006136c7612c97565b90506136d3828261368c565b919050565b600067ffffffffffffffff8211156136f3576136f261365d565b5b602082029050602081019050919050565b600080fd5b600061371c613717846136d8565b6136bd565b9050808382526020820190506020840283018581111561373f5761373e613704565b5b835b8181101561376857806137548882612f5f565b845260208401935050602081019050613741565b5050509392505050565b600082601f83011261378757613786613658565b5b8135613797848260208601613709565b91505092915050565b600067ffffffffffffffff8211156137bb576137ba61365d565b5b602082029050602081019050919050565b60006137df6137da846137a0565b6136bd565b9050808382526020820190506020840283018581111561380257613801613704565b5b835b8181101561382b57806138178882612ccc565b845260208401935050602081019050613804565b5050509392505050565b600082601f83011261384a57613849613658565b5b813561385a8482602086016137cc565b91505092915050565b600067ffffffffffffffff82111561387e5761387d61365d565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156138af576138ae61365d565b5b6138b882612e70565b9050602081019050919050565b82818337600083830152505050565b60006138e76138e284613894565b6136bd565b9050828152602081018484840111156139035761390261388f565b5b61390e8482856138c5565b509392505050565b600082601f83011261392b5761392a613658565b5b813561393b8482602086016138d4565b91505092915050565b600061395761395284613863565b6136bd565b9050808382526020820190506020840283018581111561397a57613979613704565b5b835b818110156139c157803567ffffffffffffffff81111561399f5761399e613658565b5b8086016139ac8982613916565b8552602085019450505060208101905061397c565b5050509392505050565b600082601f8301126139e0576139df613658565b5b81356139f0848260208601613944565b91505092915050565b600067ffffffffffffffff821115613a1457613a1361365d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a4057613a3f61365d565b5b613a4982612e70565b9050602081019050919050565b6000613a69613a6484613a25565b6136bd565b905082815260208101848484011115613a8557613a8461388f565b5b613a908482856138c5565b509392505050565b600082601f830112613aad57613aac613658565b5b8135613abd848260208601613a56565b91505092915050565b6000613ad9613ad4846139f9565b6136bd565b90508083825260208201905060208402830185811115613afc57613afb613704565b5b835b81811015613b4357803567ffffffffffffffff811115613b2157613b20613658565b5b808601613b2e8982613a98565b85526020850194505050602081019050613afe565b5050509392505050565b600082601f830112613b6257613b61613658565b5b8135613b72848260208601613ac6565b91505092915050565b600080600080600060a08688031215613b9757613b96612ca1565b5b600086013567ffffffffffffffff811115613bb557613bb4612ca6565b5b613bc188828901613772565b955050602086013567ffffffffffffffff811115613be257613be1612ca6565b5b613bee88828901613835565b945050604086013567ffffffffffffffff811115613c0f57613c0e612ca6565b5b613c1b888289016139cb565b935050606086013567ffffffffffffffff811115613c3c57613c3b612ca6565b5b613c4888828901613b4d565b925050608086013567ffffffffffffffff811115613c6957613c68612ca6565b5b613c7588828901613916565b9150509295509295909350565b60008060408385031215613c9957613c98612ca1565b5b6000613ca785828601612ccc565b9250506020613cb885828601612f5f565b9150509250929050565b613ccb81612d5e565b82525050565b60006bffffffffffffffffffffffff82169050919050565b613cf281613cd1565b82525050565b606082016000820151613d0e6000850182613cc2565b506020820151613d216020850182613cc2565b506040820151613d346040850182613ce9565b50505050565b6000606082019050613d4f6000830184613cf8565b92915050565b7f476f7665726e6f72416c7068613a3a5f5f6578656375746553657454696d656c60008201527f6f636b50656e64696e6741646d696e3a2073656e646572206d7573742062652060208201527f676f7620677561726469616e0000000000000000000000000000000000000000604082015250565b6000613dd7604c83612e2c565b9150613de282613d55565b606082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b6000819050919050565b6000613e32613e2d613e2884613e0d565b613415565b612cab565b9050919050565b613e4281613e17565b82525050565b7f73657450656e64696e6741646d696e2861646472657373290000000000000000600082015250565b6000613e7e601883612e2c565b9150613e8982613e48565b602082019050919050565b600082825260208201905092915050565b6000613eb0826132c9565b613eba8185613e94565b9350613eca818560208601612e3d565b613ed381612e70565b840191505092915050565b600060a082019050613ef36000830187612d4f565b613f006020830186613e39565b8181036040830152613f1181613e71565b90508181036060830152613f258185613ea5565b9050613f346080830184612d0e565b95945050505050565b6000613f50613f4b84613a25565b6136bd565b905082815260208101848484011115613f6c57613f6b61388f565b5b613f77848285612e3d565b509392505050565b600082601f830112613f9457613f93613658565b5b8151613fa4848260208601613f3d565b91505092915050565b600060208284031215613fc357613fc2612ca1565b5b600082015167ffffffffffffffff811115613fe157613fe0612ca6565b5b613fed84828501613f7f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403d57607f821691505b6020821081141561405157614050613ff6565b5b50919050565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c696420707260008201527f6f706f73616c2069640000000000000000000000000000000000000000000000602082015250565b60006140b3602983612e2c565b91506140be82614057565b604082019050919050565b600060208201905081810360008301526140e2816140a6565b9050919050565b6000815190506140f881612cb5565b92915050565b60006020828403121561411457614113612ca1565b5b6000614122848285016140e9565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f7420636160008201527f6e63656c2065786563757465642070726f706f73616c00000000000000000000602082015250565b6000614187603683612e2c565b91506141928261412b565b604082019050919050565b600060208201905081810360008301526141b68161417a565b9050919050565b60006040820190506141d26000830185612d4f565b6141df6020830184612d0e565b9392505050565b6141ef81613cd1565b81146141fa57600080fd5b50565b60008151905061420c816141e6565b92915050565b60006020828403121561422857614227612ca1565b5b6000614236848285016141fd565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722060008201527f61626f7665207468726573686f6c640000000000000000000000000000000000602082015250565b600061429b602f83612e2c565b91506142a68261423f565b604082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b6000815461432281614025565b61432c8186612e2c565b9450600182166000811461434757600181146143595761438c565b60ff198316865260208601935061438c565b61436285614300565b60005b8381101561438457815481890152600182019150602081019050614365565b808801955050505b50505092915050565b60008190508160005260206000209050919050565b600081546143b781614025565b6143c18186613e94565b945060018216600081146143dc57600181146143ee57614421565b60ff1983168652602086019350614421565b6143f785614395565b60005b83811015614419578154818901526001820191506020810190506143fa565b808801955050505b50505092915050565b600060a08201905061443f6000830188612d4f565b61444c6020830187612d0e565b818103604083015261445e8186614315565b9050818103606083015261447281856143aa565b90506144816080830184612d0e565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144c582612cab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144f8576144f761448b565b5b600182019050919050565b60006080820190506145186000830187612fab565b6145256020830186612fab565b6145326040830185612d0e565b61453f6060830184612d4f565b95945050505050565b600060608201905061455d6000830186612fab565b61456a6020830185612d0e565b6145776040830184612d6a565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006145c060028361457f565b91506145cb8261458a565b600282019050919050565b6000819050919050565b6145f16145ec82612fa1565b6145d6565b82525050565b6000614602826145b3565b915061460e82856145e0565b60208201915061461e82846145e0565b6020820191508190509392505050565b6146378161353c565b82525050565b60006080820190506146526000830187612fab565b61465f602083018661462e565b61466c6040830185612fab565b6146796060830184612fab565b95945050505050565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e60008201527f76616c6964207369676e61747572650000000000000000000000000000000000602082015250565b60006146de602f83612e2c565b91506146e982614682565b604082019050919050565b6000602082019050818103600083015261470d816146d1565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e646560008201527f72206d75737420626520676f7620677561726469616e00000000000000000000602082015250565b6000614770603683612e2c565b915061477b82614714565b604082019050919050565b6000602082019050818103600083015261479f81614763565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f717565756553657454696d656c6f6360008201527f6b50656e64696e6741646d696e3a2073656e646572206d75737420626520676f60208201527f7620677561726469616e00000000000000000000000000000000000000000000604082015250565b6000614828604a83612e2c565b9150614833826147a6565b606082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b60008151905061486d81613575565b92915050565b60006020828403121561488957614888612ca1565b5b60006148978482850161485e565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f5f61636365707441646d696e3a20736560008201527f6e646572206d75737420626520676f7620677561726469616e00000000000000602082015250565b60006148fc603983612e2c565b9150614907826148a0565b604082019050919050565b6000602082019050818103600083015261492b816148ef565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657260008201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015250565b600061498e603f83612e2c565b915061499982614932565b604082019050919050565b600060208201905081810360008301526149bd81614981565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c60008201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d60208201527f6174636800000000000000000000000000000000000000000000000000000000604082015250565b6000614a46604483612e2c565b9150614a51826149c4565b606082019050919050565b60006020820190508181036000830152614a7581614a39565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f60008201527f7669646520616374696f6e730000000000000000000000000000000000000000602082015250565b6000614ad8602c83612e2c565b9150614ae382614a7c565b604082019050919050565b60006020820190508181036000830152614b0781614acb565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7960008201527f20616374696f6e73000000000000000000000000000000000000000000000000602082015250565b6000614b6a602883612e2c565b9150614b7582614b0e565b604082019050919050565b60006020820190508181036000830152614b9981614b5d565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015250565b6000614c22605883612e2c565b9150614c2d82614ba0565b606082019050919050565b60006020820190508181036000830152614c5181614c15565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015250565b6000614cda605983612e2c565b9150614ce582614c58565b606082019050919050565b60006020820190508181036000830152614d0981614ccd565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2050726f706f73616c60008201527f494420636f6c6c73696f6e000000000000000000000000000000000000000000602082015250565b6000614d6c602b83612e2c565b9150614d7782614d10565b604082019050919050565b60006020820190508181036000830152614d9b81614d5f565b9050919050565b600061012082019050614db8600083018c612d0e565b614dc5602083018b612d4f565b8181036040830152614dd7818a613075565b90508181036060830152614deb8189613133565b90508181036080830152614dff8188613228565b905081810360a0830152614e13818761333f565b9050614e2260c0830186612d0e565b614e2f60e0830185612d0e565b818103610100830152614e428184612e81565b90509a9950505050505050505050565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206360008201527f616e206f6e6c792062652071756575656420696620697420697320737563636560208201527f6564656400000000000000000000000000000000000000000000000000000000604082015250565b6000614ed4604483612e2c565b9150614edf82614e52565b606082019050919050565b60006020820190508181036000830152614f0381614ec7565b9050919050565b6000604082019050614f1f6000830185612d0e565b614f2c6020830184612d0e565b9392505050565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c60008201527f2063616e206f6e6c79206265206578656375746564206966206974206973207160208201527f7565756564000000000000000000000000000000000000000000000000000000604082015250565b6000614fb5604583612e2c565b9150614fc082614f33565b606082019050919050565b60006020820190508181036000830152614fe481614fa8565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e6760008201527f20697320636c6f73656400000000000000000000000000000000000000000000602082015250565b6000615047602a83612e2c565b915061505282614feb565b604082019050919050565b600060208201905081810360008301526150768161503a565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722060008201527f616c726561647920766f74656400000000000000000000000000000000000000602082015250565b60006150d9602d83612e2c565b91506150e48261507d565b604082019050919050565b60006020820190508181036000830152615108816150cc565b9050919050565b600061512a61512561512084613cd1565b613415565b612cab565b9050919050565b61513a8161510f565b82525050565b60006080820190506151556000830187612d4f565b6151626020830186612d0e565b61516f6040830185612d6a565b61517c6060830184615131565b95945050505050565b600061519082612cab565b915061519b83612cab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151d0576151cf61448b565b5b828201905092915050565b7f6164646974696f6e206f766572666c6f77000000000000000000000000000000600082015250565b6000615211601183612e2c565b915061521c826151db565b602082019050919050565b6000602082019050818103600083015261524081615204565b9050919050565b7f7375627472616374696f6e20756e646572666c6f770000000000000000000000600082015250565b600061527d601583612e2c565b915061528882615247565b602082019050919050565b600060208201905081810360008301526152ac81615270565b9050919050565b60006152be82612cab565b91506152c983612cab565b9250828210156152dc576152db61448b565b5b828203905092915050565b600060a0820190506152fc6000830188612d4f565b6153096020830187612d0e565b818103604083015261531b8186612e81565b9050818103606083015261532f8185613ea5565b905061533e6080830184612d0e565b9695505050505050565b60008151905061535781612edc565b92915050565b60006020828403121561537357615372612ca1565b5b600061538184828501615348565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207060008201527f726f706f73616c20616374696f6e20616c72656164792071756575656420617460208201527f2065746100000000000000000000000000000000000000000000000000000000604082015250565b600061540c604483612e2c565b91506154178261538a565b606082019050919050565b6000602082019050818103600083015261543b816153ff565b905091905056fea2646970667358221220d5a5928ca4abfc01e94754932cbf8773c9253141cc0797b8a2a897ee1af436f264736f6c634300080a0033