aiia-vault-sdk 1.1.5 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -311,18 +311,6 @@ export declare class SeedRoundFundraiserSDK {
311
311
  * @notice For ERC20 tokens, ensure you have approved the contract first
312
312
  */
313
313
  buildContributeTx(roundId: number, token: string, amount: number): Promise<ethers.ContractTransaction>;
314
- /**
315
- * Builds a transaction to claim allocated tokens
316
- *
317
- * @returns Populated transaction for claiming tokens from all eligible rounds
318
- */
319
- buildClaimTokensTx(): Promise<ethers.ContractTransaction>;
320
- /**
321
- * Builds a transaction to request a refund
322
- *
323
- * @returns Populated transaction for requesting refund from eligible rounds
324
- */
325
- buildRefundTx(): Promise<ethers.ContractTransaction>;
326
314
  /**
327
315
  * Builds a transaction to withdraw accumulated funds
328
316
  *
@@ -1 +1 @@
1
- "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.SeedRoundFundraiserSDK=void 0;const e=require("ethers"),n=t(require("./abis/SeedRoundFundraiser.json")),o=t(require("./contracts.json")),r=require("./utils"),i=t(require("./whitelist-tokens.json"));exports.SeedRoundFundraiserSDK=class{constructor(t,i){this.name="SeedRoundFundraiser",this.isBootstrapped=!1,this.PRICE_PRECISION=1e18,this.whitelistedTokensArray=[],this.projectToken="",this.projectTokenDecimals=0,this.formatEventArgs=t=>{const{eventName:e,args:n}=t;switch(e){case"TokenWhitelisted":return{...t,args:{...n,token:n.token.toLowerCase(),price:Number(n.price)/this.PRICE_PRECISION}};case"TokenPriceUpdated":return{...t,args:{...n,token:n.token.toLowerCase(),oldPrice:Number(n.oldPrice)/this.PRICE_PRECISION,newPrice:Number(n.newPrice)/this.PRICE_PRECISION}};case"TokenRemovedFromWhitelist":return{...t,args:{...n,token:n.token.toLowerCase()}};case"RoundCreated":case"RoundUpdated":return{...t,args:{...n,roundId:Number(n.roundId),startTime:Number(n.startTime),endTime:Number(n.endTime),targetFund:Number(n.targetFund)/this.PRICE_PRECISION,totalAllocation:Number(n.totalAllocation),maxFundPerAccount:Number(n.maxFundPerAccount)/this.PRICE_PRECISION}};case"RoundEnded":return{...t,args:{...n,roundId:Number(n.roundId),raisedFunds:Number(n.raisedFunds)/this.PRICE_PRECISION,participants:Number(n.participants)}};case"Contribution":return{...t,args:{...n,roundId:Number(n.roundId),contributor:n.contributor.toLowerCase(),token:n.token.toLowerCase(),amount:Number(n.amount),fundAmount:Number(n.fundAmount)/this.PRICE_PRECISION,tokenAllocation:Number(n.tokenAllocation)}};case"TokensClaimed":return{...t,args:{...n,roundId:Number(n.roundId),user:n.user.toLowerCase(),amount:Number(n.amount)}};case"ProjectTokenUpdated":return{...t,args:{...n,oldToken:n.oldToken.toLowerCase(),newToken:n.newToken.toLowerCase()}};case"ClaimingEnabledUpdated":case"RefundEnabledUpdated":return{...t,args:{...n,roundId:Number(n.roundId),enabled:n.enabled}};case"Refunded":return{...t,args:{...n,roundId:Number(n.roundId),user:n.user.toLowerCase(),token:n.token.toLowerCase(),amount:Number(n.amount)}};default:return t}};const a=Array.isArray(t)?t:[t];this.providers=a.map((t=>new e.ethers.JsonRpcProvider(t)));const s=(0,r.getRandomProvider)(this.providers);this.contractAddress=(0,r.resolveContractAddress)(a[0],this.name,o.default,i),this.contract=new e.ethers.Contract(this.contractAddress,n.default.abi,s),this.networkName=this.getNetworkNameFromRpc(a[0]),this.importWhitelistedTokens()}getNetworkNameFromRpc(t){const e=t.toLowerCase();return e.includes("sepolia.base")?"base-sepolia":e.includes("sepolia")?"sepolia":e.includes("mainnet")?"mainnet":e.includes("localhost")||e.includes("127.0.0.1")?"hardhat":"sepolia"}importWhitelistedTokens(){try{i.default[this.networkName]?(this.whitelistedTokensArray=i.default[this.networkName].map((t=>t.toLowerCase())),console.log(`Imported ${this.whitelistedTokensArray.length} whitelisted tokens for ${this.networkName} network`)):console.log(`No whitelisted tokens found for ${this.networkName} network`)}catch(t){console.error("Error importing whitelisted tokens:",t)}}async getWhitelistedTokenInfo(t){const n=t.toLowerCase();if(!this.whitelistedTokensArray.includes(n))return null;const o=await this.getWhitelistedToken(n);if(!o.isWhitelisted)return null;let i="ETH",a=18;n!==e.ethers.ZeroAddress&&([i,a]=await Promise.all([(0,r.getTokenSymbol)(n,this.getRandomProvider()),(0,r.getTokenDecimals)(n,this.getRandomProvider())]));const s=await this.getLatestRoundId();let d=0;if(s>=0){const t=await this.getRound(s);t.exists&&!t.ended&&(d=t.maxFundPerAccount/o.price)}return{address:n,isWhitelisted:o.isWhitelisted,price:o.price,symbol:i,maxContribution:d,maxContributionRaw:Math.floor(d*Math.pow(10,a)),decimals:a}}async getAllWhitelistedTokensInfo(){const t=[];for(const e of this.whitelistedTokensArray){const n=await this.getWhitelistedTokenInfo(e);n&&t.push(n)}return t}getRandomProvider(){return(0,r.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,n.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,r.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,n)=>t[n])),0===this.providers.length)throw new Error("No active RPC providers available");this.projectToken=await this.getProjectToken(),this.projectTokenDecimals=await(0,r.getTokenDecimals)(this.projectToken,this.getRandomProvider()),this.isBootstrapped=!0}async signAndSendTransaction(t,e,n={}){return(0,r.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),n,this.contract)}async buildAddWhitelistedTokenTx(t,e){const n=BigInt(Math.floor(e*this.PRICE_PRECISION));return await this.contract.addWhitelistedToken.populateTransaction(t,n)}async buildUpdateTokenPriceTx(t,e){const n=BigInt(Math.floor(e*this.PRICE_PRECISION));return await this.contract.updateTokenPrice.populateTransaction(t,n)}async buildRemoveWhitelistedTokenTx(t){return await this.contract.removeWhitelistedToken.populateTransaction(t)}async buildCreateRoundTx(t,e,n,o,i){const a=BigInt(Math.floor(n*this.PRICE_PRECISION)),s=BigInt(Math.floor(i*this.PRICE_PRECISION)),d=await(0,r.getTokenDecimals)(await this.getProjectToken(),this.getRandomProvider()),c=BigInt(Math.floor(o*Math.pow(10,d)));return await this.contract.createRound.populateTransaction(t,e,a,c,s)}async buildUpdateRoundTx(t,e,n,o,r,i){const a=BigInt(Math.floor(o*this.PRICE_PRECISION)),s=BigInt(Math.floor(i*this.PRICE_PRECISION));return await this.contract.updateRound.populateTransaction(t,e,n,a,r,s)}async buildEndRoundTx(t){return await this.contract.endRound.populateTransaction(t)}async buildSetClaimingEnabledTx(t,e){return await this.contract.setClaimingEnabled.populateTransaction(t,e)}async buildSetRefundEnabledTx(t,e){return await this.contract.setRefundEnabled.populateTransaction(t,e)}async buildContributeTx(t,n,o){let i=18;n!==e.ethers.ZeroAddress&&(i=await(0,r.getTokenDecimals)(n,this.getRandomProvider()));const a=e.ethers.parseUnits(o.toString(),i),s=await this.contract.contribute.populateTransaction(t,n,n===e.ethers.ZeroAddress?0:a);return n===e.ethers.ZeroAddress&&(s.value=a),s}async buildClaimTokensTx(){return await this.contract.claimTokens.populateTransaction()}async buildRefundTx(){return await this.contract.refund.populateTransaction()}async buildWithdrawFundsTx(t,e){const n=await(0,r.getTokenDecimals)(t,this.getRandomProvider()),o=BigInt(Math.floor(e*Math.pow(10,n)));return await this.contract.withdrawFunds.populateTransaction(t,o)}async buildClaimTokensByRoundIdTx(t){return await this.contract.claimTokensByRoundId.populateTransaction(t)}async getWhitelistedToken(t){const e=await this.contract.whitelistedTokens(t);return{isWhitelisted:e.isWhitelisted,price:Number(e.price)/this.PRICE_PRECISION}}async getRound(t){const e=await this.contract.rounds(t);return this.projectToken||(this.projectToken=await this.getProjectToken()),this.projectTokenDecimals||(this.projectTokenDecimals=await(0,r.getTokenDecimals)(this.projectToken,this.getRandomProvider())),{startTime:Number(e.startTime),endTime:Number(e.endTime),targetFund:Number(e.targetFund)/this.PRICE_PRECISION,totalAllocation:Number(e.totalAllocation)/10**this.projectTokenDecimals,maxFundPerAccount:Number(e.maxFundPerAccount)/this.PRICE_PRECISION,exists:e.exists,ended:e.ended,claimingEnabled:e.claimingEnabled,refundEnabled:e.refundEnabled}}async getUserContribution(t,n){this.projectToken||(this.projectToken=await this.getProjectToken()),this.projectTokenDecimals||(this.projectTokenDecimals=await(0,r.getTokenDecimals)(this.projectToken,this.getRandomProvider()));const o=await this.contract.userContributions(t,n);let i=18;return o.contributedToken!==e.ethers.ZeroAddress&&"0x0000000000000000000000000000000000000000"!==o.contributedToken&&(i=await(0,r.getTokenDecimals)(o.contributedToken,this.getRandomProvider())),{fundAmount:Number(o.fundAmount)/this.PRICE_PRECISION,tokenAllocation:Number(o.tokenAllocation)/10**this.projectTokenDecimals,claimed:o.claimed,refunded:o.refunded,contributedToken:o.contributedToken,contributedAmount:Number(o.contributedAmount)/10**i}}async getRoundRaisedFunds(t){const e=await this.contract.roundRaisedFunds(t);return Number(e)/this.PRICE_PRECISION}async getRoundParticipants(t){const e=await this.contract.roundParticipants(t);return Number(e)}async getUserParticipatedRound(t){const e=await this.contract.userParticipatedRound(t);return Number(e)}async getProjectToken(){return await this.contract.projectToken()}async getTotalRounds(){const t=await this.contract.totalRounds();return Number(t)}async getTotalRaisedFunds(){const t=await this.contract.totalRaisedFunds();return Number(t)/this.PRICE_PRECISION}async isRoundActive(t){return await this.contract.isRoundActive(t)}async getLatestRoundId(){const t=await this.getTotalRounds();return 0===t?-1:t-1}async getRoundInfo(t){const e=await this.getTotalRounds();if(t<0||t>=e)throw new Error(`Invalid round ID: ${t}`);return{roundId:t,config:await this.getRound(t),raisedFunds:await this.getRoundRaisedFunds(t),participants:await this.getRoundParticipants(t),isActive:await this.isRoundActive(t)}}async getUserTotalContribution(t){const e=await this.contract.getUserTotalContribution(t);return{totalFundAmount:Number(e.totalFundAmount)/this.PRICE_PRECISION,totalTokenAllocation:Number(e.totalTokenAllocation)}}async getTransactionStatus(t,e=10){return await(0,r.getTransactionStatus)(this.getRandomProvider(),t,e)}getContractAddress(){return this.contractAddress}async getAllEvents(t,e){return await this.bootstrap(),(0,r.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e)}async streamEvents(t,e,n,o=1e3,i=5e3){return await this.bootstrap(),(0,r.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:n,fromBlock:t,batchSize:o,sleepTime:i})}async getUserRoundContribution(t,n){const[o,i]=await Promise.all([this.contract.getUserRoundContribution(t,n),this.contract.rounds(t)]),a={fundAmount:Number(o.fundAmount)/this.PRICE_PRECISION,tokenAllocation:Number(o.tokenAllocation),claimed:o.claimed,refunded:o.refunded,contributedToken:o.contributedToken,contributedAmount:Number(o.contributedAmount)},s=Math.floor(Date.now()/1e3),d=i.exists&&!i.ended&&s>=Number(i.startTime)&&s<=Number(i.endTime),c={contribution:a,roundInfo:{exists:i.exists,isActive:d,claimingEnabled:i.claimingEnabled,refundEnabled:i.refundEnabled}};if(a.fundAmount>0){const t=a.contributedToken;let n="ETH",o=18;return t!==e.ethers.ZeroAddress&&([n,o]=await Promise.all([(0,r.getTokenSymbol)(t,this.getRandomProvider()),(0,r.getTokenDecimals)(t,this.getRandomProvider())])),{...c,tokenInfo:{symbol:n,decimals:o}}}return c}};
1
+ "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.SeedRoundFundraiserSDK=void 0;const e=require("ethers"),n=t(require("./abis/SeedRoundFundraiser.json")),o=t(require("./contracts.json")),r=require("./utils"),i=t(require("./whitelist-tokens.json"));exports.SeedRoundFundraiserSDK=class{constructor(t,i){this.name="SeedRoundFundraiser",this.isBootstrapped=!1,this.PRICE_PRECISION=1e18,this.whitelistedTokensArray=[],this.projectToken="",this.projectTokenDecimals=0,this.formatEventArgs=t=>{const{eventName:e,args:n}=t;switch(e){case"TokenWhitelisted":return{...t,args:{...n,token:n.token.toLowerCase(),price:Number(n.price)/this.PRICE_PRECISION}};case"TokenPriceUpdated":return{...t,args:{...n,token:n.token.toLowerCase(),oldPrice:Number(n.oldPrice)/this.PRICE_PRECISION,newPrice:Number(n.newPrice)/this.PRICE_PRECISION}};case"TokenRemovedFromWhitelist":return{...t,args:{...n,token:n.token.toLowerCase()}};case"RoundCreated":case"RoundUpdated":return{...t,args:{...n,roundId:Number(n.roundId),startTime:Number(n.startTime),endTime:Number(n.endTime),targetFund:Number(n.targetFund)/this.PRICE_PRECISION,totalAllocation:Number(n.totalAllocation),maxFundPerAccount:Number(n.maxFundPerAccount)/this.PRICE_PRECISION}};case"RoundEnded":return{...t,args:{...n,roundId:Number(n.roundId),raisedFunds:Number(n.raisedFunds)/this.PRICE_PRECISION,participants:Number(n.participants)}};case"Contribution":return{...t,args:{...n,roundId:Number(n.roundId),contributor:n.contributor.toLowerCase(),token:n.token.toLowerCase(),amount:Number(n.amount),fundAmount:Number(n.fundAmount)/this.PRICE_PRECISION,tokenAllocation:Number(n.tokenAllocation)}};case"TokensClaimed":return{...t,args:{...n,roundId:Number(n.roundId),user:n.user.toLowerCase(),amount:Number(n.amount)}};case"ProjectTokenUpdated":return{...t,args:{...n,oldToken:n.oldToken.toLowerCase(),newToken:n.newToken.toLowerCase()}};case"ClaimingEnabledUpdated":case"RefundEnabledUpdated":return{...t,args:{...n,roundId:Number(n.roundId),enabled:n.enabled}};case"Refunded":return{...t,args:{...n,roundId:Number(n.roundId),user:n.user.toLowerCase(),token:n.token.toLowerCase(),amount:Number(n.amount)}};default:return t}};const s=Array.isArray(t)?t:[t];this.providers=s.map((t=>new e.ethers.JsonRpcProvider(t)));const a=(0,r.getRandomProvider)(this.providers);this.contractAddress=(0,r.resolveContractAddress)(s[0],this.name,o.default,i),this.contract=new e.ethers.Contract(this.contractAddress,n.default.abi,a),this.networkName=this.getNetworkNameFromRpc(s[0]),this.importWhitelistedTokens()}getNetworkNameFromRpc(t){const e=t.toLowerCase();return e.includes("sepolia.base")?"base-sepolia":e.includes("sepolia")?"sepolia":e.includes("mainnet")?"mainnet":e.includes("localhost")||e.includes("127.0.0.1")?"hardhat":"sepolia"}importWhitelistedTokens(){try{i.default[this.networkName]?(this.whitelistedTokensArray=i.default[this.networkName].map((t=>t.toLowerCase())),console.log(`Imported ${this.whitelistedTokensArray.length} whitelisted tokens for ${this.networkName} network`)):console.log(`No whitelisted tokens found for ${this.networkName} network`)}catch(t){console.error("Error importing whitelisted tokens:",t)}}async getWhitelistedTokenInfo(t){const n=t.toLowerCase();if(!this.whitelistedTokensArray.includes(n))return null;const o=await this.getWhitelistedToken(n);if(!o.isWhitelisted)return null;let i="ETH",s=18;n!==e.ethers.ZeroAddress&&([i,s]=await Promise.all([(0,r.getTokenSymbol)(n,this.getRandomProvider()),(0,r.getTokenDecimals)(n,this.getRandomProvider())]));const a=await this.getLatestRoundId();let d=0;if(a>=0){const t=await this.getRound(a);t.exists&&!t.ended&&(d=t.maxFundPerAccount/o.price)}return{address:n,isWhitelisted:o.isWhitelisted,price:o.price,symbol:i,maxContribution:d,maxContributionRaw:Math.floor(d*Math.pow(10,s)),decimals:s}}async getAllWhitelistedTokensInfo(){const t=[];for(const e of this.whitelistedTokensArray){const n=await this.getWhitelistedTokenInfo(e);n&&t.push(n)}return t}getRandomProvider(){return(0,r.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,n.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,r.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,n)=>t[n])),0===this.providers.length)throw new Error("No active RPC providers available");this.projectToken=await this.getProjectToken(),this.projectTokenDecimals=await(0,r.getTokenDecimals)(this.projectToken,this.getRandomProvider()),this.isBootstrapped=!0}async signAndSendTransaction(t,e,n={}){return(0,r.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),n,this.contract)}async buildAddWhitelistedTokenTx(t,e){const n=BigInt(Math.floor(e*this.PRICE_PRECISION));return await this.contract.addWhitelistedToken.populateTransaction(t,n)}async buildUpdateTokenPriceTx(t,e){const n=BigInt(Math.floor(e*this.PRICE_PRECISION));return await this.contract.updateTokenPrice.populateTransaction(t,n)}async buildRemoveWhitelistedTokenTx(t){return await this.contract.removeWhitelistedToken.populateTransaction(t)}async buildCreateRoundTx(t,e,n,o,i){const s=BigInt(Math.floor(n*this.PRICE_PRECISION)),a=BigInt(Math.floor(i*this.PRICE_PRECISION)),d=await(0,r.getTokenDecimals)(await this.getProjectToken(),this.getRandomProvider()),c=BigInt(Math.floor(o*Math.pow(10,d)));return await this.contract.createRound.populateTransaction(t,e,s,c,a)}async buildUpdateRoundTx(t,e,n,o,r,i){const s=BigInt(Math.floor(o*this.PRICE_PRECISION)),a=BigInt(Math.floor(i*this.PRICE_PRECISION));return await this.contract.updateRound.populateTransaction(t,e,n,s,r,a)}async buildEndRoundTx(t){return await this.contract.endRound.populateTransaction(t)}async buildSetClaimingEnabledTx(t,e){return await this.contract.setClaimingEnabled.populateTransaction(t,e)}async buildSetRefundEnabledTx(t,e){return await this.contract.setRefundEnabled.populateTransaction(t,e)}async buildContributeTx(t,n,o){let i=18;n!==e.ethers.ZeroAddress&&(i=await(0,r.getTokenDecimals)(n,this.getRandomProvider()));const s=e.ethers.parseUnits(o.toString(),i),a=await this.contract.contribute.populateTransaction(t,n,n===e.ethers.ZeroAddress?0:s);return n===e.ethers.ZeroAddress&&(a.value=s),a}async buildWithdrawFundsTx(t,e){const n=await(0,r.getTokenDecimals)(t,this.getRandomProvider()),o=BigInt(Math.floor(e*Math.pow(10,n)));return await this.contract.withdrawFunds.populateTransaction(t,o)}async buildClaimTokensByRoundIdTx(t){return await this.contract.claimTokensByRoundId.populateTransaction(t)}async getWhitelistedToken(t){const e=await this.contract.whitelistedTokens(t);return{isWhitelisted:e.isWhitelisted,price:Number(e.price)/this.PRICE_PRECISION}}async getRound(t){const e=await this.contract.rounds(t);return this.projectToken||(this.projectToken=await this.getProjectToken()),this.projectTokenDecimals||(this.projectTokenDecimals=await(0,r.getTokenDecimals)(this.projectToken,this.getRandomProvider())),{startTime:Number(e.startTime),endTime:Number(e.endTime),targetFund:Number(e.targetFund)/this.PRICE_PRECISION,totalAllocation:Number(e.totalAllocation)/10**this.projectTokenDecimals,maxFundPerAccount:Number(e.maxFundPerAccount)/this.PRICE_PRECISION,exists:e.exists,ended:e.ended,claimingEnabled:e.claimingEnabled,refundEnabled:e.refundEnabled}}async getUserContribution(t,n){this.projectToken||(this.projectToken=await this.getProjectToken()),this.projectTokenDecimals||(this.projectTokenDecimals=await(0,r.getTokenDecimals)(this.projectToken,this.getRandomProvider()));const o=await this.contract.userContributions(t,n);let i=18;return o.contributedToken!==e.ethers.ZeroAddress&&"0x0000000000000000000000000000000000000000"!==o.contributedToken&&(i=await(0,r.getTokenDecimals)(o.contributedToken,this.getRandomProvider())),{fundAmount:Number(o.fundAmount)/this.PRICE_PRECISION,tokenAllocation:Number(o.tokenAllocation)/10**this.projectTokenDecimals,claimed:o.claimed,refunded:o.refunded,contributedToken:o.contributedToken,contributedAmount:Number(o.contributedAmount)/10**i}}async getRoundRaisedFunds(t){const e=await this.contract.roundRaisedFunds(t);return Number(e)/this.PRICE_PRECISION}async getRoundParticipants(t){const e=await this.contract.roundParticipants(t);return Number(e)}async getUserParticipatedRound(t){const e=await this.contract.userParticipatedRound(t);return Number(e)}async getProjectToken(){return await this.contract.projectToken()}async getTotalRounds(){const t=await this.contract.totalRounds();return Number(t)}async getTotalRaisedFunds(){const t=await this.contract.totalRaisedFunds();return Number(t)/this.PRICE_PRECISION}async isRoundActive(t){return await this.contract.isRoundActive(t)}async getLatestRoundId(){const t=await this.getTotalRounds();return 0===t?-1:t-1}async getRoundInfo(t){const e=await this.getTotalRounds();if(t<0||t>=e)throw new Error(`Invalid round ID: ${t}`);return{roundId:t,config:await this.getRound(t),raisedFunds:await this.getRoundRaisedFunds(t),participants:await this.getRoundParticipants(t),isActive:await this.isRoundActive(t)}}async getUserTotalContribution(t){const e=await this.contract.getUserTotalContribution(t);return{totalFundAmount:Number(e.totalFundAmount)/this.PRICE_PRECISION,totalTokenAllocation:Number(e.totalTokenAllocation)}}async getTransactionStatus(t,e=10){return await(0,r.getTransactionStatus)(this.getRandomProvider(),t,e)}getContractAddress(){return this.contractAddress}async getAllEvents(t,e){return await this.bootstrap(),(0,r.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e)}async streamEvents(t,e,n,o=1e3,i=5e3){return await this.bootstrap(),(0,r.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:n,fromBlock:t,batchSize:o,sleepTime:i})}async getUserRoundContribution(t,n){const[o,i]=await Promise.all([this.contract.getUserRoundContribution(t,n),this.contract.rounds(t)]),s={fundAmount:Number(o.fundAmount)/this.PRICE_PRECISION,tokenAllocation:Number(o.tokenAllocation),claimed:o.claimed,refunded:o.refunded,contributedToken:o.contributedToken,contributedAmount:Number(o.contributedAmount)},a=Math.floor(Date.now()/1e3),d=i.exists&&!i.ended&&a>=Number(i.startTime)&&a<=Number(i.endTime),c={contribution:s,roundInfo:{exists:i.exists,isActive:d,claimingEnabled:i.claimingEnabled,refundEnabled:i.refundEnabled}};if(s.fundAmount>0){const t=s.contributedToken;let n="ETH",o=18;return t!==e.ethers.ZeroAddress&&([n,o]=await Promise.all([(0,r.getTokenSymbol)(t,this.getRandomProvider()),(0,r.getTokenDecimals)(t,this.getRandomProvider())])),{...c,tokenInfo:{symbol:n,decimals:o}}}return c}};
@@ -48,7 +48,7 @@ export declare class TradingVaultSDK {
48
48
  buildReducePositionsTx(tokenIds: bigint[], amounts: number[]): Promise<ethers.ContractTransaction>;
49
49
  buildBorrowCurrencyTx(amount: number): Promise<ethers.ContractTransaction>;
50
50
  buildRepayCurrencyTx(amount: number): Promise<ethers.ContractTransaction>;
51
- buildSetPriceTx(newPrice: number, rewardAmount: number): Promise<ethers.ContractTransaction>;
51
+ buildSetPriceTx(newPrice: number): Promise<ethers.ContractTransaction>;
52
52
  buildClaimERC20Tx(token: string, amount: number): Promise<ethers.ContractTransaction>;
53
53
  buildCreatePositionTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
54
54
  buildCreatePositionForUserTxRaw(user: string, amount: bigint): Promise<ethers.ContractTransaction>;
@@ -56,7 +56,7 @@ export declare class TradingVaultSDK {
56
56
  buildReducePositionsTxRaw(tokenIds: bigint[], amounts: bigint[]): Promise<ethers.ContractTransaction>;
57
57
  buildBorrowCurrencyTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
58
58
  buildRepayCurrencyTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
59
- buildSetPriceTxRaw(newPrice: bigint, rewardAmount: bigint): Promise<ethers.ContractTransaction>;
59
+ buildSetPriceTxRaw(newPrice: bigint): Promise<ethers.ContractTransaction>;
60
60
  buildSetCurrencyTxRaw(currency: string): Promise<ethers.ContractTransaction>;
61
61
  buildSetRewardTokenTxRaw(rewardToken: string): Promise<ethers.ContractTransaction>;
62
62
  buildSetTreasuryTxRaw(treasury: string): Promise<ethers.ContractTransaction>;
@@ -172,4 +172,6 @@ export declare class TradingVaultSDK {
172
172
  totalLossAmount: number;
173
173
  totalPnl: number;
174
174
  };
175
+ buildAddReward(amount: number): Promise<ethers.ContractTransaction>;
176
+ buildAddRewardTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
175
177
  }
@@ -1 +1 @@
1
- "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TradingVaultSDK=void 0;const e=require("ethers"),r=t(require("./abis/TradingVault.json")),a=t(require("./contracts.json")),n=require("./utils");exports.TradingVaultSDK=class{constructor(t,i){this.name="TradingVault",this._currency=null,this._rewardToken=null,this._currencyDecimals=null,this._rewardTokenDecimals=null,this.priceDecimals=6,this.isBootstrapped=!1,this.configs=[],this.BASE_WEIGHT=1e4,this.BASE_PRICE=100,this.formatEventArgs=t=>{const e=this._currencyDecimals,r=this._rewardTokenDecimals,{eventName:a,args:n}=t;switch(a){case"PositionCreated":return{...t,args:{...n,user:n.user.toLowerCase(),amount:Number(n.amount)/Math.pow(10,e),entryPrice:Number(n.entryPrice)/Math.pow(10,this.priceDecimals),tokenId:Number(n.tokenId),openedAt:Number(n.openedAt)}};case"PositionReduced":return{...t,args:{...n,user:n.user.toLowerCase(),reducedAmount:Number(n.reducedAmount)/Math.pow(10,e),remainingAmount:Number(n.remainingAmount)/Math.pow(10,e),totalReward:Number(n.totalReward)/Math.pow(10,r),userReward:Number(n.userReward)/Math.pow(10,r),treasuryReward:Number(n.treasuryReward)/Math.pow(10,r),rewardedAmount:Number(n.rewardedAmount)/Math.pow(10,r),weight:Number(n.weight),tokenId:Number(n.tokenId),lossAmount:Number(n.lossAmount)/Math.pow(10,e),price:Number(n.price)/Math.pow(10,this.priceDecimals),loss:Number(n.loss)/Math.pow(10,e)}};case"CurrencyBorrowed":case"CurrencyRepaid":return{...t,args:{...n,amount:Number(n.amount)/Math.pow(10,e),borrower:n.borrower.toLowerCase()}};case"PriceUpdated":return{...t,args:{...n,oldPrice:Number(n.oldPrice)/Math.pow(10,this.priceDecimals),newPrice:Number(n.newPrice)/Math.pow(10,this.priceDecimals),requiredReward:Number(n.requiredReward)/Math.pow(10,r)}};case"TotalAmountUpdated":return{...t,args:{...n,newTotalAmount:Number(n.newTotalAmount)/Math.pow(10,e)}};case"CurrencyUpdated":return{...t,args:{...n,oldCurrency:n.oldCurrency.toLowerCase(),newCurrency:n.newCurrency.toLowerCase()}};case"RewardTokenUpdated":return{...t,args:{...n,oldRewardToken:n.oldRewardToken.toLowerCase(),newRewardToken:n.newRewardToken.toLowerCase()}};case"ReduceEnabledUpdated":return{...t,args:{...n,enabled:n.enabled}};case"TreasuryUpdated":return{...t,args:{...n,oldTreasury:n.oldTreasury.toLowerCase(),newTreasury:n.newTreasury.toLowerCase()}};case"RewardConfigsUpdated":return{...t,args:{...n}};case"TotalRewardsUpdated":case"TotalRewardsHarvestedUpdated":return{...t,args:{...n,oldAmount:Number(n.oldAmount)/Math.pow(10,r),newAmount:Number(n.newAmount)/Math.pow(10,r)}};default:return t}};const o=Array.isArray(t)?t:[t];this.providers=o.map((t=>new e.ethers.JsonRpcProvider(t)));const s=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(o[0],this.name,a.default,i),this.contract=new e.ethers.Contract(this.contractAddress,r.default.abi,s)}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,r.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,r)=>t[r])),0===this.providers.length)throw new Error("No active RPC providers available");await Promise.all([this.getCurrencyDecimals(),this.getRewardTokenDecimals(),(async()=>{const t=await this.getRewardConfigsLength(),e=[];for(let r=0;r<t;r++)e.push(this.getRewardConfig(r));const r=await Promise.all(e);this.configs=r.map((t=>({weight:Number(t.weight)/this.BASE_WEIGHT,duration:Number(t.duration)})))})()]),this.isBootstrapped=!0}async signAndSendTransaction(t,e,r={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),r)}async buildCreatePositionTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildCreatePositionTxRaw(r)}async buildCreatePositionForUserTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(e*Math.pow(10,r)));return this.buildCreatePositionForUserTxRaw(t,a)}async buildReducePositionTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(e*Math.pow(10,r)));return this.buildReducePositionTxRaw(t,a)}async buildReducePositionsTx(t,e){const r=await this.getCurrencyDecimals(),a=e.map((t=>BigInt(Math.floor(t*Math.pow(10,r)))));return this.buildReducePositionsTxRaw(t,a)}async buildBorrowCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildBorrowCurrencyTxRaw(r)}async buildRepayCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildRepayCurrencyTxRaw(r)}async buildSetPriceTx(t,e){const r=this.priceDecimals,a=await this.getRewardTokenDecimals(),n=BigInt(Math.floor(t*Math.pow(10,r))),i=BigInt(Math.floor(e*Math.pow(10,a)));return this.buildSetPriceTxRaw(n,i)}async buildClaimERC20Tx(t,r){const a=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),n=await a.decimals(),i=BigInt(Math.floor(r*Math.pow(10,n)));return this.buildClaimERC20TxRaw(t,i)}async buildCreatePositionTxRaw(t){return await this.contract.createPosition.populateTransaction(t)}async buildCreatePositionForUserTxRaw(t,e){return await this.contract.createPositionForUser.populateTransaction(t,e)}async buildReducePositionTxRaw(t,e){return await this.contract.reducePosition.populateTransaction(t,e)}async buildReducePositionsTxRaw(t,e){return await this.contract.reducePositions.populateTransaction(t,e)}async buildBorrowCurrencyTxRaw(t){return await this.contract.borrowCurrency.populateTransaction(t)}async buildRepayCurrencyTxRaw(t){return await this.contract.repayCurrency.populateTransaction(t)}async buildSetPriceTxRaw(t,e){return await this.contract.setPrice.populateTransaction(t,e)}async buildSetCurrencyTxRaw(t){this._currency=null;return await this.contract.setCurrency.populateTransaction(t)}async buildSetRewardTokenTxRaw(t){this._rewardToken=null;return await this.contract.setRewardToken.populateTransaction(t)}async buildSetTreasuryTxRaw(t){return await this.contract.setTreasury.populateTransaction(t)}async buildUpdateRewardConfigsTxRaw(t){return await this.contract.updateRewardConfigs.populateTransaction(t)}async buildSetReduceEnabledTxRaw(t){return await this.contract.setReduceEnabled.populateTransaction(t)}async buildClaimERC20TxRaw(t,e){return await this.contract.claimERC20.populateTransaction(t,e)}async buildApproveERC20Tx(t,r,a){const n=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),i=await n.decimals(),o=BigInt(Math.floor(a*Math.pow(10,Number(i))));return this.buildApproveERC20TxRaw(t,r,o)}async buildApproveERC20TxRaw(t,e,r){return await(0,n.buildApproveERC20Tx)(t,e,r,this.getRandomProvider())}async getAllowanceRaw(t,e,r){return await(0,n.getTokenAllowance)(t,e,r,this.getRandomProvider())}async getAllowance(t,e,r){const[a,i]=await Promise.all([this.getAllowanceRaw(t,e,r),(0,n.getTokenDecimals)(t,this.getRandomProvider())]);return Number(a)/Math.pow(10,i)}async buildGrantOperatorRoleTxRaw(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getPrice(){const t=await this.getPriceRaw(),e=this.priceDecimals;return Number(t)/Math.pow(10,e)}async getPriceRaw(){return await this.contract.price()}async getCurrency(){return this._currency||(this._currency=await this.contract.currency()),this._currency}async getRewardToken(){return this._rewardToken||(this._rewardToken=await this.contract.rewardToken()),this._rewardToken}async getTreasury(){return await this.contract.treasury()}async getTotalAmount(){const t=await this.getTotalAmountRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalAmountRaw(){return await this.contract.totalAmount()}async getTotalBorrowed(){const t=await this.getTotalBorrowedRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalBorrowedRaw(){return await this.contract.totalBorrowed()}async isReduceEnabled(){return await this.contract.isReduceEnabled()}async getPosition(t){const e=await this.getPositionRaw(t),r=await this.getCurrencyDecimals(),a=await this.getRewardTokenDecimals(),n=this.priceDecimals;return{remainingAmount:Number(e.remainingAmount)/Math.pow(10,r),entryPrice:Number(e.entryPrice)/Math.pow(10,n),outPrice:Number(e.outPrice)/Math.pow(10,n),openedAt:Number(e.openedAt),closedAt:Number(e.closedAt),rewardedAmount:Number(e.rewardedAmount)/Math.pow(10,a),lossAmount:Number(e.lossAmount)/Math.pow(10,r),initAmount:Number(e.initAmount)/Math.pow(10,r)}}async getPositionRaw(t){return await this.contract.positions(t)}async getRewardConfig(t){return await this.contract.rewardConfigs(t)}async getRewardConfigsLength(){return await this.contract.getRewardConfigsLength()}async getCurrencyDecimals(){if(null===this._currencyDecimals){const t=await this.getCurrency(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._currencyDecimals=Number(await r.decimals())}return this._currencyDecimals}async getRewardTokenDecimals(){if(null===this._rewardTokenDecimals){const t=await this.getRewardToken(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._rewardTokenDecimals=Number(await r.decimals())}return this._rewardTokenDecimals}getContractAddress(){return this.contractAddress}getConfigs(){return[...this.configs]}async getAllEvents(t,e){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e)}async streamEvents(t,e,r,a=1e3,i=5e3){return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:r,fromBlock:t,batchSize:a,sleepTime:i})}estimateUnrealizedPnl({price:t,entryPrice:e,initAmount:r,remainingAmount:a}){const n=a*(t-e)/this.BASE_PRICE;return{pnl:n,pnlPercentage:n/r*100}}estReducePosition({amount:t,price:e,entryPrice:r,openedAt:a,configs:n=[]}){const i=this.BASE_PRICE;this.BASE_WEIGHT;let o=t,s=0,c=0,u=0,d=0;if(e<r){return o=t-t*(r-e)/100,{amount:o,totalReward:0,userReward:0,treasuryReward:0,weight:0}}if(e>=r){s=t*(e-r)/i;const o=Math.floor(Date.now()/1e3)-a;d=this.getRewardWeight(o,n),c=s*d,u=s-c}return{amount:o,totalReward:s,userReward:c,treasuryReward:u,weight:d}}estReducePositions({positions:t,price:e,configs:r=[]}){return t.map((t=>this.estReducePosition({amount:t.amount,price:e,entryPrice:t.entryPrice,openedAt:t.openedAt,configs:r}))).reduce(((t,e)=>({amount:t.amount+e.amount,totalReward:t.totalReward+e.totalReward,userReward:t.userReward+e.userReward,treasuryReward:t.treasuryReward+e.treasuryReward})),{amount:0,totalReward:0,userReward:0,treasuryReward:0})}getRewardWeight(t,e){return(0,n.getRewardWeight)(t,e)}estimateUnrealizedPnls({price:t,positions:e}){return e.reduce(((e,r)=>{const{pnl:a}=this.estimateUnrealizedPnl({price:t,...r});return{totalInitAmount:e.totalInitAmount+r.initAmount,totalRemainingAmount:e.totalRemainingAmount+r.remainingAmount,totalRewardedAmount:e.totalRewardedAmount+r.rewardedAmount,totalLossAmount:e.totalLossAmount+r.lossAmount,totalPnl:e.totalPnl+a}}),{totalInitAmount:0,totalRemainingAmount:0,totalRewardedAmount:0,totalLossAmount:0,totalPnl:0})}};
1
+ "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TradingVaultSDK=void 0;const e=require("ethers"),r=t(require("./abis/TradingVault.json")),a=t(require("./contracts.json")),n=require("./utils");exports.TradingVaultSDK=class{constructor(t,i){this.name="TradingVault",this._currency=null,this._rewardToken=null,this._currencyDecimals=null,this._rewardTokenDecimals=null,this.priceDecimals=6,this.isBootstrapped=!1,this.configs=[],this.BASE_WEIGHT=1e4,this.BASE_PRICE=100,this.formatEventArgs=t=>{const e=this._currencyDecimals,r=this._rewardTokenDecimals,{eventName:a,args:n}=t;switch(a){case"PositionCreated":return{...t,args:{...n,user:n.user.toLowerCase(),amount:Number(n.amount)/Math.pow(10,e),entryPrice:Number(n.entryPrice)/Math.pow(10,this.priceDecimals),tokenId:Number(n.tokenId),openedAt:Number(n.openedAt)}};case"PositionReduced":return{...t,args:{...n,user:n.user.toLowerCase(),reducedAmount:Number(n.reducedAmount)/Math.pow(10,e),remainingAmount:Number(n.remainingAmount)/Math.pow(10,e),totalReward:Number(n.totalReward)/Math.pow(10,r),userReward:Number(n.userReward)/Math.pow(10,r),treasuryReward:Number(n.treasuryReward)/Math.pow(10,r),rewardedAmount:Number(n.rewardedAmount)/Math.pow(10,r),weight:Number(n.weight),tokenId:Number(n.tokenId),lossAmount:Number(n.lossAmount)/Math.pow(10,e),price:Number(n.price)/Math.pow(10,this.priceDecimals),loss:Number(n.loss)/Math.pow(10,e)}};case"CurrencyBorrowed":case"CurrencyRepaid":return{...t,args:{...n,amount:Number(n.amount)/Math.pow(10,e),borrower:n.borrower.toLowerCase()}};case"PriceUpdated":return{...t,args:{...n,oldPrice:Number(n.oldPrice)/Math.pow(10,this.priceDecimals),newPrice:Number(n.newPrice)/Math.pow(10,this.priceDecimals),requiredReward:Number(n.requiredReward)/Math.pow(10,r)}};case"TotalAmountUpdated":return{...t,args:{...n,newTotalAmount:Number(n.newTotalAmount)/Math.pow(10,e)}};case"CurrencyUpdated":return{...t,args:{...n,oldCurrency:n.oldCurrency.toLowerCase(),newCurrency:n.newCurrency.toLowerCase()}};case"RewardTokenUpdated":return{...t,args:{...n,oldRewardToken:n.oldRewardToken.toLowerCase(),newRewardToken:n.newRewardToken.toLowerCase()}};case"ReduceEnabledUpdated":return{...t,args:{...n,enabled:n.enabled}};case"TreasuryUpdated":return{...t,args:{...n,oldTreasury:n.oldTreasury.toLowerCase(),newTreasury:n.newTreasury.toLowerCase()}};case"RewardConfigsUpdated":return{...t,args:{...n}};case"TotalRewardsUpdated":case"TotalRewardsHarvestedUpdated":return{...t,args:{...n,oldAmount:Number(n.oldAmount)/Math.pow(10,r),newAmount:Number(n.newAmount)/Math.pow(10,r)}};default:return t}};const o=Array.isArray(t)?t:[t];this.providers=o.map((t=>new e.ethers.JsonRpcProvider(t)));const s=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(o[0],this.name,a.default,i),this.contract=new e.ethers.Contract(this.contractAddress,r.default.abi,s)}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,r.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,r)=>t[r])),0===this.providers.length)throw new Error("No active RPC providers available");await Promise.all([this.getCurrencyDecimals(),this.getRewardTokenDecimals(),(async()=>{const t=await this.getRewardConfigsLength(),e=[];for(let r=0;r<t;r++)e.push(this.getRewardConfig(r));const r=await Promise.all(e);this.configs=r.map((t=>({weight:Number(t.weight)/this.BASE_WEIGHT,duration:Number(t.duration)})))})()]),this.isBootstrapped=!0}async signAndSendTransaction(t,e,r={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),r)}async buildCreatePositionTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildCreatePositionTxRaw(r)}async buildCreatePositionForUserTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(e*Math.pow(10,r)));return this.buildCreatePositionForUserTxRaw(t,a)}async buildReducePositionTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(e*Math.pow(10,r)));return this.buildReducePositionTxRaw(t,a)}async buildReducePositionsTx(t,e){const r=await this.getCurrencyDecimals(),a=e.map((t=>BigInt(Math.floor(t*Math.pow(10,r)))));return this.buildReducePositionsTxRaw(t,a)}async buildBorrowCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildBorrowCurrencyTxRaw(r)}async buildRepayCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildRepayCurrencyTxRaw(r)}async buildSetPriceTx(t){const e=this.priceDecimals,r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildSetPriceTxRaw(r)}async buildClaimERC20Tx(t,r){const a=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),n=await a.decimals(),i=BigInt(Math.floor(r*Math.pow(10,n)));return this.buildClaimERC20TxRaw(t,i)}async buildCreatePositionTxRaw(t){return await this.contract.createPosition.populateTransaction(t)}async buildCreatePositionForUserTxRaw(t,e){return await this.contract.createPositionForUser.populateTransaction(t,e)}async buildReducePositionTxRaw(t,e){return await this.contract.reducePosition.populateTransaction(t,e)}async buildReducePositionsTxRaw(t,e){return await this.contract.reducePositions.populateTransaction(t,e)}async buildBorrowCurrencyTxRaw(t){return await this.contract.borrowCurrency.populateTransaction(t)}async buildRepayCurrencyTxRaw(t){return await this.contract.repayCurrency.populateTransaction(t)}async buildSetPriceTxRaw(t){return await this.contract.setPrice.populateTransaction(t)}async buildSetCurrencyTxRaw(t){this._currency=null;return await this.contract.setCurrency.populateTransaction(t)}async buildSetRewardTokenTxRaw(t){this._rewardToken=null;return await this.contract.setRewardToken.populateTransaction(t)}async buildSetTreasuryTxRaw(t){return await this.contract.setTreasury.populateTransaction(t)}async buildUpdateRewardConfigsTxRaw(t){return await this.contract.updateRewardConfigs.populateTransaction(t)}async buildSetReduceEnabledTxRaw(t){return await this.contract.setReduceEnabled.populateTransaction(t)}async buildClaimERC20TxRaw(t,e){return await this.contract.claimERC20.populateTransaction(t,e)}async buildApproveERC20Tx(t,r,a){const n=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),i=await n.decimals(),o=BigInt(Math.floor(a*Math.pow(10,Number(i))));return this.buildApproveERC20TxRaw(t,r,o)}async buildApproveERC20TxRaw(t,e,r){return await(0,n.buildApproveERC20Tx)(t,e,r,this.getRandomProvider())}async getAllowanceRaw(t,e,r){return await(0,n.getTokenAllowance)(t,e,r,this.getRandomProvider())}async getAllowance(t,e,r){const[a,i]=await Promise.all([this.getAllowanceRaw(t,e,r),(0,n.getTokenDecimals)(t,this.getRandomProvider())]);return Number(a)/Math.pow(10,i)}async buildGrantOperatorRoleTxRaw(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getPrice(){const t=await this.getPriceRaw(),e=this.priceDecimals;return Number(t)/Math.pow(10,e)}async getPriceRaw(){return await this.contract.price()}async getCurrency(){return this._currency||(this._currency=await this.contract.currency()),this._currency}async getRewardToken(){return this._rewardToken||(this._rewardToken=await this.contract.rewardToken()),this._rewardToken}async getTreasury(){return await this.contract.treasury()}async getTotalAmount(){const t=await this.getTotalAmountRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalAmountRaw(){return await this.contract.totalAmount()}async getTotalBorrowed(){const t=await this.getTotalBorrowedRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalBorrowedRaw(){return await this.contract.totalBorrowed()}async isReduceEnabled(){return await this.contract.isReduceEnabled()}async getPosition(t){const e=await this.getPositionRaw(t),r=await this.getCurrencyDecimals(),a=await this.getRewardTokenDecimals(),n=this.priceDecimals;return{remainingAmount:Number(e.remainingAmount)/Math.pow(10,r),entryPrice:Number(e.entryPrice)/Math.pow(10,n),outPrice:Number(e.outPrice)/Math.pow(10,n),openedAt:Number(e.openedAt),closedAt:Number(e.closedAt),rewardedAmount:Number(e.rewardedAmount)/Math.pow(10,a),lossAmount:Number(e.lossAmount)/Math.pow(10,r),initAmount:Number(e.initAmount)/Math.pow(10,r)}}async getPositionRaw(t){return await this.contract.positions(t)}async getRewardConfig(t){return await this.contract.rewardConfigs(t)}async getRewardConfigsLength(){return await this.contract.getRewardConfigsLength()}async getCurrencyDecimals(){if(null===this._currencyDecimals){const t=await this.getCurrency(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._currencyDecimals=Number(await r.decimals())}return this._currencyDecimals}async getRewardTokenDecimals(){if(null===this._rewardTokenDecimals){const t=await this.getRewardToken(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._rewardTokenDecimals=Number(await r.decimals())}return this._rewardTokenDecimals}getContractAddress(){return this.contractAddress}getConfigs(){return[...this.configs]}async getAllEvents(t,e){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e)}async streamEvents(t,e,r,a=1e3,i=5e3){return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:r,fromBlock:t,batchSize:a,sleepTime:i})}estimateUnrealizedPnl({price:t,entryPrice:e,initAmount:r,remainingAmount:a}){const n=a*(t-e)/this.BASE_PRICE;return{pnl:n,pnlPercentage:n/r*100}}estReducePosition({amount:t,price:e,entryPrice:r,openedAt:a,configs:n=[]}){const i=this.BASE_PRICE;this.BASE_WEIGHT;let o=t,s=0,c=0,u=0,d=0;if(e<r){return o=t-t*(r-e)/100,{amount:o,totalReward:0,userReward:0,treasuryReward:0,weight:0}}if(e>=r){s=t*(e-r)/i;const o=Math.floor(Date.now()/1e3)-a;d=this.getRewardWeight(o,n),c=s*d,u=s-c}return{amount:o,totalReward:s,userReward:c,treasuryReward:u,weight:d}}estReducePositions({positions:t,price:e,configs:r=[]}){return t.map((t=>this.estReducePosition({amount:t.amount,price:e,entryPrice:t.entryPrice,openedAt:t.openedAt,configs:r}))).reduce(((t,e)=>({amount:t.amount+e.amount,totalReward:t.totalReward+e.totalReward,userReward:t.userReward+e.userReward,treasuryReward:t.treasuryReward+e.treasuryReward})),{amount:0,totalReward:0,userReward:0,treasuryReward:0})}getRewardWeight(t,e){return(0,n.getRewardWeight)(t,e)}estimateUnrealizedPnls({price:t,positions:e}){return e.reduce(((e,r)=>{const{pnl:a}=this.estimateUnrealizedPnl({price:t,...r});return{totalInitAmount:e.totalInitAmount+r.initAmount,totalRemainingAmount:e.totalRemainingAmount+r.remainingAmount,totalRewardedAmount:e.totalRewardedAmount+r.rewardedAmount,totalLossAmount:e.totalLossAmount+r.lossAmount,totalPnl:e.totalPnl+a}}),{totalInitAmount:0,totalRemainingAmount:0,totalRewardedAmount:0,totalLossAmount:0,totalPnl:0})}async buildAddReward(t){const e=await this.getRewardTokenDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildAddRewardTxRaw(r)}async buildAddRewardTxRaw(t){return await this.contract.addReward.populateTransaction(t)}};
@@ -707,6 +707,19 @@
707
707
  "stateMutability": "view",
708
708
  "type": "function"
709
709
  },
710
+ {
711
+ "inputs": [],
712
+ "name": "TREASURER_ROLE",
713
+ "outputs": [
714
+ {
715
+ "internalType": "bytes32",
716
+ "name": "",
717
+ "type": "bytes32"
718
+ }
719
+ ],
720
+ "stateMutability": "view",
721
+ "type": "function"
722
+ },
710
723
  {
711
724
  "inputs": [
712
725
  {
@@ -725,13 +738,6 @@
725
738
  "stateMutability": "nonpayable",
726
739
  "type": "function"
727
740
  },
728
- {
729
- "inputs": [],
730
- "name": "claimTokens",
731
- "outputs": [],
732
- "stateMutability": "nonpayable",
733
- "type": "function"
734
- },
735
741
  {
736
742
  "inputs": [
737
743
  {
@@ -969,6 +975,19 @@
969
975
  "stateMutability": "nonpayable",
970
976
  "type": "function"
971
977
  },
978
+ {
979
+ "inputs": [
980
+ {
981
+ "internalType": "address",
982
+ "name": "treasurer",
983
+ "type": "address"
984
+ }
985
+ ],
986
+ "name": "grantTreasurerRole",
987
+ "outputs": [],
988
+ "stateMutability": "nonpayable",
989
+ "type": "function"
990
+ },
972
991
  {
973
992
  "inputs": [
974
993
  {
@@ -1052,7 +1071,18 @@
1052
1071
  "type": "function"
1053
1072
  },
1054
1073
  {
1055
- "inputs": [],
1074
+ "inputs": [
1075
+ {
1076
+ "internalType": "uint256",
1077
+ "name": "_roundId",
1078
+ "type": "uint256"
1079
+ },
1080
+ {
1081
+ "internalType": "address",
1082
+ "name": "_user",
1083
+ "type": "address"
1084
+ }
1085
+ ],
1056
1086
  "name": "refund",
1057
1087
  "outputs": [],
1058
1088
  "stateMutability": "nonpayable",
@@ -1512,8 +1542,8 @@
1512
1542
  "type": "receive"
1513
1543
  }
1514
1544
  ],
1515
- "bytecode": "0x608060405234801561001057600080fd5b5061001f61002460201b60201c565b61018e565b600061003461012860201b60201c565b90508060000160089054906101000a900460ff161561007f576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80168160000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16146101255767ffffffffffffffff8160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff60405161011c9190610173565b60405180910390a15b50565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b600067ffffffffffffffff82169050919050565b61016d81610150565b82525050565b60006020820190506101886000830184610164565b92915050565b6149568061019d6000396000f3fe60806040526004361061026b5760003560e01c806395082d2511610144578063d4bcdfa1116100b6578063eb4c9e9b1161007a578063eb4c9e9b14610929578063ed54890d14610966578063efe9c9e2146109a8578063f0e1bb3e146109d1578063f2fde38b14610a0e578063f5b541a614610a375761026c565b8063d4bcdfa114610832578063d4ee651b1461085b578063d547741f14610884578063d871b0e3146108ad578063daf9c210146108eb5761026c565b8063a217fddf11610108578063a217fddf14610738578063a6be83dd14610763578063a734f06e1461078c578063c1075329146107b7578063c4428a89146107e0578063c4d66de8146108095761026c565b806395082d251461063f57806397ac4a251461066a5780639bb92c4e146106a75780639da64ac2146106d0578063a09686c41461070d5761026c565b80635a1e6ca1116101dd5780638952ac1e116101a15780638952ac1e146105215780638a5682991461053d5780638c65c81f146105685780638d52e555146105ae5780638da5cb5b146105d757806391d14854146106025761026c565b80635a1e6ca1146104525780635af6df4c1461047b5780636fed6940146104a4578063715018a6146104e15780637cf30c60146104f85761026c565b80632f2ff15d1161022f5780632f2ff15d1461037c57806336568abe146103a557806342683c67146103ce57806348c54b9d146103f95780634b60ce7714610410578063590e1ae31461043b5761026c565b806301ffc9a71461026e5780631c88705d146102ab578063248a9ca3146102d457806327ac0c581461031157806328f3e6581461033a5761026c565b5b005b34801561027a57600080fd5b5061029560048036038101906102909190613f46565b610a62565b6040516102a29190613f8e565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190614007565b610a74565b005b3480156102e057600080fd5b506102fb60048036038101906102f6919061406a565b610bc4565b60405161030891906140a6565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190614007565b610bf2565b005b34801561034657600080fd5b50610361600480360381019061035c91906140f7565b610c2e565b60405161037396959493929190614155565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e91906141b6565b610cfa565b005b3480156103b157600080fd5b506103cc60048036038101906103c791906141b6565b610d1c565b005b3480156103da57600080fd5b506103e3610d97565b6040516103f091906141f6565b60405180910390f35b34801561040557600080fd5b5061040e610d9d565b005b34801561041c57600080fd5b50610425610e3a565b6040516104329190614211565b60405180910390f35b34801561044757600080fd5b50610450610e60565b005b34801561045e57600080fd5b506104796004803603810190610474919061422c565b611366565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614259565b6114b4565b005b3480156104b057600080fd5b506104cb60048036038101906104c6919061422c565b61178e565b6040516104d891906141f6565b60405180910390f35b3480156104ed57600080fd5b506104f66117a6565b005b34801561050457600080fd5b5061051f600480360381019061051a9190614300565b6117ba565b005b61053b60048036038101906105369190614340565b6118a9565b005b34801561054957600080fd5b506105526120de565b60405161055f91906141f6565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a919061422c565b6120e4565b6040516105a59a99989796959493929190614393565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190614300565b612179565b005b3480156105e357600080fd5b506105ec612268565b6040516105f99190614211565b60405180910390f35b34801561060e57600080fd5b50610629600480360381019061062491906141b6565b6122a0565b6040516106369190613f8e565b60405180910390f35b34801561064b57600080fd5b50610654612319565b60405161066191906141f6565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c919061422c565b612325565b60405161069e9190613f8e565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c99190614300565b61241b565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190614007565b61250a565b60405161070491906141f6565b60405180910390f35b34801561071957600080fd5b50610722612577565b60405161072f91906141f6565b60405180910390f35b34801561074457600080fd5b5061074d612581565b60405161075a91906140a6565b60405180910390f35b34801561076f57600080fd5b5061078a6004803603810190610785919061442f565b612588565b005b34801561079857600080fd5b506107a161288f565b6040516107ae9190614211565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d991906144bc565b612894565b005b3480156107ec57600080fd5b506108076004803603810190610802919061422c565b612b65565b005b34801561081557600080fd5b50610830600480360381019061082b9190614007565b612b72565b005b34801561083e57600080fd5b50610859600480360381019061085491906144bc565b612de9565b005b34801561086757600080fd5b50610882600480360381019061087d91906144bc565b612fc3565b005b34801561089057600080fd5b506108ab60048036038101906108a691906141b6565b61318e565b005b3480156108b957600080fd5b506108d460048036038101906108cf9190614007565b6131b0565b6040516108e29291906144fc565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190614007565b61324c565b604051610920929190614525565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b9190614007565b61327d565b60405161095d91906141f6565b60405180910390f35b34801561097257600080fd5b5061098d600480360381019061098891906140f7565b613295565b60405161099f96959493929190614155565b60405180910390f35b3480156109b457600080fd5b506109cf60048036038101906109ca9190614007565b613318565b005b3480156109dd57600080fd5b506109f860048036038101906109f3919061422c565b61344c565b604051610a0591906141f6565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a309190614007565b613464565b005b348015610a4357600080fd5b50610a4c6134ea565b604051610a5991906140a6565b60405180910390f35b6000610a6d8261350e565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610a9e81613588565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610b23576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d91760405160405180910390a25050565b600080610bcf61359c565b905080600001600084815260200190815260200160002060010154915050919050565b6000801b610bff81613588565b610c297f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929836135c4565b505050565b6000806000806000806000600260008a815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260020160009054906101000a900460ff168360020160019054906101000a900460ff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030154965096509650965096509650509295509295509295565b610d0382610bc4565b610d0c81613588565b610d1683836135c4565b50505050565b610d246136c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d88576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9282826136cd565b505050565b60085481565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103610e1b576040517f55842fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182610e2a919061457d565b9050610e3681336137cf565b5050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103610ede576040517f55842fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182610eed919061457d565b90506001600082815260200190815260200160002060050160009054906101000a900460ff16610f49576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600082815260200190815260200160002060050160039054906101000a900460ff16610fa3576040517f089c998700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015403611035576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff161561107e576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff16156110c7576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008260030154905060018360020160016101000a81548160ff021916908315150217905550826000015460036000868152602001908152602001600020600082825461113d919061457d565b9250508190555082600001546008600082825461115a919061457d565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361123e5760003373ffffffffffffffffffffffffffffffffffffffff16826040516111bb906145e2565b60006040518083038185875af1925050503d80600081146111f8576040519150601f19603f3d011682016040523d82523d6000602084013e6111fd565b606091505b5050905080611238576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506112f9565b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b815260040161127b9291906145f7565b6020604051808303816000875af115801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be9190614635565b9050806112f7576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16857f1c26abe6289671e3a9d493647349673af828abb9dbadff1e81762387f7cd99a38460405161135791906141f6565b60405180910390a45050505050565b61136e613b7c565b6001600082815260200190815260200160002060050160009054906101000a900460ff166113c8576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600082815260200190815260200160002060050160019054906101000a900460ff1615611423576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180600083815260200190815260200160002060050160016101000a81548160ff021916908315150217905550807fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad57600360008481526020019081526020016000205460046000858152602001908152602001600020546040516114a99291906144fc565b60405180910390a250565b6114bc613b7c565b428510156114f6576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84841161152f576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303611569576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036115a3576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008114806115b157508281115b156115e8576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060075490506040518061014001604052808781526020018681526020018581526020018481526020018381526020016001151581526020016000151581526020016000151581526020016000151581526020016001151581525060016000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff0219169083151502179055506101208201518160050160046101000a81548160ff0219169083151502179055509050506007600081548092919061174190614662565b9190505550807f21fb045299ceafb7a136c74ee07b22d481ee9bf37a85b2d8f20c59f83ada4133878787878760405161177e9594939291906146aa565b60405180910390a2505050505050565b60046020528060005260406000206000915090505481565b6117ae613b7c565b6117b86000613c03565b565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296117e481613588565b6001600084815260200190815260200160002060050160009054906101000a900460ff1661183e576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160036101000a81548160ff021916908315150217905550827f653b56ea3ea7dfba44234dbc807bac97a2a0adafb6d22427d818250375f1e9118360405161189c9190613f8e565b60405180910390a2505050565b6118b283612325565b6118e8576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1661196d576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119e457600034036119dc576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050611a22565b60008203611a1e576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8190505b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114158015611a835750600185611a7f91906146fd565b8114155b15611ae3576001600086815260200190815260200160002060050160049054906101000a900460ff16611ae2576040517f827a86b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000670de0b6b3a76400008285611b409190614731565b611b4a91906147a2565b905060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000828260000154611bb291906146fd565b9050600160008a815260200190815260200160002060040154811115611c04576040517f1cd861cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600360008c815260200190815260200160002054611c2591906146fd565b9050600160008b815260200190815260200160002060020154811115611c77576040517f397bb34300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614611d685760008973ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401611cea939291906147d3565b6020604051808303816000875af1158015611d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2d9190614635565b905080611d66576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6000600160008c815260200190815260200160002060020154600160008d81526020019081526020016000206003015486611da39190614731565b611dad91906147a2565b90506000846000015403611e8557600460008c81526020019081526020016000206000815480929190611ddf90614662565b919050555060018b611df191906146fd565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550898460020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878460030181905550611f2f565b8973ffffffffffffffffffffffffffffffffffffffff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611efc5787846003016000828254611ef091906146fd565b92505081905550611f2e565b6040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b84846000016000828254611f4391906146fd565b9250508190555080846001016000828254611f5e91906146fd565b9250508190555084600360008d81526020019081526020016000206000828254611f8891906146fd565b925050819055508460086000828254611fa191906146fd565b92505081905550600160008c815260200190815260200160002060020154600360008d815260200190815260200160002054106120675760018060008d815260200190815260200160002060050160016101000a81548160ff0219169083151502179055508a7fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad57600360008e815260200190815260200160002054600460008f81526020019081526020016000205460405161205e9291906144fc565b60405180910390a25b8973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168c7fb479ec976a9860505652c0d9f5dc15bc5fbca1a55c3da9cabe662f1b6f8090d28b89866040516120c99392919061480a565b60405180910390a45050505050505050505050565b60075481565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900460ff16908060050160049054906101000a900460ff1690508a565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296121a381613588565b6001600084815260200190815260200160002060050160009054906101000a900460ff166121fd576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160046101000a81548160ff021916908315150217905550827f1c1c03453d1eefaa85a62e371adba496bc16fa6320bf5416b0af1249081ca84c8360405161225b9190613f8e565b60405180910390a2505050565b600080612273613cda565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b6000806122ab61359c565b905080600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b670de0b6b3a764000081565b60006001600083815260200190815260200160002060050160009054906101000a900460ff166123585760009050612416565b6001600083815260200190815260200160002060050160019054906101000a900460ff161561238a5760009050612416565b60016000838152602001908152602001600020600001544210156123b15760009050612416565b60016000838152602001908152602001600020600101544211156123d85760009050612416565b60016000838152602001908152602001600020600201546003600084815260200190815260200160002054106124115760009050612416565b600190505b919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961244581613588565b6001600084815260200190815260200160002060050160009054906101000a900460ff1661249f576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160026101000a81548160ff021916908315150217905550827f74c19978ee48fa394fffde7cccc94793539daf917f2a8fd2d5e851409de3f7a0836040516124fd9190613f8e565b60405180910390a2505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103612561576000915050612572565b60018161256e919061457d565b9150505b919050565b6000600754905090565b6000801b81565b612590613b7c565b6001600087815260200190815260200160002060050160009054906101000a900460ff166125ea576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600087815260200190815260200160002060050160019054906101000a900460ff1615612645576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016000878152602001908152602001600020600001544210612694576040517f4eb5402b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428510156126ce576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848411612707576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612741576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361277b576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081148061278957508281115b156127c0576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600088815260200190815260200160002060000181905550836001600088815260200190815260200160002060010181905550826001600088815260200190815260200160002060020181905550816001600088815260200190815260200160002060030181905550806001600088815260200190815260200160002060040181905550857fe35865500052be0ea409d44d56e7f66a0e0728bab40a71f941ccd691b9159596868686868660405161287f9594939291906146aa565b60405180910390a2505050505050565b600081565b61289c613b7c565b600081036128d6576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129ed5747811115612944576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161296a906145e2565b60006040518083038185875af1925050503d80600081146129a7576040519150601f19603f3d011682016040523d82523d6000602084013e6129ac565b606091505b50509050806129e7576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612b61565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a289190614211565b602060405180830381865afa158015612a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a699190614856565b905080821115612aa5576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401612ae29291906145f7565b6020604051808303816000875af1158015612b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b259190614635565b905080612b5e576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505b5050565b612b6f81336137cf565b50565b6000612b7c613d02565b905060008160000160089054906101000a900460ff1615905060008260000160009054906101000a900467ffffffffffffffff1690506000808267ffffffffffffffff16148015612bca5750825b9050600060018367ffffffffffffffff16148015612bff575060003073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015612c0d575080155b15612c44576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018560000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315612c945760018560000160086101000a81548160ff0219169083151502179055505b612c9d33613d2a565b612ca5613d3e565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612d0b576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612d596000801b336135c4565b50612d847f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336135c4565b508315612de15760008560000160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051612dd891906148dc565b60405180910390a15b505050505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612e1381613588565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612e7c5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612eb3576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612eed576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060400160405280600115158152602001838152506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101559050508273ffffffffffffffffffffffffffffffffffffffff167fe184914670d9e097e90729e2a9159866b30b1203952f0586bedca1d6fcf130a883604051612fb691906141f6565b60405180910390a2505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612fed81613588565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16613072576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036130ac576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508373ffffffffffffffffffffffffffffffffffffffff167f62e2c9c75b287778c0b58f1c1d83fa8f9978a33848e0b423735fd44f48ebe3c182856040516131809291906144fc565b60405180910390a250505050565b61319782610bc4565b6131a081613588565b6131aa83836136cd565b50505050565b60008060005b6007548110156132465760006002600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001548461322491906146fd565b935080600101548361323691906146fd565b92505080806001019150506131b6565b50915091565b60006020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154905082565b60056020528060005260406000206000915090505481565b6002602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16908060020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905086565b613320613b7c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613386576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f38b700f64059658d3f95b87d8db51f669197c89da3076d26d42bb8fb06159fa960405160405180910390a35050565b60036020528060005260406000206000915090505481565b61346c613b7c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036134de5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016134d59190614211565b60405180910390fd5b6134e781613c03565b50565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613581575061358082613d48565b5b9050919050565b613599816135946136c5565b613db2565b50565b60007f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b6000806135cf61359c565b90506135db84846122a0565b6136b957600181600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506136556136c5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506136bf565b60009150505b92915050565b600033905090565b6000806136d861359c565b90506136e484846122a0565b156137c357600081600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061375f6136c5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506137c9565b60009150505b92915050565b6001600083815260200190815260200160002060050160009054906101000a900460ff16613829576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160019054906101000a900460ff16158015613870575060016000838152602001908152602001600020600101544211155b156138a7576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160029054906101000a900460ff16613901576040517fe2c858ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015403613993576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16156139dc576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff1615613a25576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160010154905060018260020160006101000a81548160ff0219169083151502179055506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401613aaa9291906145f7565b6020604051808303816000875af1158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed9190614635565b905080613b26576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16857f880f2ef2613b092f1a0a819f294155c98667eb294b7e6bf7a3810278142c1a1c84604051613b6d91906141f6565b60405180910390a35050505050565b613b846136c5565b73ffffffffffffffffffffffffffffffffffffffff16613ba2612268565b73ffffffffffffffffffffffffffffffffffffffff1614613c0157613bc56136c5565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401613bf89190614211565b60405180910390fd5b565b6000613c0d613cda565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60007f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b613d32613e03565b613d3b81613e43565b50565b613d46613e03565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613dbc82826122a0565b613dff5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401613df69291906148f7565b60405180910390fd5b5050565b613e0b613ec9565b613e41576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613e4b613e03565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613ebd5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613eb49190614211565b60405180910390fd5b613ec681613c03565b50565b6000613ed3613d02565b60000160089054906101000a900460ff16905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f2381613eee565b8114613f2e57600080fd5b50565b600081359050613f4081613f1a565b92915050565b600060208284031215613f5c57613f5b613ee9565b5b6000613f6a84828501613f31565b91505092915050565b60008115159050919050565b613f8881613f73565b82525050565b6000602082019050613fa36000830184613f7f565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fd482613fa9565b9050919050565b613fe481613fc9565b8114613fef57600080fd5b50565b60008135905061400181613fdb565b92915050565b60006020828403121561401d5761401c613ee9565b5b600061402b84828501613ff2565b91505092915050565b6000819050919050565b61404781614034565b811461405257600080fd5b50565b6000813590506140648161403e565b92915050565b6000602082840312156140805761407f613ee9565b5b600061408e84828501614055565b91505092915050565b6140a081614034565b82525050565b60006020820190506140bb6000830184614097565b92915050565b6000819050919050565b6140d4816140c1565b81146140df57600080fd5b50565b6000813590506140f1816140cb565b92915050565b6000806040838503121561410e5761410d613ee9565b5b600061411c858286016140e2565b925050602061412d85828601613ff2565b9150509250929050565b614140816140c1565b82525050565b61414f81613fc9565b82525050565b600060c08201905061416a6000830189614137565b6141776020830188614137565b6141846040830187613f7f565b6141916060830186613f7f565b61419e6080830185614146565b6141ab60a0830184614137565b979650505050505050565b600080604083850312156141cd576141cc613ee9565b5b60006141db85828601614055565b92505060206141ec85828601613ff2565b9150509250929050565b600060208201905061420b6000830184614137565b92915050565b60006020820190506142266000830184614146565b92915050565b60006020828403121561424257614241613ee9565b5b6000614250848285016140e2565b91505092915050565b600080600080600060a0868803121561427557614274613ee9565b5b6000614283888289016140e2565b9550506020614294888289016140e2565b94505060406142a5888289016140e2565b93505060606142b6888289016140e2565b92505060806142c7888289016140e2565b9150509295509295909350565b6142dd81613f73565b81146142e857600080fd5b50565b6000813590506142fa816142d4565b92915050565b6000806040838503121561431757614316613ee9565b5b6000614325858286016140e2565b9250506020614336858286016142eb565b9150509250929050565b60008060006060848603121561435957614358613ee9565b5b6000614367868287016140e2565b935050602061437886828701613ff2565b9250506040614389868287016140e2565b9150509250925092565b6000610140820190506143a9600083018d614137565b6143b6602083018c614137565b6143c3604083018b614137565b6143d0606083018a614137565b6143dd6080830189614137565b6143ea60a0830188613f7f565b6143f760c0830187613f7f565b61440460e0830186613f7f565b614412610100830185613f7f565b614420610120830184613f7f565b9b9a5050505050505050505050565b60008060008060008060c0878903121561444c5761444b613ee9565b5b600061445a89828a016140e2565b965050602061446b89828a016140e2565b955050604061447c89828a016140e2565b945050606061448d89828a016140e2565b935050608061449e89828a016140e2565b92505060a06144af89828a016140e2565b9150509295509295509295565b600080604083850312156144d3576144d2613ee9565b5b60006144e185828601613ff2565b92505060206144f2858286016140e2565b9150509250929050565b60006040820190506145116000830185614137565b61451e6020830184614137565b9392505050565b600060408201905061453a6000830185613f7f565b6145476020830184614137565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614588826140c1565b9150614593836140c1565b92508282039050818111156145ab576145aa61454e565b5b92915050565b600081905092915050565b50565b60006145cc6000836145b1565b91506145d7826145bc565b600082019050919050565b60006145ed826145bf565b9150819050919050565b600060408201905061460c6000830185614146565b6146196020830184614137565b9392505050565b60008151905061462f816142d4565b92915050565b60006020828403121561464b5761464a613ee9565b5b600061465984828501614620565b91505092915050565b600061466d826140c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361469f5761469e61454e565b5b600182019050919050565b600060a0820190506146bf6000830188614137565b6146cc6020830187614137565b6146d96040830186614137565b6146e66060830185614137565b6146f36080830184614137565b9695505050505050565b6000614708826140c1565b9150614713836140c1565b925082820190508082111561472b5761472a61454e565b5b92915050565b600061473c826140c1565b9150614747836140c1565b9250828202614755816140c1565b9150828204841483151761476c5761476b61454e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147ad826140c1565b91506147b8836140c1565b9250826147c8576147c7614773565b5b828204905092915050565b60006060820190506147e86000830186614146565b6147f56020830185614146565b6148026040830184614137565b949350505050565b600060608201905061481f6000830186614137565b61482c6020830185614137565b6148396040830184614137565b949350505050565b600081519050614850816140cb565b92915050565b60006020828403121561486c5761486b613ee9565b5b600061487a84828501614841565b91505092915050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000819050919050565b60006148c66148c16148bc84614883565b6148a1565b61488d565b9050919050565b6148d6816148ab565b82525050565b60006020820190506148f160008301846148cd565b92915050565b600060408201905061490c6000830185614146565b6149196020830184614097565b939250505056fea264697066735822122067cd1a53a4406a4ff96e0d045d7336688804c5331559439b9cb78198671d878264736f6c634300081c0033",
1516
- "deployedBytecode": "0x60806040526004361061026b5760003560e01c806395082d2511610144578063d4bcdfa1116100b6578063eb4c9e9b1161007a578063eb4c9e9b14610929578063ed54890d14610966578063efe9c9e2146109a8578063f0e1bb3e146109d1578063f2fde38b14610a0e578063f5b541a614610a375761026c565b8063d4bcdfa114610832578063d4ee651b1461085b578063d547741f14610884578063d871b0e3146108ad578063daf9c210146108eb5761026c565b8063a217fddf11610108578063a217fddf14610738578063a6be83dd14610763578063a734f06e1461078c578063c1075329146107b7578063c4428a89146107e0578063c4d66de8146108095761026c565b806395082d251461063f57806397ac4a251461066a5780639bb92c4e146106a75780639da64ac2146106d0578063a09686c41461070d5761026c565b80635a1e6ca1116101dd5780638952ac1e116101a15780638952ac1e146105215780638a5682991461053d5780638c65c81f146105685780638d52e555146105ae5780638da5cb5b146105d757806391d14854146106025761026c565b80635a1e6ca1146104525780635af6df4c1461047b5780636fed6940146104a4578063715018a6146104e15780637cf30c60146104f85761026c565b80632f2ff15d1161022f5780632f2ff15d1461037c57806336568abe146103a557806342683c67146103ce57806348c54b9d146103f95780634b60ce7714610410578063590e1ae31461043b5761026c565b806301ffc9a71461026e5780631c88705d146102ab578063248a9ca3146102d457806327ac0c581461031157806328f3e6581461033a5761026c565b5b005b34801561027a57600080fd5b5061029560048036038101906102909190613f46565b610a62565b6040516102a29190613f8e565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190614007565b610a74565b005b3480156102e057600080fd5b506102fb60048036038101906102f6919061406a565b610bc4565b60405161030891906140a6565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190614007565b610bf2565b005b34801561034657600080fd5b50610361600480360381019061035c91906140f7565b610c2e565b60405161037396959493929190614155565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e91906141b6565b610cfa565b005b3480156103b157600080fd5b506103cc60048036038101906103c791906141b6565b610d1c565b005b3480156103da57600080fd5b506103e3610d97565b6040516103f091906141f6565b60405180910390f35b34801561040557600080fd5b5061040e610d9d565b005b34801561041c57600080fd5b50610425610e3a565b6040516104329190614211565b60405180910390f35b34801561044757600080fd5b50610450610e60565b005b34801561045e57600080fd5b506104796004803603810190610474919061422c565b611366565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614259565b6114b4565b005b3480156104b057600080fd5b506104cb60048036038101906104c6919061422c565b61178e565b6040516104d891906141f6565b60405180910390f35b3480156104ed57600080fd5b506104f66117a6565b005b34801561050457600080fd5b5061051f600480360381019061051a9190614300565b6117ba565b005b61053b60048036038101906105369190614340565b6118a9565b005b34801561054957600080fd5b506105526120de565b60405161055f91906141f6565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a919061422c565b6120e4565b6040516105a59a99989796959493929190614393565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190614300565b612179565b005b3480156105e357600080fd5b506105ec612268565b6040516105f99190614211565b60405180910390f35b34801561060e57600080fd5b50610629600480360381019061062491906141b6565b6122a0565b6040516106369190613f8e565b60405180910390f35b34801561064b57600080fd5b50610654612319565b60405161066191906141f6565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c919061422c565b612325565b60405161069e9190613f8e565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c99190614300565b61241b565b005b3480156106dc57600080fd5b506106f760048036038101906106f29190614007565b61250a565b60405161070491906141f6565b60405180910390f35b34801561071957600080fd5b50610722612577565b60405161072f91906141f6565b60405180910390f35b34801561074457600080fd5b5061074d612581565b60405161075a91906140a6565b60405180910390f35b34801561076f57600080fd5b5061078a6004803603810190610785919061442f565b612588565b005b34801561079857600080fd5b506107a161288f565b6040516107ae9190614211565b60405180910390f35b3480156107c357600080fd5b506107de60048036038101906107d991906144bc565b612894565b005b3480156107ec57600080fd5b506108076004803603810190610802919061422c565b612b65565b005b34801561081557600080fd5b50610830600480360381019061082b9190614007565b612b72565b005b34801561083e57600080fd5b50610859600480360381019061085491906144bc565b612de9565b005b34801561086757600080fd5b50610882600480360381019061087d91906144bc565b612fc3565b005b34801561089057600080fd5b506108ab60048036038101906108a691906141b6565b61318e565b005b3480156108b957600080fd5b506108d460048036038101906108cf9190614007565b6131b0565b6040516108e29291906144fc565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190614007565b61324c565b604051610920929190614525565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b9190614007565b61327d565b60405161095d91906141f6565b60405180910390f35b34801561097257600080fd5b5061098d600480360381019061098891906140f7565b613295565b60405161099f96959493929190614155565b60405180910390f35b3480156109b457600080fd5b506109cf60048036038101906109ca9190614007565b613318565b005b3480156109dd57600080fd5b506109f860048036038101906109f3919061422c565b61344c565b604051610a0591906141f6565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a309190614007565b613464565b005b348015610a4357600080fd5b50610a4c6134ea565b604051610a5991906140a6565b60405180910390f35b6000610a6d8261350e565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610a9e81613588565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610b23576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d91760405160405180910390a25050565b600080610bcf61359c565b905080600001600084815260200190815260200160002060010154915050919050565b6000801b610bff81613588565b610c297f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929836135c4565b505050565b6000806000806000806000600260008a815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260020160009054906101000a900460ff168360020160019054906101000a900460ff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030154965096509650965096509650509295509295509295565b610d0382610bc4565b610d0c81613588565b610d1683836135c4565b50505050565b610d246136c5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d88576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9282826136cd565b505050565b60085481565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103610e1b576040517f55842fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182610e2a919061457d565b9050610e3681336137cf565b5050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103610ede576040517f55842fea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182610eed919061457d565b90506001600082815260200190815260200160002060050160009054906101000a900460ff16610f49576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600082815260200190815260200160002060050160039054906101000a900460ff16610fa3576040517f089c998700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015403611035576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff161561107e576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff16156110c7576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008260030154905060018360020160016101000a81548160ff021916908315150217905550826000015460036000868152602001908152602001600020600082825461113d919061457d565b9250508190555082600001546008600082825461115a919061457d565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361123e5760003373ffffffffffffffffffffffffffffffffffffffff16826040516111bb906145e2565b60006040518083038185875af1925050503d80600081146111f8576040519150601f19603f3d011682016040523d82523d6000602084013e6111fd565b606091505b5050905080611238576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506112f9565b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b815260040161127b9291906145f7565b6020604051808303816000875af115801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be9190614635565b9050806112f7576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16857f1c26abe6289671e3a9d493647349673af828abb9dbadff1e81762387f7cd99a38460405161135791906141f6565b60405180910390a45050505050565b61136e613b7c565b6001600082815260200190815260200160002060050160009054906101000a900460ff166113c8576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600082815260200190815260200160002060050160019054906101000a900460ff1615611423576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180600083815260200190815260200160002060050160016101000a81548160ff021916908315150217905550807fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad57600360008481526020019081526020016000205460046000858152602001908152602001600020546040516114a99291906144fc565b60405180910390a250565b6114bc613b7c565b428510156114f6576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84841161152f576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303611569576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036115a3576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008114806115b157508281115b156115e8576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060075490506040518061014001604052808781526020018681526020018581526020018481526020018381526020016001151581526020016000151581526020016000151581526020016000151581526020016001151581525060016000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff0219169083151502179055506101208201518160050160046101000a81548160ff0219169083151502179055509050506007600081548092919061174190614662565b9190505550807f21fb045299ceafb7a136c74ee07b22d481ee9bf37a85b2d8f20c59f83ada4133878787878760405161177e9594939291906146aa565b60405180910390a2505050505050565b60046020528060005260406000206000915090505481565b6117ae613b7c565b6117b86000613c03565b565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296117e481613588565b6001600084815260200190815260200160002060050160009054906101000a900460ff1661183e576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160036101000a81548160ff021916908315150217905550827f653b56ea3ea7dfba44234dbc807bac97a2a0adafb6d22427d818250375f1e9118360405161189c9190613f8e565b60405180910390a2505050565b6118b283612325565b6118e8576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1661196d576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119e457600034036119dc576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050611a22565b60008203611a1e576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8190505b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114158015611a835750600185611a7f91906146fd565b8114155b15611ae3576001600086815260200190815260200160002060050160049054906101000a900460ff16611ae2576040517f827a86b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000670de0b6b3a76400008285611b409190614731565b611b4a91906147a2565b905060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000828260000154611bb291906146fd565b9050600160008a815260200190815260200160002060040154811115611c04576040517f1cd861cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600360008c815260200190815260200160002054611c2591906146fd565b9050600160008b815260200190815260200160002060020154811115611c77576040517f397bb34300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614611d685760008973ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401611cea939291906147d3565b6020604051808303816000875af1158015611d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2d9190614635565b905080611d66576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6000600160008c815260200190815260200160002060020154600160008d81526020019081526020016000206003015486611da39190614731565b611dad91906147a2565b90506000846000015403611e8557600460008c81526020019081526020016000206000815480929190611ddf90614662565b919050555060018b611df191906146fd565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550898460020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878460030181905550611f2f565b8973ffffffffffffffffffffffffffffffffffffffff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611efc5787846003016000828254611ef091906146fd565b92505081905550611f2e565b6040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b84846000016000828254611f4391906146fd565b9250508190555080846001016000828254611f5e91906146fd565b9250508190555084600360008d81526020019081526020016000206000828254611f8891906146fd565b925050819055508460086000828254611fa191906146fd565b92505081905550600160008c815260200190815260200160002060020154600360008d815260200190815260200160002054106120675760018060008d815260200190815260200160002060050160016101000a81548160ff0219169083151502179055508a7fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad57600360008e815260200190815260200160002054600460008f81526020019081526020016000205460405161205e9291906144fc565b60405180910390a25b8973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168c7fb479ec976a9860505652c0d9f5dc15bc5fbca1a55c3da9cabe662f1b6f8090d28b89866040516120c99392919061480a565b60405180910390a45050505050505050505050565b60075481565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900460ff16908060050160049054906101000a900460ff1690508a565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296121a381613588565b6001600084815260200190815260200160002060050160009054906101000a900460ff166121fd576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160046101000a81548160ff021916908315150217905550827f1c1c03453d1eefaa85a62e371adba496bc16fa6320bf5416b0af1249081ca84c8360405161225b9190613f8e565b60405180910390a2505050565b600080612273613cda565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b6000806122ab61359c565b905080600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b670de0b6b3a764000081565b60006001600083815260200190815260200160002060050160009054906101000a900460ff166123585760009050612416565b6001600083815260200190815260200160002060050160019054906101000a900460ff161561238a5760009050612416565b60016000838152602001908152602001600020600001544210156123b15760009050612416565b60016000838152602001908152602001600020600101544211156123d85760009050612416565b60016000838152602001908152602001600020600201546003600084815260200190815260200160002054106124115760009050612416565b600190505b919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961244581613588565b6001600084815260200190815260200160002060050160009054906101000a900460ff1661249f576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160026101000a81548160ff021916908315150217905550827f74c19978ee48fa394fffde7cccc94793539daf917f2a8fd2d5e851409de3f7a0836040516124fd9190613f8e565b60405180910390a2505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008103612561576000915050612572565b60018161256e919061457d565b9150505b919050565b6000600754905090565b6000801b81565b612590613b7c565b6001600087815260200190815260200160002060050160009054906101000a900460ff166125ea576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600087815260200190815260200160002060050160019054906101000a900460ff1615612645576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016000878152602001908152602001600020600001544210612694576040517f4eb5402b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b428510156126ce576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848411612707576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612741576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361277b576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081148061278957508281115b156127c0576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600088815260200190815260200160002060000181905550836001600088815260200190815260200160002060010181905550826001600088815260200190815260200160002060020181905550816001600088815260200190815260200160002060030181905550806001600088815260200190815260200160002060040181905550857fe35865500052be0ea409d44d56e7f66a0e0728bab40a71f941ccd691b9159596868686868660405161287f9594939291906146aa565b60405180910390a2505050505050565b600081565b61289c613b7c565b600081036128d6576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129ed5747811115612944576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161296a906145e2565b60006040518083038185875af1925050503d80600081146129a7576040519150601f19603f3d011682016040523d82523d6000602084013e6129ac565b606091505b50509050806129e7576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612b61565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a289190614211565b602060405180830381865afa158015612a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a699190614856565b905080821115612aa5576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401612ae29291906145f7565b6020604051808303816000875af1158015612b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b259190614635565b905080612b5e576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505b5050565b612b6f81336137cf565b50565b6000612b7c613d02565b905060008160000160089054906101000a900460ff1615905060008260000160009054906101000a900467ffffffffffffffff1690506000808267ffffffffffffffff16148015612bca5750825b9050600060018367ffffffffffffffff16148015612bff575060003073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015612c0d575080155b15612c44576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018560000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315612c945760018560000160086101000a81548160ff0219169083151502179055505b612c9d33613d2a565b612ca5613d3e565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612d0b576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612d596000801b336135c4565b50612d847f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336135c4565b508315612de15760008560000160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051612dd891906148dc565b60405180910390a15b505050505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612e1381613588565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612e7c5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612eb3576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612eed576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060400160405280600115158152602001838152506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101559050508273ffffffffffffffffffffffffffffffffffffffff167fe184914670d9e097e90729e2a9159866b30b1203952f0586bedca1d6fcf130a883604051612fb691906141f6565b60405180910390a2505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612fed81613588565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16613072576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036130ac576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508373ffffffffffffffffffffffffffffffffffffffff167f62e2c9c75b287778c0b58f1c1d83fa8f9978a33848e0b423735fd44f48ebe3c182856040516131809291906144fc565b60405180910390a250505050565b61319782610bc4565b6131a081613588565b6131aa83836136cd565b50505050565b60008060005b6007548110156132465760006002600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001548461322491906146fd565b935080600101548361323691906146fd565b92505080806001019150506131b6565b50915091565b60006020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154905082565b60056020528060005260406000206000915090505481565b6002602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16908060020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905086565b613320613b7c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613386576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f38b700f64059658d3f95b87d8db51f669197c89da3076d26d42bb8fb06159fa960405160405180910390a35050565b60036020528060005260406000206000915090505481565b61346c613b7c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036134de5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016134d59190614211565b60405180910390fd5b6134e781613c03565b50565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613581575061358082613d48565b5b9050919050565b613599816135946136c5565b613db2565b50565b60007f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b6000806135cf61359c565b90506135db84846122a0565b6136b957600181600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506136556136c5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506136bf565b60009150505b92915050565b600033905090565b6000806136d861359c565b90506136e484846122a0565b156137c357600081600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061375f6136c5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506137c9565b60009150505b92915050565b6001600083815260200190815260200160002060050160009054906101000a900460ff16613829576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160019054906101000a900460ff16158015613870575060016000838152602001908152602001600020600101544211155b156138a7576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160029054906101000a900460ff16613901576040517fe2c858ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015403613993576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16156139dc576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff1615613a25576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160010154905060018260020160006101000a81548160ff0219169083151502179055506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401613aaa9291906145f7565b6020604051808303816000875af1158015613ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aed9190614635565b905080613b26576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16857f880f2ef2613b092f1a0a819f294155c98667eb294b7e6bf7a3810278142c1a1c84604051613b6d91906141f6565b60405180910390a35050505050565b613b846136c5565b73ffffffffffffffffffffffffffffffffffffffff16613ba2612268565b73ffffffffffffffffffffffffffffffffffffffff1614613c0157613bc56136c5565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401613bf89190614211565b60405180910390fd5b565b6000613c0d613cda565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60007f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b613d32613e03565b613d3b81613e43565b50565b613d46613e03565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613dbc82826122a0565b613dff5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401613df69291906148f7565b60405180910390fd5b5050565b613e0b613ec9565b613e41576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b613e4b613e03565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613ebd5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401613eb49190614211565b60405180910390fd5b613ec681613c03565b50565b6000613ed3613d02565b60000160089054906101000a900460ff16905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f2381613eee565b8114613f2e57600080fd5b50565b600081359050613f4081613f1a565b92915050565b600060208284031215613f5c57613f5b613ee9565b5b6000613f6a84828501613f31565b91505092915050565b60008115159050919050565b613f8881613f73565b82525050565b6000602082019050613fa36000830184613f7f565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fd482613fa9565b9050919050565b613fe481613fc9565b8114613fef57600080fd5b50565b60008135905061400181613fdb565b92915050565b60006020828403121561401d5761401c613ee9565b5b600061402b84828501613ff2565b91505092915050565b6000819050919050565b61404781614034565b811461405257600080fd5b50565b6000813590506140648161403e565b92915050565b6000602082840312156140805761407f613ee9565b5b600061408e84828501614055565b91505092915050565b6140a081614034565b82525050565b60006020820190506140bb6000830184614097565b92915050565b6000819050919050565b6140d4816140c1565b81146140df57600080fd5b50565b6000813590506140f1816140cb565b92915050565b6000806040838503121561410e5761410d613ee9565b5b600061411c858286016140e2565b925050602061412d85828601613ff2565b9150509250929050565b614140816140c1565b82525050565b61414f81613fc9565b82525050565b600060c08201905061416a6000830189614137565b6141776020830188614137565b6141846040830187613f7f565b6141916060830186613f7f565b61419e6080830185614146565b6141ab60a0830184614137565b979650505050505050565b600080604083850312156141cd576141cc613ee9565b5b60006141db85828601614055565b92505060206141ec85828601613ff2565b9150509250929050565b600060208201905061420b6000830184614137565b92915050565b60006020820190506142266000830184614146565b92915050565b60006020828403121561424257614241613ee9565b5b6000614250848285016140e2565b91505092915050565b600080600080600060a0868803121561427557614274613ee9565b5b6000614283888289016140e2565b9550506020614294888289016140e2565b94505060406142a5888289016140e2565b93505060606142b6888289016140e2565b92505060806142c7888289016140e2565b9150509295509295909350565b6142dd81613f73565b81146142e857600080fd5b50565b6000813590506142fa816142d4565b92915050565b6000806040838503121561431757614316613ee9565b5b6000614325858286016140e2565b9250506020614336858286016142eb565b9150509250929050565b60008060006060848603121561435957614358613ee9565b5b6000614367868287016140e2565b935050602061437886828701613ff2565b9250506040614389868287016140e2565b9150509250925092565b6000610140820190506143a9600083018d614137565b6143b6602083018c614137565b6143c3604083018b614137565b6143d0606083018a614137565b6143dd6080830189614137565b6143ea60a0830188613f7f565b6143f760c0830187613f7f565b61440460e0830186613f7f565b614412610100830185613f7f565b614420610120830184613f7f565b9b9a5050505050505050505050565b60008060008060008060c0878903121561444c5761444b613ee9565b5b600061445a89828a016140e2565b965050602061446b89828a016140e2565b955050604061447c89828a016140e2565b945050606061448d89828a016140e2565b935050608061449e89828a016140e2565b92505060a06144af89828a016140e2565b9150509295509295509295565b600080604083850312156144d3576144d2613ee9565b5b60006144e185828601613ff2565b92505060206144f2858286016140e2565b9150509250929050565b60006040820190506145116000830185614137565b61451e6020830184614137565b9392505050565b600060408201905061453a6000830185613f7f565b6145476020830184614137565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614588826140c1565b9150614593836140c1565b92508282039050818111156145ab576145aa61454e565b5b92915050565b600081905092915050565b50565b60006145cc6000836145b1565b91506145d7826145bc565b600082019050919050565b60006145ed826145bf565b9150819050919050565b600060408201905061460c6000830185614146565b6146196020830184614137565b9392505050565b60008151905061462f816142d4565b92915050565b60006020828403121561464b5761464a613ee9565b5b600061465984828501614620565b91505092915050565b600061466d826140c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361469f5761469e61454e565b5b600182019050919050565b600060a0820190506146bf6000830188614137565b6146cc6020830187614137565b6146d96040830186614137565b6146e66060830185614137565b6146f36080830184614137565b9695505050505050565b6000614708826140c1565b9150614713836140c1565b925082820190508082111561472b5761472a61454e565b5b92915050565b600061473c826140c1565b9150614747836140c1565b9250828202614755816140c1565b9150828204841483151761476c5761476b61454e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147ad826140c1565b91506147b8836140c1565b9250826147c8576147c7614773565b5b828204905092915050565b60006060820190506147e86000830186614146565b6147f56020830185614146565b6148026040830184614137565b949350505050565b600060608201905061481f6000830186614137565b61482c6020830185614137565b6148396040830184614137565b949350505050565b600081519050614850816140cb565b92915050565b60006020828403121561486c5761486b613ee9565b5b600061487a84828501614841565b91505092915050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000819050919050565b60006148c66148c16148bc84614883565b6148a1565b61488d565b9050919050565b6148d6816148ab565b82525050565b60006020820190506148f160008301846148cd565b92915050565b600060408201905061490c6000830185614146565b6149196020830184614097565b939250505056fea264697066735822122067cd1a53a4406a4ff96e0d045d7336688804c5331559439b9cb78198671d878264736f6c634300081c0033",
1545
+ "bytecode": "0x608060405234801561001057600080fd5b5061001f61002460201b60201c565b61018e565b600061003461012860201b60201c565b90508060000160089054906101000a900460ff161561007f576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff80168160000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16146101255767ffffffffffffffff8160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff60405161011c9190610173565b60405180910390a15b50565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b600067ffffffffffffffff82169050919050565b61016d81610150565b82525050565b60006020820190506101886000830184610164565b92915050565b614c2c8061019d6000396000f3fe6080604052600436106102765760003560e01c806397ac4a251161014f578063d4bcdfa1116100c1578063ed54890d1161007a578063ed54890d14610995578063efe9c9e2146109d7578063f0a3a97c14610a00578063f0e1bb3e14610a2b578063f2fde38b14610a68578063f5b541a614610a9157610277565b8063d4bcdfa114610861578063d4ee651b1461088a578063d547741f146108b3578063d871b0e3146108dc578063daf9c2101461091a578063eb4c9e9b1461095857610277565b8063a6be83dd11610113578063a6be83dd14610769578063a734f06e14610792578063c1075329146107bd578063c213df78146107e6578063c4428a891461080f578063c4d66de81461083857610277565b806397ac4a25146106705780639bb92c4e146106ad5780639da64ac2146106d6578063a09686c414610713578063a217fddf1461073e57610277565b80636fed6940116101e85780638a568299116101ac5780638a568299146105435780638c65c81f1461056e5780638d52e555146105b45780638da5cb5b146105dd57806391d148541461060857806395082d251461064557610277565b80636fed694014610481578063715018a6146104be5780637ad226dc146104d55780637cf30c60146104fe5780638952ac1e1461052757610277565b80632f2ff15d1161023a5780632f2ff15d1461038757806336568abe146103b057806342683c67146103d95780634b60ce77146104045780635a1e6ca11461042f5780635af6df4c1461045857610277565b806301ffc9a7146102795780631c88705d146102b6578063248a9ca3146102df57806327ac0c581461031c57806328f3e6581461034557610277565b5b005b34801561028557600080fd5b506102a0600480360381019061029b919061421c565b610abc565b6040516102ad9190614264565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906142dd565b610ace565b005b3480156102eb57600080fd5b5061030660048036038101906103019190614340565b610c1e565b604051610313919061437c565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e91906142dd565b610c4c565b005b34801561035157600080fd5b5061036c600480360381019061036791906143cd565b610c88565b60405161037e9695949392919061442b565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a9919061448c565b610d54565b005b3480156103bc57600080fd5b506103d760048036038101906103d2919061448c565b610d76565b005b3480156103e557600080fd5b506103ee610df1565b6040516103fb91906144cc565b60405180910390f35b34801561041057600080fd5b50610419610df7565b60405161042691906144e7565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190614502565b610e1d565b005b34801561046457600080fd5b5061047f600480360381019061047a919061452f565b610f8e565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614502565b61128b565b6040516104b591906144cc565b60405180910390f35b3480156104ca57600080fd5b506104d36112a3565b005b3480156104e157600080fd5b506104fc60048036038101906104f791906143cd565b6112b7565b005b34801561050a57600080fd5b50610525600480360381019061052091906145d6565b6118ec565b005b610541600480360381019061053c9190614616565b6119db565b005b34801561054f57600080fd5b50610558612210565b60405161056591906144cc565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190614502565b612216565b6040516105ab9a99989796959493929190614669565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d691906145d6565b6122ab565b005b3480156105e957600080fd5b506105f261239a565b6040516105ff91906144e7565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061448c565b6123d2565b60405161063c9190614264565b60405180910390f35b34801561065157600080fd5b5061065a61244b565b60405161066791906144cc565b60405180910390f35b34801561067c57600080fd5b5061069760048036038101906106929190614502565b612457565b6040516106a49190614264565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf91906145d6565b61254d565b005b3480156106e257600080fd5b506106fd60048036038101906106f891906142dd565b61263c565b60405161070a91906144cc565b60405180910390f35b34801561071f57600080fd5b506107286126a9565b60405161073591906144cc565b60405180910390f35b34801561074a57600080fd5b506107536126b3565b604051610760919061437c565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190614705565b6126ba565b005b34801561079e57600080fd5b506107a76129e4565b6040516107b491906144e7565b60405180910390f35b3480156107c957600080fd5b506107e460048036038101906107df9190614792565b6129e9565b005b3480156107f257600080fd5b5061080d600480360381019061080891906142dd565b612cdd565b005b34801561081b57600080fd5b5061083660048036038101906108319190614502565b612d19565b005b34801561084457600080fd5b5061085f600480360381019061085a91906142dd565b612d26565b005b34801561086d57600080fd5b5061088860048036038101906108839190614792565b612f9d565b005b34801561089657600080fd5b506108b160048036038101906108ac9190614792565b613177565b005b3480156108bf57600080fd5b506108da60048036038101906108d5919061448c565b613342565b005b3480156108e857600080fd5b5061090360048036038101906108fe91906142dd565b613364565b6040516109119291906147d2565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c91906142dd565b613400565b60405161094f9291906147fb565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a91906142dd565b613431565b60405161098c91906144cc565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906143cd565b613449565b6040516109ce9695949392919061442b565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f991906142dd565b6134cc565b005b348015610a0c57600080fd5b50610a15613623565b604051610a22919061437c565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d9190614502565b613647565b604051610a5f91906144cc565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a91906142dd565b61365f565b005b348015610a9d57600080fd5b50610aa66136e5565b604051610ab3919061437c565b60405180910390f35b6000610ac782613709565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610af881613783565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610b7d576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d91760405160405180910390a25050565b600080610c29613797565b905080600001600084815260200190815260200160002060010154915050919050565b6000801b610c5981613783565b610c837f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929836137bf565b505050565b6000806000806000806000600260008a815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260020160009054906101000a900460ff168360020160019054906101000a900460ff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030154965096509650965096509650509295509295509295565b610d5d82610c1e565b610d6681613783565b610d7083836137bf565b50505050565b610d7e6138c0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dec82826138c8565b505050565b60085481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610e4781613783565b6001600083815260200190815260200160002060050160009054906101000a900460ff16610ea1576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160019054906101000a900460ff1615610efc576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180600084815260200190815260200160002060050160016101000a81548160ff021916908315150217905550817fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad5760036000858152602001908152602001600020546004600086815260200190815260200160002054604051610f829291906147d2565b60405180910390a25050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610fb881613783565b42861015610ff2576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85851161102b576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403611065576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361109f576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214806110ad57508382115b156110e4576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060075490506040518061014001604052808881526020018781526020018681526020018581526020018481526020016001151581526020016000151581526020016000151581526020016000151581526020016001151581525060016000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff0219169083151502179055506101208201518160050160046101000a81548160ff0219169083151502179055509050506007600081548092919061123d90614853565b9190505550807f21fb045299ceafb7a136c74ee07b22d481ee9bf37a85b2d8f20c59f83ada4133888888888860405161127a95949392919061489b565b60405180910390a250505050505050565b60046020528060005260406000206000915090505481565b6112ab6139ca565b6112b56000613a51565b565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296112e181613783565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611347576040517f702b3d9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600084815260200190815260200160002060050160009054906101000a900460ff166113a1576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600084815260200190815260200160002060050160039054906101000a900460ff166113fb576040517f089c998700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001540361148d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16156114d6576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff161561151f576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600082600301549050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c457478111156115bf576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167e565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115ff91906144e7565b602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116409190614903565b90508082111561167c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60018360020160016101000a81548160ff02191690831515021790555082600001546003600088815260200190815260200160002060008282546116c29190614930565b925050819055508260000154600860008282546116df9190614930565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c35760008573ffffffffffffffffffffffffffffffffffffffff168260405161174090614995565b60006040518083038185875af1925050503d806000811461177d576040519150601f19603f3d011682016040523d82523d6000602084013e611782565b606091505b50509050806117bd576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061187e565b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87846040518363ffffffff1660e01b81526004016118009291906149aa565b6020604051808303816000875af115801561181f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184391906149e8565b90508061187c576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b8173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16877f1c26abe6289671e3a9d493647349673af828abb9dbadff1e81762387f7cd99a3846040516118dc91906144cc565b60405180910390a4505050505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961191681613783565b6001600084815260200190815260200160002060050160009054906101000a900460ff16611970576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160036101000a81548160ff021916908315150217905550827f653b56ea3ea7dfba44234dbc807bac97a2a0adafb6d22427d818250375f1e911836040516119ce9190614264565b60405180910390a2505050565b6119e483612457565b611a1a576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16611a9f576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b165760003403611b0e576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050611b54565b60008203611b50576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8190505b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114158015611bb55750600185611bb19190614a15565b8114155b15611c15576001600086815260200190815260200160002060050160049054906101000a900460ff16611c14576040517f827a86b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000670de0b6b3a76400008285611c729190614a49565b611c7c9190614aba565b905060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000828260000154611ce49190614a15565b9050600160008a815260200190815260200160002060040154811115611d36576040517f1cd861cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600360008c815260200190815260200160002054611d579190614a15565b9050600160008b815260200190815260200160002060020154811115611da9576040517f397bb34300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614611e9a5760008973ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401611e1c93929190614aeb565b6020604051808303816000875af1158015611e3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5f91906149e8565b905080611e98576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6000600160008c815260200190815260200160002060020154600160008d81526020019081526020016000206003015486611ed59190614a49565b611edf9190614aba565b90506000846000015403611fb757600460008c81526020019081526020016000206000815480929190611f1190614853565b919050555060018b611f239190614a15565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550898460020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878460030181905550612061565b8973ffffffffffffffffffffffffffffffffffffffff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361202e57878460030160008282546120229190614a15565b92505081905550612060565b6040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b848460000160008282546120759190614a15565b92505081905550808460010160008282546120909190614a15565b9250508190555084600360008d815260200190815260200160002060008282546120ba9190614a15565b9250508190555084600860008282546120d39190614a15565b92505081905550600160008c815260200190815260200160002060020154600360008d815260200190815260200160002054106121995760018060008d815260200190815260200160002060050160016101000a81548160ff0219169083151502179055508a7fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad57600360008e815260200190815260200160002054600460008f8152602001908152602001600020546040516121909291906147d2565b60405180910390a25b8973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168c7fb479ec976a9860505652c0d9f5dc15bc5fbca1a55c3da9cabe662f1b6f8090d28b89866040516121fb93929190614b22565b60405180910390a45050505050505050505050565b60075481565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900460ff16908060050160049054906101000a900460ff1690508a565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296122d581613783565b6001600084815260200190815260200160002060050160009054906101000a900460ff1661232f576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160046101000a81548160ff021916908315150217905550827f1c1c03453d1eefaa85a62e371adba496bc16fa6320bf5416b0af1249081ca84c8360405161238d9190614264565b60405180910390a2505050565b6000806123a5613b28565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b6000806123dd613797565b905080600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b670de0b6b3a764000081565b60006001600083815260200190815260200160002060050160009054906101000a900460ff1661248a5760009050612548565b6001600083815260200190815260200160002060050160019054906101000a900460ff16156124bc5760009050612548565b60016000838152602001908152602001600020600001544210156124e35760009050612548565b600160008381526020019081526020016000206001015442111561250a5760009050612548565b60016000838152602001908152602001600020600201546003600084815260200190815260200160002054106125435760009050612548565b600190505b919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961257781613783565b6001600084815260200190815260200160002060050160009054906101000a900460ff166125d1576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160026101000a81548160ff021916908315150217905550827f74c19978ee48fa394fffde7cccc94793539daf917f2a8fd2d5e851409de3f7a08360405161262f9190614264565b60405180910390a2505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081036126935760009150506126a4565b6001816126a09190614930565b9150505b919050565b6000600754905090565b6000801b81565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296126e481613783565b6001600088815260200190815260200160002060050160009054906101000a900460ff1661273e576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600088815260200190815260200160002060050160019054906101000a900460ff1615612799576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008881526020019081526020016000206000015442106127e8576040517f4eb5402b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42861015612822576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85851161285b576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612895576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036128cf576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214806128dd57508382115b15612914576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b856001600089815260200190815260200160002060000181905550846001600089815260200190815260200160002060010181905550836001600089815260200190815260200160002060020181905550826001600089815260200190815260200160002060030181905550816001600089815260200190815260200160002060040181905550867fe35865500052be0ea409d44d56e7f66a0e0728bab40a71f941ccd691b915959687878787876040516129d395949392919061489b565b60405180910390a250505050505050565b600081565b7f3496e2e73c4d42b75d702e60d9e48102720b8691234415963a5a857b86425d07612a1381613783565b60008203612a4d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b645747821115612abb576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1683604051612ae190614995565b60006040518083038185875af1925050503d8060008114612b1e576040519150601f19603f3d011682016040523d82523d6000602084013e612b23565b606091505b5050905080612b5e576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612cd8565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b9f91906144e7565b602060405180830381865afa158015612bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be09190614903565b905080831115612c1c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401612c599291906149aa565b6020604051808303816000875af1158015612c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9c91906149e8565b905080612cd5576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505b505050565b6000801b612cea81613783565b612d147f3496e2e73c4d42b75d702e60d9e48102720b8691234415963a5a857b86425d07836137bf565b505050565b612d238133613b50565b50565b6000612d30613fd8565b905060008160000160089054906101000a900460ff1615905060008260000160009054906101000a900467ffffffffffffffff1690506000808267ffffffffffffffff16148015612d7e5750825b9050600060018367ffffffffffffffff16148015612db3575060003073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015612dc1575080155b15612df8576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018560000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315612e485760018560000160086101000a81548160ff0219169083151502179055505b612e5133614000565b612e59614014565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612ebf576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612f0d6000801b336137bf565b50612f387f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336137bf565b508315612f955760008560000160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051612f8c9190614bb2565b60405180910390a15b505050505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612fc781613783565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156130305750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15613067576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036130a1576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060400160405280600115158152602001838152506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101559050508273ffffffffffffffffffffffffffffffffffffffff167fe184914670d9e097e90729e2a9159866b30b1203952f0586bedca1d6fcf130a88360405161316a91906144cc565b60405180910390a2505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296131a181613783565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16613226576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613260576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508373ffffffffffffffffffffffffffffffffffffffff167f62e2c9c75b287778c0b58f1c1d83fa8f9978a33848e0b423735fd44f48ebe3c182856040516133349291906147d2565b60405180910390a250505050565b61334b82610c1e565b61335481613783565b61335e83836138c8565b50505050565b60008060005b6007548110156133fa5760006002600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000154846133d89190614a15565b93508060010154836133ea9190614a15565b925050808060010191505061336a565b50915091565b60006020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154905082565b60056020528060005260406000206000915090505481565b6002602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16908060020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905086565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296134f681613783565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361355c576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f38b700f64059658d3f95b87d8db51f669197c89da3076d26d42bb8fb06159fa960405160405180910390a3505050565b7f3496e2e73c4d42b75d702e60d9e48102720b8691234415963a5a857b86425d0781565b60036020528060005260406000206000915090505481565b6136676139ca565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036136d95760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016136d091906144e7565b60405180910390fd5b6136e281613a51565b50565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061377c575061377b8261401e565b5b9050919050565b6137948161378f6138c0565b614088565b50565b60007f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b6000806137ca613797565b90506137d684846123d2565b6138b457600181600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506138506138c0565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506138ba565b60009150505b92915050565b600033905090565b6000806138d3613797565b90506138df84846123d2565b156139be57600081600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061395a6138c0565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506139c4565b60009150505b92915050565b6139d26138c0565b73ffffffffffffffffffffffffffffffffffffffff166139f061239a565b73ffffffffffffffffffffffffffffffffffffffff1614613a4f57613a136138c0565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401613a4691906144e7565b60405180910390fd5b565b6000613a5b613b28565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60007f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b6001600083815260200190815260200160002060050160009054906101000a900460ff16613baa576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160019054906101000a900460ff16158015613bf1575060016000838152602001908152602001600020600101544211155b15613c28576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160029054906101000a900460ff16613c82576040517fe2c858ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015403613d14576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff1615613d5d576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff1615613da6576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001015490506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e0c91906144e7565b602060405180830381865afa158015613e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e4d9190614903565b905080821115613e89576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018360020160006101000a81548160ff0219169083151502179055506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86856040518363ffffffff1660e01b8152600401613f059291906149aa565b6020604051808303816000875af1158015613f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4891906149e8565b905080613f81576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16867f880f2ef2613b092f1a0a819f294155c98667eb294b7e6bf7a3810278142c1a1c85604051613fc891906144cc565b60405180910390a3505050505050565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6140086140d9565b61401181614119565b50565b61401c6140d9565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61409282826123d2565b6140d55780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016140cc929190614bcd565b60405180910390fd5b5050565b6140e161419f565b614117576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6141216140d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036141935760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161418a91906144e7565b60405180910390fd5b61419c81613a51565b50565b60006141a9613fd8565b60000160089054906101000a900460ff16905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141f9816141c4565b811461420457600080fd5b50565b600081359050614216816141f0565b92915050565b600060208284031215614232576142316141bf565b5b600061424084828501614207565b91505092915050565b60008115159050919050565b61425e81614249565b82525050565b60006020820190506142796000830184614255565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006142aa8261427f565b9050919050565b6142ba8161429f565b81146142c557600080fd5b50565b6000813590506142d7816142b1565b92915050565b6000602082840312156142f3576142f26141bf565b5b6000614301848285016142c8565b91505092915050565b6000819050919050565b61431d8161430a565b811461432857600080fd5b50565b60008135905061433a81614314565b92915050565b600060208284031215614356576143556141bf565b5b60006143648482850161432b565b91505092915050565b6143768161430a565b82525050565b6000602082019050614391600083018461436d565b92915050565b6000819050919050565b6143aa81614397565b81146143b557600080fd5b50565b6000813590506143c7816143a1565b92915050565b600080604083850312156143e4576143e36141bf565b5b60006143f2858286016143b8565b9250506020614403858286016142c8565b9150509250929050565b61441681614397565b82525050565b6144258161429f565b82525050565b600060c082019050614440600083018961440d565b61444d602083018861440d565b61445a6040830187614255565b6144676060830186614255565b614474608083018561441c565b61448160a083018461440d565b979650505050505050565b600080604083850312156144a3576144a26141bf565b5b60006144b18582860161432b565b92505060206144c2858286016142c8565b9150509250929050565b60006020820190506144e1600083018461440d565b92915050565b60006020820190506144fc600083018461441c565b92915050565b600060208284031215614518576145176141bf565b5b6000614526848285016143b8565b91505092915050565b600080600080600060a0868803121561454b5761454a6141bf565b5b6000614559888289016143b8565b955050602061456a888289016143b8565b945050604061457b888289016143b8565b935050606061458c888289016143b8565b925050608061459d888289016143b8565b9150509295509295909350565b6145b381614249565b81146145be57600080fd5b50565b6000813590506145d0816145aa565b92915050565b600080604083850312156145ed576145ec6141bf565b5b60006145fb858286016143b8565b925050602061460c858286016145c1565b9150509250929050565b60008060006060848603121561462f5761462e6141bf565b5b600061463d868287016143b8565b935050602061464e868287016142c8565b925050604061465f868287016143b8565b9150509250925092565b60006101408201905061467f600083018d61440d565b61468c602083018c61440d565b614699604083018b61440d565b6146a6606083018a61440d565b6146b3608083018961440d565b6146c060a0830188614255565b6146cd60c0830187614255565b6146da60e0830186614255565b6146e8610100830185614255565b6146f6610120830184614255565b9b9a5050505050505050505050565b60008060008060008060c08789031215614722576147216141bf565b5b600061473089828a016143b8565b965050602061474189828a016143b8565b955050604061475289828a016143b8565b945050606061476389828a016143b8565b935050608061477489828a016143b8565b92505060a061478589828a016143b8565b9150509295509295509295565b600080604083850312156147a9576147a86141bf565b5b60006147b7858286016142c8565b92505060206147c8858286016143b8565b9150509250929050565b60006040820190506147e7600083018561440d565b6147f4602083018461440d565b9392505050565b60006040820190506148106000830185614255565b61481d602083018461440d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061485e82614397565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148905761488f614824565b5b600182019050919050565b600060a0820190506148b0600083018861440d565b6148bd602083018761440d565b6148ca604083018661440d565b6148d7606083018561440d565b6148e4608083018461440d565b9695505050505050565b6000815190506148fd816143a1565b92915050565b600060208284031215614919576149186141bf565b5b6000614927848285016148ee565b91505092915050565b600061493b82614397565b915061494683614397565b925082820390508181111561495e5761495d614824565b5b92915050565b600081905092915050565b50565b600061497f600083614964565b915061498a8261496f565b600082019050919050565b60006149a082614972565b9150819050919050565b60006040820190506149bf600083018561441c565b6149cc602083018461440d565b9392505050565b6000815190506149e2816145aa565b92915050565b6000602082840312156149fe576149fd6141bf565b5b6000614a0c848285016149d3565b91505092915050565b6000614a2082614397565b9150614a2b83614397565b9250828201905080821115614a4357614a42614824565b5b92915050565b6000614a5482614397565b9150614a5f83614397565b9250828202614a6d81614397565b91508282048414831517614a8457614a83614824565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ac582614397565b9150614ad083614397565b925082614ae057614adf614a8b565b5b828204905092915050565b6000606082019050614b00600083018661441c565b614b0d602083018561441c565b614b1a604083018461440d565b949350505050565b6000606082019050614b37600083018661440d565b614b44602083018561440d565b614b51604083018461440d565b949350505050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000819050919050565b6000614b9c614b97614b9284614b59565b614b77565b614b63565b9050919050565b614bac81614b81565b82525050565b6000602082019050614bc76000830184614ba3565b92915050565b6000604082019050614be2600083018561441c565b614bef602083018461436d565b939250505056fea2646970667358221220b62a2df386c339c73773cfd5bbae2ef8b1fe4e98c7b355111b802fd05e87f97e64736f6c634300081c0033",
1546
+ "deployedBytecode": "0x6080604052600436106102765760003560e01c806397ac4a251161014f578063d4bcdfa1116100c1578063ed54890d1161007a578063ed54890d14610995578063efe9c9e2146109d7578063f0a3a97c14610a00578063f0e1bb3e14610a2b578063f2fde38b14610a68578063f5b541a614610a9157610277565b8063d4bcdfa114610861578063d4ee651b1461088a578063d547741f146108b3578063d871b0e3146108dc578063daf9c2101461091a578063eb4c9e9b1461095857610277565b8063a6be83dd11610113578063a6be83dd14610769578063a734f06e14610792578063c1075329146107bd578063c213df78146107e6578063c4428a891461080f578063c4d66de81461083857610277565b806397ac4a25146106705780639bb92c4e146106ad5780639da64ac2146106d6578063a09686c414610713578063a217fddf1461073e57610277565b80636fed6940116101e85780638a568299116101ac5780638a568299146105435780638c65c81f1461056e5780638d52e555146105b45780638da5cb5b146105dd57806391d148541461060857806395082d251461064557610277565b80636fed694014610481578063715018a6146104be5780637ad226dc146104d55780637cf30c60146104fe5780638952ac1e1461052757610277565b80632f2ff15d1161023a5780632f2ff15d1461038757806336568abe146103b057806342683c67146103d95780634b60ce77146104045780635a1e6ca11461042f5780635af6df4c1461045857610277565b806301ffc9a7146102795780631c88705d146102b6578063248a9ca3146102df57806327ac0c581461031c57806328f3e6581461034557610277565b5b005b34801561028557600080fd5b506102a0600480360381019061029b919061421c565b610abc565b6040516102ad9190614264565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d891906142dd565b610ace565b005b3480156102eb57600080fd5b5061030660048036038101906103019190614340565b610c1e565b604051610313919061437c565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e91906142dd565b610c4c565b005b34801561035157600080fd5b5061036c600480360381019061036791906143cd565b610c88565b60405161037e9695949392919061442b565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a9919061448c565b610d54565b005b3480156103bc57600080fd5b506103d760048036038101906103d2919061448c565b610d76565b005b3480156103e557600080fd5b506103ee610df1565b6040516103fb91906144cc565b60405180910390f35b34801561041057600080fd5b50610419610df7565b60405161042691906144e7565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190614502565b610e1d565b005b34801561046457600080fd5b5061047f600480360381019061047a919061452f565b610f8e565b005b34801561048d57600080fd5b506104a860048036038101906104a39190614502565b61128b565b6040516104b591906144cc565b60405180910390f35b3480156104ca57600080fd5b506104d36112a3565b005b3480156104e157600080fd5b506104fc60048036038101906104f791906143cd565b6112b7565b005b34801561050a57600080fd5b50610525600480360381019061052091906145d6565b6118ec565b005b610541600480360381019061053c9190614616565b6119db565b005b34801561054f57600080fd5b50610558612210565b60405161056591906144cc565b60405180910390f35b34801561057a57600080fd5b5061059560048036038101906105909190614502565b612216565b6040516105ab9a99989796959493929190614669565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d691906145d6565b6122ab565b005b3480156105e957600080fd5b506105f261239a565b6040516105ff91906144e7565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a919061448c565b6123d2565b60405161063c9190614264565b60405180910390f35b34801561065157600080fd5b5061065a61244b565b60405161066791906144cc565b60405180910390f35b34801561067c57600080fd5b5061069760048036038101906106929190614502565b612457565b6040516106a49190614264565b60405180910390f35b3480156106b957600080fd5b506106d460048036038101906106cf91906145d6565b61254d565b005b3480156106e257600080fd5b506106fd60048036038101906106f891906142dd565b61263c565b60405161070a91906144cc565b60405180910390f35b34801561071f57600080fd5b506107286126a9565b60405161073591906144cc565b60405180910390f35b34801561074a57600080fd5b506107536126b3565b604051610760919061437c565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190614705565b6126ba565b005b34801561079e57600080fd5b506107a76129e4565b6040516107b491906144e7565b60405180910390f35b3480156107c957600080fd5b506107e460048036038101906107df9190614792565b6129e9565b005b3480156107f257600080fd5b5061080d600480360381019061080891906142dd565b612cdd565b005b34801561081b57600080fd5b5061083660048036038101906108319190614502565b612d19565b005b34801561084457600080fd5b5061085f600480360381019061085a91906142dd565b612d26565b005b34801561086d57600080fd5b5061088860048036038101906108839190614792565b612f9d565b005b34801561089657600080fd5b506108b160048036038101906108ac9190614792565b613177565b005b3480156108bf57600080fd5b506108da60048036038101906108d5919061448c565b613342565b005b3480156108e857600080fd5b5061090360048036038101906108fe91906142dd565b613364565b6040516109119291906147d2565b60405180910390f35b34801561092657600080fd5b50610941600480360381019061093c91906142dd565b613400565b60405161094f9291906147fb565b60405180910390f35b34801561096457600080fd5b5061097f600480360381019061097a91906142dd565b613431565b60405161098c91906144cc565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b791906143cd565b613449565b6040516109ce9695949392919061442b565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f991906142dd565b6134cc565b005b348015610a0c57600080fd5b50610a15613623565b604051610a22919061437c565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d9190614502565b613647565b604051610a5f91906144cc565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a91906142dd565b61365f565b005b348015610a9d57600080fd5b50610aa66136e5565b604051610ab3919061437c565b60405180910390f35b6000610ac782613709565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610af881613783565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16610b7d576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fdd2e6d9f52cbe8f695939d018b7d4a216dc613a669876163ac548b916489d91760405160405180910390a25050565b600080610c29613797565b905080600001600084815260200190815260200160002060010154915050919050565b6000801b610c5981613783565b610c837f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929836137bf565b505050565b6000806000806000806000600260008a815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260020160009054906101000a900460ff168360020160019054906101000a900460ff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560030154965096509650965096509650509295509295509295565b610d5d82610c1e565b610d6681613783565b610d7083836137bf565b50505050565b610d7e6138c0565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dec82826138c8565b505050565b60085481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610e4781613783565b6001600083815260200190815260200160002060050160009054906101000a900460ff16610ea1576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160019054906101000a900460ff1615610efc576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180600084815260200190815260200160002060050160016101000a81548160ff021916908315150217905550817fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad5760036000858152602001908152602001600020546004600086815260200190815260200160002054604051610f829291906147d2565b60405180910390a25050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610fb881613783565b42861015610ff2576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85851161102b576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403611065576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361109f576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214806110ad57508382115b156110e4576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060075490506040518061014001604052808881526020018781526020018681526020018581526020018481526020016001151581526020016000151581526020016000151581526020016000151581526020016001151581525060016000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160050160036101000a81548160ff0219169083151502179055506101208201518160050160046101000a81548160ff0219169083151502179055509050506007600081548092919061123d90614853565b9190505550807f21fb045299ceafb7a136c74ee07b22d481ee9bf37a85b2d8f20c59f83ada4133888888888860405161127a95949392919061489b565b60405180910390a250505050505050565b60046020528060005260406000206000915090505481565b6112ab6139ca565b6112b56000613a51565b565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296112e181613783565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611347576040517f702b3d9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600084815260200190815260200160002060050160009054906101000a900460ff166113a1576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600084815260200190815260200160002060050160039054906101000a900460ff166113fb576040517f089c998700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001540361148d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff16156114d6576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff161561151f576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600082600301549050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c457478111156115bf576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61167e565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115ff91906144e7565b602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116409190614903565b90508082111561167c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60018360020160016101000a81548160ff02191690831515021790555082600001546003600088815260200190815260200160002060008282546116c29190614930565b925050819055508260000154600860008282546116df9190614930565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117c35760008573ffffffffffffffffffffffffffffffffffffffff168260405161174090614995565b60006040518083038185875af1925050503d806000811461177d576040519150601f19603f3d011682016040523d82523d6000602084013e611782565b606091505b50509050806117bd576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061187e565b60008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87846040518363ffffffff1660e01b81526004016118009291906149aa565b6020604051808303816000875af115801561181f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184391906149e8565b90508061187c576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b8173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16877f1c26abe6289671e3a9d493647349673af828abb9dbadff1e81762387f7cd99a3846040516118dc91906144cc565b60405180910390a4505050505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961191681613783565b6001600084815260200190815260200160002060050160009054906101000a900460ff16611970576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160036101000a81548160ff021916908315150217905550827f653b56ea3ea7dfba44234dbc807bac97a2a0adafb6d22427d818250375f1e911836040516119ce9190614264565b60405180910390a2505050565b6119e483612457565b611a1a576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16611a9f576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b165760003403611b0e576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050611b54565b60008203611b50576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8190505b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114158015611bb55750600185611bb19190614a15565b8114155b15611c15576001600086815260200190815260200160002060050160049054906101000a900460ff16611c14576040517f827a86b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b60008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000670de0b6b3a76400008285611c729190614a49565b611c7c9190614aba565b905060006002600089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000828260000154611ce49190614a15565b9050600160008a815260200190815260200160002060040154811115611d36576040517f1cd861cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083600360008c815260200190815260200160002054611d579190614a15565b9050600160008b815260200190815260200160002060020154811115611da9576040517f397bb34300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614611e9a5760008973ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b6040518463ffffffff1660e01b8152600401611e1c93929190614aeb565b6020604051808303816000875af1158015611e3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5f91906149e8565b905080611e98576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6000600160008c815260200190815260200160002060020154600160008d81526020019081526020016000206003015486611ed59190614a49565b611edf9190614aba565b90506000846000015403611fb757600460008c81526020019081526020016000206000815480929190611f1190614853565b919050555060018b611f239190614a15565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550898460020160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878460030181905550612061565b8973ffffffffffffffffffffffffffffffffffffffff168460020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361202e57878460030160008282546120229190614a15565b92505081905550612060565b6040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b848460000160008282546120759190614a15565b92505081905550808460010160008282546120909190614a15565b9250508190555084600360008d815260200190815260200160002060008282546120ba9190614a15565b9250508190555084600860008282546120d39190614a15565b92505081905550600160008c815260200190815260200160002060020154600360008d815260200190815260200160002054106121995760018060008d815260200190815260200160002060050160016101000a81548160ff0219169083151502179055508a7fc5285db7d8a9c3a0ce0e8982ff9a84fe8df355101d9545735558c69efb4aad57600360008e815260200190815260200160002054600460008f8152602001908152602001600020546040516121909291906147d2565b60405180910390a25b8973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168c7fb479ec976a9860505652c0d9f5dc15bc5fbca1a55c3da9cabe662f1b6f8090d28b89866040516121fb93929190614b22565b60405180910390a45050505050505050505050565b60075481565b60016020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff16908060050160039054906101000a900460ff16908060050160049054906101000a900460ff1690508a565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296122d581613783565b6001600084815260200190815260200160002060050160009054906101000a900460ff1661232f576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160046101000a81548160ff021916908315150217905550827f1c1c03453d1eefaa85a62e371adba496bc16fa6320bf5416b0af1249081ca84c8360405161238d9190614264565b60405180910390a2505050565b6000806123a5613b28565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b6000806123dd613797565b905080600001600085815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b670de0b6b3a764000081565b60006001600083815260200190815260200160002060050160009054906101000a900460ff1661248a5760009050612548565b6001600083815260200190815260200160002060050160019054906101000a900460ff16156124bc5760009050612548565b60016000838152602001908152602001600020600001544210156124e35760009050612548565b600160008381526020019081526020016000206001015442111561250a5760009050612548565b60016000838152602001908152602001600020600201546003600084815260200190815260200160002054106125435760009050612548565b600190505b919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961257781613783565b6001600084815260200190815260200160002060050160009054906101000a900460ff166125d1576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600085815260200190815260200160002060050160026101000a81548160ff021916908315150217905550827f74c19978ee48fa394fffde7cccc94793539daf917f2a8fd2d5e851409de3f7a08360405161262f9190614264565b60405180910390a2505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081036126935760009150506126a4565b6001816126a09190614930565b9150505b919050565b6000600754905090565b6000801b81565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296126e481613783565b6001600088815260200190815260200160002060050160009054906101000a900460ff1661273e576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600088815260200190815260200160002060050160019054906101000a900460ff1615612799576040517f0f5eeea600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008881526020019081526020016000206000015442106127e8576040517f4eb5402b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42861015612822576040517fb290253c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85851161285b576040517f38af65f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612895576040517fe2494de700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036128cf576040517f0baf743200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214806128dd57508382115b15612914576040517f90e3cae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b856001600089815260200190815260200160002060000181905550846001600089815260200190815260200160002060010181905550836001600089815260200190815260200160002060020181905550826001600089815260200190815260200160002060030181905550816001600089815260200190815260200160002060040181905550867fe35865500052be0ea409d44d56e7f66a0e0728bab40a71f941ccd691b915959687878787876040516129d395949392919061489b565b60405180910390a250505050505050565b600081565b7f3496e2e73c4d42b75d702e60d9e48102720b8691234415963a5a857b86425d07612a1381613783565b60008203612a4d576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b645747821115612abb576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1683604051612ae190614995565b60006040518083038185875af1925050503d8060008114612b1e576040519150601f19603f3d011682016040523d82523d6000602084013e612b23565b606091505b5050905080612b5e576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612cd8565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b9f91906144e7565b602060405180830381865afa158015612bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be09190614903565b905080831115612c1c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401612c599291906149aa565b6020604051808303816000875af1158015612c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9c91906149e8565b905080612cd5576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505b505050565b6000801b612cea81613783565b612d147f3496e2e73c4d42b75d702e60d9e48102720b8691234415963a5a857b86425d07836137bf565b505050565b612d238133613b50565b50565b6000612d30613fd8565b905060008160000160089054906101000a900460ff1615905060008260000160009054906101000a900467ffffffffffffffff1690506000808267ffffffffffffffff16148015612d7e5750825b9050600060018367ffffffffffffffff16148015612db3575060003073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015612dc1575080155b15612df8576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018560000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315612e485760018560000160086101000a81548160ff0219169083151502179055505b612e5133614000565b612e59614014565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612ebf576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612f0d6000801b336137bf565b50612f387f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336137bf565b508315612f955760008560000160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051612f8c9190614bb2565b60405180910390a15b505050505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929612fc781613783565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156130305750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15613067576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082036130a1576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060400160405280600115158152602001838152506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101559050508273ffffffffffffffffffffffffffffffffffffffff167fe184914670d9e097e90729e2a9159866b30b1203952f0586bedca1d6fcf130a88360405161316a91906144cc565b60405180910390a2505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296131a181613783565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16613226576040517ff84835a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203613260576040517ff083859200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508373ffffffffffffffffffffffffffffffffffffffff167f62e2c9c75b287778c0b58f1c1d83fa8f9978a33848e0b423735fd44f48ebe3c182856040516133349291906147d2565b60405180910390a250505050565b61334b82610c1e565b61335481613783565b61335e83836138c8565b50505050565b60008060005b6007548110156133fa5760006002600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000154846133d89190614a15565b93508060010154836133ea9190614a15565b925050808060010191505061336a565b50915091565b60006020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154905082565b60056020528060005260406000206000915090505481565b6002602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16908060020160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905086565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296134f681613783565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361355c576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f38b700f64059658d3f95b87d8db51f669197c89da3076d26d42bb8fb06159fa960405160405180910390a3505050565b7f3496e2e73c4d42b75d702e60d9e48102720b8691234415963a5a857b86425d0781565b60036020528060005260406000206000915090505481565b6136676139ca565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036136d95760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016136d091906144e7565b60405180910390fd5b6136e281613a51565b50565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061377c575061377b8261401e565b5b9050919050565b6137948161378f6138c0565b614088565b50565b60007f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b6000806137ca613797565b90506137d684846123d2565b6138b457600181600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506138506138c0565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506138ba565b60009150505b92915050565b600033905090565b6000806138d3613797565b90506138df84846123d2565b156139be57600081600001600086815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061395a6138c0565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019150506139c4565b60009150505b92915050565b6139d26138c0565b73ffffffffffffffffffffffffffffffffffffffff166139f061239a565b73ffffffffffffffffffffffffffffffffffffffff1614613a4f57613a136138c0565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401613a4691906144e7565b60405180910390fd5b565b6000613a5b613b28565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60007f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b6001600083815260200190815260200160002060050160009054906101000a900460ff16613baa576040517f266f368500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160019054906101000a900460ff16158015613bf1575060016000838152602001908152602001600020600101544211155b15613c28576040517f3df07da500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600083815260200190815260200160002060050160029054906101000a900460ff16613c82576040517fe2c858ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015403613d14576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900460ff1615613d5d576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160019054906101000a900460ff1615613da6576040517fa85e6f1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001015490506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e0c91906144e7565b602060405180830381865afa158015613e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e4d9190614903565b905080821115613e89576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018360020160006101000a81548160ff0219169083151502179055506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86856040518363ffffffff1660e01b8152600401613f059291906149aa565b6020604051808303816000875af1158015613f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4891906149e8565b905080613f81576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16867f880f2ef2613b092f1a0a819f294155c98667eb294b7e6bf7a3810278142c1a1c85604051613fc891906144cc565b60405180910390a3505050505050565b60007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6140086140d9565b61401181614119565b50565b61401c6140d9565b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61409282826123d2565b6140d55780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016140cc929190614bcd565b60405180910390fd5b5050565b6140e161419f565b614117576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6141216140d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036141935760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161418a91906144e7565b60405180910390fd5b61419c81613a51565b50565b60006141a9613fd8565b60000160089054906101000a900460ff16905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141f9816141c4565b811461420457600080fd5b50565b600081359050614216816141f0565b92915050565b600060208284031215614232576142316141bf565b5b600061424084828501614207565b91505092915050565b60008115159050919050565b61425e81614249565b82525050565b60006020820190506142796000830184614255565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006142aa8261427f565b9050919050565b6142ba8161429f565b81146142c557600080fd5b50565b6000813590506142d7816142b1565b92915050565b6000602082840312156142f3576142f26141bf565b5b6000614301848285016142c8565b91505092915050565b6000819050919050565b61431d8161430a565b811461432857600080fd5b50565b60008135905061433a81614314565b92915050565b600060208284031215614356576143556141bf565b5b60006143648482850161432b565b91505092915050565b6143768161430a565b82525050565b6000602082019050614391600083018461436d565b92915050565b6000819050919050565b6143aa81614397565b81146143b557600080fd5b50565b6000813590506143c7816143a1565b92915050565b600080604083850312156143e4576143e36141bf565b5b60006143f2858286016143b8565b9250506020614403858286016142c8565b9150509250929050565b61441681614397565b82525050565b6144258161429f565b82525050565b600060c082019050614440600083018961440d565b61444d602083018861440d565b61445a6040830187614255565b6144676060830186614255565b614474608083018561441c565b61448160a083018461440d565b979650505050505050565b600080604083850312156144a3576144a26141bf565b5b60006144b18582860161432b565b92505060206144c2858286016142c8565b9150509250929050565b60006020820190506144e1600083018461440d565b92915050565b60006020820190506144fc600083018461441c565b92915050565b600060208284031215614518576145176141bf565b5b6000614526848285016143b8565b91505092915050565b600080600080600060a0868803121561454b5761454a6141bf565b5b6000614559888289016143b8565b955050602061456a888289016143b8565b945050604061457b888289016143b8565b935050606061458c888289016143b8565b925050608061459d888289016143b8565b9150509295509295909350565b6145b381614249565b81146145be57600080fd5b50565b6000813590506145d0816145aa565b92915050565b600080604083850312156145ed576145ec6141bf565b5b60006145fb858286016143b8565b925050602061460c858286016145c1565b9150509250929050565b60008060006060848603121561462f5761462e6141bf565b5b600061463d868287016143b8565b935050602061464e868287016142c8565b925050604061465f868287016143b8565b9150509250925092565b60006101408201905061467f600083018d61440d565b61468c602083018c61440d565b614699604083018b61440d565b6146a6606083018a61440d565b6146b3608083018961440d565b6146c060a0830188614255565b6146cd60c0830187614255565b6146da60e0830186614255565b6146e8610100830185614255565b6146f6610120830184614255565b9b9a5050505050505050505050565b60008060008060008060c08789031215614722576147216141bf565b5b600061473089828a016143b8565b965050602061474189828a016143b8565b955050604061475289828a016143b8565b945050606061476389828a016143b8565b935050608061477489828a016143b8565b92505060a061478589828a016143b8565b9150509295509295509295565b600080604083850312156147a9576147a86141bf565b5b60006147b7858286016142c8565b92505060206147c8858286016143b8565b9150509250929050565b60006040820190506147e7600083018561440d565b6147f4602083018461440d565b9392505050565b60006040820190506148106000830185614255565b61481d602083018461440d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061485e82614397565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148905761488f614824565b5b600182019050919050565b600060a0820190506148b0600083018861440d565b6148bd602083018761440d565b6148ca604083018661440d565b6148d7606083018561440d565b6148e4608083018461440d565b9695505050505050565b6000815190506148fd816143a1565b92915050565b600060208284031215614919576149186141bf565b5b6000614927848285016148ee565b91505092915050565b600061493b82614397565b915061494683614397565b925082820390508181111561495e5761495d614824565b5b92915050565b600081905092915050565b50565b600061497f600083614964565b915061498a8261496f565b600082019050919050565b60006149a082614972565b9150819050919050565b60006040820190506149bf600083018561441c565b6149cc602083018461440d565b9392505050565b6000815190506149e2816145aa565b92915050565b6000602082840312156149fe576149fd6141bf565b5b6000614a0c848285016149d3565b91505092915050565b6000614a2082614397565b9150614a2b83614397565b9250828201905080821115614a4357614a42614824565b5b92915050565b6000614a5482614397565b9150614a5f83614397565b9250828202614a6d81614397565b91508282048414831517614a8457614a83614824565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ac582614397565b9150614ad083614397565b925082614ae057614adf614a8b565b5b828204905092915050565b6000606082019050614b00600083018661441c565b614b0d602083018561441c565b614b1a604083018461440d565b949350505050565b6000606082019050614b37600083018661440d565b614b44602083018561440d565b614b51604083018461440d565b949350505050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000819050919050565b6000614b9c614b97614b9284614b59565b614b77565b614b63565b9050919050565b614bac81614b81565b82525050565b6000602082019050614bc76000830184614ba3565b92915050565b6000604082019050614be2600083018561441c565b614bef602083018461436d565b939250505056fea2646970667358221220b62a2df386c339c73773cfd5bbae2ef8b1fe4e98c7b355111b802fd05e87f97e64736f6c634300081c0033",
1517
1547
  "linkReferences": {},
1518
1548
  "deployedLinkReferences": {}
1519
1549
  }