diff --git a/contracts/integrations/test/stop-limit/chainlink_stop_limit_test.ts b/contracts/integrations/test/stop-limit/chainlink_stop_limit_test.ts new file mode 100644 index 0000000000..dc5d861a8b --- /dev/null +++ b/contracts/integrations/test/stop-limit/chainlink_stop_limit_test.ts @@ -0,0 +1,153 @@ +import { ExchangeRevertErrors } from '@0x/contracts-exchange'; +import { blockchainTests, constants, expect, orderHashUtils } from '@0x/contracts-test-utils'; +import { assetDataUtils } from '@0x/order-utils'; +import { SignedOrder } from '@0x/types'; +import { BigNumber, StringRevertError } from '@0x/utils'; + +import { encodeStopLimiStaticCallData } from '../../src/chainlink_utils'; + +import { artifacts } from '../artifacts'; +import { Actor } from '../framework/actors/base'; +import { Maker } from '../framework/actors/maker'; +import { Taker } from '../framework/actors/taker'; +import { BlockchainBalanceStore } from '../framework/balances/blockchain_balance_store'; +import { LocalBalanceStore } from '../framework/balances/local_balance_store'; +import { DeploymentManager } from '../framework/deployment_manager'; +import { ChainlinkStopLimitContract, TestChainlinkAggregatorContract } from '../wrappers'; + +blockchainTests.resets('Chainlink stop-limit order tests', env => { + let deployment: DeploymentManager; + let balanceStore: BlockchainBalanceStore; + let initialBalances: LocalBalanceStore; + + let chainLinkAggregator: TestChainlinkAggregatorContract; + + let maker: Maker; + let taker: Taker; + + let order: SignedOrder; + + const minPrice = new BigNumber(42); + const maxPrice = new BigNumber(1337); + + before(async () => { + deployment = await DeploymentManager.deployAsync(env, { + numErc20TokensToDeploy: 2, + numErc721TokensToDeploy: 0, + numErc1155TokensToDeploy: 0, + }); + const [makerToken, takerToken] = deployment.tokens.erc20; + + const chainlinkStopLimit = await ChainlinkStopLimitContract.deployFrom0xArtifactAsync( + artifacts.ChainlinkStopLimit, + env.provider, + env.txDefaults, + artifacts, + ); + chainLinkAggregator = await TestChainlinkAggregatorContract.deployFrom0xArtifactAsync( + artifacts.TestChainlinkAggregator, + env.provider, + env.txDefaults, + artifacts, + ); + + const makerAssetData = assetDataUtils.encodeMultiAssetData( + [new BigNumber(1), new BigNumber(1)], + [ + assetDataUtils.encodeERC20AssetData(makerToken.address), + encodeStopLimiStaticCallData( + chainlinkStopLimit.address, + chainLinkAggregator.address, + minPrice, + maxPrice, + ), + ], + ); + + const orderConfig = { + feeRecipientAddress: constants.NULL_ADDRESS, + makerAssetData, + takerAssetData: assetDataUtils.encodeERC20AssetData(takerToken.address), + makerFeeAssetData: constants.NULL_BYTES, + takerFeeAssetData: constants.NULL_BYTES, + makerFee: constants.ZERO_AMOUNT, + takerFee: constants.ZERO_AMOUNT, + }; + + maker = new Maker({ + name: 'Maker', + deployment, + orderConfig, + }); + taker = new Taker({ name: 'Taker', deployment }); + + // Set balances and allowances + await maker.configureERC20TokenAsync(makerToken); + await taker.configureERC20TokenAsync(takerToken); + + order = await maker.signOrderAsync(); + + // Set up balance stores + const tokenOwners = { + Maker: maker.address, + Taker: taker.address, + }; + const tokenContracts = { + erc20: { makerToken, takerToken }, + }; + balanceStore = new BlockchainBalanceStore(tokenOwners, tokenContracts); + await balanceStore.updateBalancesAsync(); + initialBalances = LocalBalanceStore.create(balanceStore); + }); + + after(async () => { + Actor.reset(); + }); + + it('fillOrder reverts if price < minPrice', async () => { + await chainLinkAggregator.setPrice(minPrice.minus(1)).awaitTransactionSuccessAsync(); + const tx = taker.fillOrderAsync(order, order.takerAssetAmount); + const expectedError = new ExchangeRevertErrors.AssetProxyTransferError( + orderHashUtils.getOrderHashHex(order), + order.makerAssetData, + new StringRevertError('ChainlinkStopLimit/OUT_OF_PRICE_RANGE').encode(), + ); + return expect(tx).to.revertWith(expectedError); + }); + it('fillOrder reverts price > maxPrice', async () => { + await chainLinkAggregator.setPrice(maxPrice.plus(1)).awaitTransactionSuccessAsync(); + const tx = taker.fillOrderAsync(order, order.takerAssetAmount); + const expectedError = new ExchangeRevertErrors.AssetProxyTransferError( + orderHashUtils.getOrderHashHex(order), + order.makerAssetData, + new StringRevertError('ChainlinkStopLimit/OUT_OF_PRICE_RANGE').encode(), + ); + return expect(tx).to.revertWith(expectedError); + }); + it('fillOrder succeeds if price = minPrice', async () => { + await chainLinkAggregator.setPrice(minPrice).awaitTransactionSuccessAsync(); + const receipt = await taker.fillOrderAsync(order, order.takerAssetAmount); + const expectedBalances = LocalBalanceStore.create(initialBalances); + expectedBalances.simulateFills([order], taker.address, receipt, deployment, DeploymentManager.protocolFee); + await balanceStore.updateBalancesAsync(); + balanceStore.assertEquals(expectedBalances); + }); + it('fillOrder succeeds if price = maxPrice', async () => { + await chainLinkAggregator.setPrice(maxPrice).awaitTransactionSuccessAsync(); + const receipt = await taker.fillOrderAsync(order, order.takerAssetAmount); + const expectedBalances = LocalBalanceStore.create(initialBalances); + expectedBalances.simulateFills([order], taker.address, receipt, deployment, DeploymentManager.protocolFee); + await balanceStore.updateBalancesAsync(); + balanceStore.assertEquals(expectedBalances); + }); + it('fillOrder succeeds if minPrice < price < maxPrice', async () => { + await chainLinkAggregator + .setPrice(minPrice.plus(maxPrice).dividedToIntegerBy(2)) + .awaitTransactionSuccessAsync(); + const receipt = await taker.fillOrderAsync(order, order.takerAssetAmount); + const expectedBalances = LocalBalanceStore.create(initialBalances); + expectedBalances.simulateFills([order], taker.address, receipt, deployment, DeploymentManager.protocolFee); + await balanceStore.updateBalancesAsync(); + balanceStore.assertEquals(expectedBalances); + }); +}); diff --git a/packages/contract-artifacts/artifacts/Forwarder.json b/packages/contract-artifacts/artifacts/Forwarder.json index 4ae9adfab3..7b91d4a8e0 100644 --- a/packages/contract-artifacts/artifacts/Forwarder.json +++ b/packages/contract-artifacts/artifacts/Forwarder.json @@ -259,10 +259,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b5060405162003c9d38038062003c9d833981016040819052620000349162000472565b60008054336001600160a01b031991821617909155600180549091166001600160a01b0383161790556040518390839082908490630f47261b60e41b9062000081908390602401620004e7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217825251620000c191600291620003a0565b50604051630c0e082160e31b81526000906001600160a01b03841690636070410890620000fa90630f47261b60e41b9060040162000514565b60206040518083038186803b1580156200011357600080fd5b505afa15801562000128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200014e919081019062000442565b90506001600160a01b038116620001895762000189620001786200036b60201b620007b11760201c565b6200039860201b620002d81760201c565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620001bf90849060001990600401620004fb565b602060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002159190810190620004c5565b506000836001600160a01b031663850a15016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200028d919081019062000442565b90506001600160a01b038116156200032d5760015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620002d590849060001990600401620004fb565b602060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200032b9190810190620004c5565b505b5050600380546001600160a01b039586166001600160a01b031991821617909155600480549490951693169290921790925550620005429350505050565b6040805160048152602481019091526020810180516001600160e01b031663f3b96b8d60e01b1790525b90565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e357805160ff191683800117855562000413565b8280016001018555821562000413579182015b8281111562000413578251825591602001919060010190620003f6565b506200042192915062000425565b5090565b6200039591905b808211156200042157600081556001016200042c565b60006020828403121562000454578081fd5b81516001600160a01b03811681146200046b578182fd5b9392505050565b60008060006060848603121562000487578182fd5b8351620004948162000529565b6020850151909350620004a78162000529565b6040850151909250620004ba8162000529565b809150509250925092565b600060208284031215620004d7578081fd5b815180151581146200046b578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200053f57600080fd5b50565b61374b80620005526000396000f3fe6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a7231582046e7b4801e4017360012dc9f596c66d1113c57a190987d4f3089965a65faa3c56c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x60806040523480156200001157600080fd5b5060405162003c9d38038062003c9d833981016040819052620000349162000472565b60008054336001600160a01b031991821617909155600180549091166001600160a01b0383161790556040518390839082908490630f47261b60e41b9062000081908390602401620004e7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217825251620000c191600291620003a0565b50604051630c0e082160e31b81526000906001600160a01b03841690636070410890620000fa90630f47261b60e41b9060040162000514565b60206040518083038186803b1580156200011357600080fd5b505afa15801562000128573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200014e919081019062000442565b90506001600160a01b038116620001895762000189620001786200036b60201b620007b11760201c565b6200039860201b620002d81760201c565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620001bf90849060001990600401620004fb565b602060405180830381600087803b158015620001da57600080fd5b505af1158015620001ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002159190810190620004c5565b506000836001600160a01b031663850a15016040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025257600080fd5b505afa15801562000267573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200028d919081019062000442565b90506001600160a01b038116156200032d5760015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620002d590849060001990600401620004fb565b602060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200032b9190810190620004c5565b505b5050600380546001600160a01b039586166001600160a01b031991821617909155600480549490951693169290921790925550620005429350505050565b6040805160048152602481019091526020810180516001600160e01b031663f3b96b8d60e01b1790525b90565b805160208201fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e357805160ff191683800117855562000413565b8280016001018555821562000413579182015b8281111562000413578251825591602001919060010190620003f6565b506200042192915062000425565b5090565b6200039591905b808211156200042157600081556001016200042c565b60006020828403121562000454578081fd5b81516001600160a01b03811681146200046b578182fd5b9392505050565b60008060006060848603121562000487578182fd5b8351620004948162000529565b6020850151909350620004a78162000529565b6040850151909250620004ba8162000529565b809150509250925092565b600060208284031215620004d7578081fd5b815180151581146200046b578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200053f57600080fd5b50565b61374b80620005526000396000f3fe6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a72315820ebedf6ba0823da75dd29d928186748ec6baa07f40f145a90097baa22da29b56a6c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a7231582046e7b4801e4017360012dc9f596c66d1113c57a190987d4f3089965a65faa3c56c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x6080604052600436106100bc5760003560e01c8063bc197c8111610074578063f23a6e611161004e578063f23a6e61146101e4578063f2fde38b14610204578063fc67bf1c14610224576100bc565b8063bc197c811461018d578063e0a5c949146101ba578063e196001b146101cf576100bc565b80638da5cb5b116100a55780638da5cb5b1461012e578063907e5cc3146101595780639e8323151461017a576100bc565b8063442026ed146100ee578063630f1e6c1461010e575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100ec576100ec6100e733610239565b6102d8565b005b3480156100fa57600080fd5b506100ec610109366004613075565b6102e0565b34801561011a57600080fd5b506100ec6101293660046130b5565b6104ca565b34801561013a57600080fd5b50610143610520565b6040516101509190613246565b60405180910390f35b61016c610167366004612e77565b61053c565b604051610150929190613623565b61016c610188366004612f13565b610597565b34801561019957600080fd5b506101ad6101a8366004612d42565b6105f3565b604051610150919061334f565b3480156101c657600080fd5b506101ad610620565b3480156101db57600080fd5b506101ad610644565b3480156101f057600080fd5b506101ad6101ff366004612dfd565b610668565b34801561021057600080fd5b506100ec61021f366004612c72565b610693565b34801561023057600080fd5b506101ad610737565b60606308b1869860e01b826040516024016102549190613246565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b600061032c600084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61075b169050565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082168114156104c4576003546040517f6070410800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906360704108906103d090859060040161334f565b60206040518083038186803b1580156103e857600080fd5b505afa1580156103fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104209190810190612c8e565b905073ffffffffffffffffffffffffffffffffffffffff8116610448576104486100e76107b1565b6000610494601087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff61080b169050565b90506104c181837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61084b565b50505b50505050565b6104d261090c565b61051b8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff610955169050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061054b858561096b565b9050610558878288610ac1565b909350915080831115610572576105726100e78434610f28565b610582818463ffffffff610fca16565b905061058d81610fe9565b5094509492505050565b60008060006105a6858561096b565b90506105b38888886110a4565b9093509150808311156105cd576105cd6100e78434610f28565b6105dd818463ffffffff610fca16565b90506105e881610fe9565b509550959350505050565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e610000000000000000000000000000000000000000000000000000000081565b7f770501f80000000000000000000000000000000000000000000000000000000081565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b61069b61090c565b73ffffffffffffffffffffffffffffffffffffffff81166106c6576106c16100e76113e0565b610734565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35b50565b7fbc197c810000000000000000000000000000000000000000000000000000000081565b6000816004018351101561077c5761077c6100e76003855185600401611417565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff3b96b8d0000000000000000000000000000000000000000000000000000000017905290565b6000816014018351101561082c5761082c6100e76004855185601401611417565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6040516060907f095ea7b300000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506104c484826114bd565b60005473ffffffffffffffffffffffffffffffffffffffff16331461095357600054610953906100e790339073ffffffffffffffffffffffffffffffffffffffff16611575565b565b6109678230338463ffffffff61159216565b5050565b81518151600091908114610987576109876100e78285516117cd565b34915060005b818114610a365760008582815181106109a257fe5b60200260200101519050808410156109c1576109c16100e782866117ea565b6109d1848263ffffffff610fca16565b93508482815181106109df57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a2c573d6000803e3d6000fd5b505060010161098d565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610aa157600080fd5b505af1158015610ab5573d6000803e3d6000fd5b50505050505092915050565b6000806000610b76600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b699190810190613150565b3a9063ffffffff61180716565b90507fdc1600f30000000000000000000000000000000000000000000000000000000060005b87518114610f1d57878181518110610bb057fe5b60200260200101516080015160001480610be15750878181518110610bd157fe5b602002602001015160a001516000145b15610beb57610f15565b6000610c35610c0c8a8481518110610bff57fe5b6020026020010151611838565b610c165784610c19565b60005b610c298a8963ffffffff610fca16565b9063ffffffff610fca16565b90506000610c6560008b8581518110610c4a57fe5b6020026020010151610140015161075b90919063ffffffff16565b90506000807fffffffff000000000000000000000000000000000000000000000000000000008084169087161415610d6b57610cc360108d8781518110610ca857fe5b6020026020010151610140015161080b90919063ffffffff16565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610d18903090600401613246565b60206040518083038186803b158015610d3057600080fd5b505afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d689190810190613150565b90505b600080610d9f8e8881518110610d7d57fe5b60200260200101518d8981518110610d9157fe5b6020026020010151886118ad565b91509150877bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ead576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190610e3e903090600401613246565b60206040518083038186803b158015610e5657600080fd5b505afa158015610e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e8e9190810190613150565b9050610ea9610ea3828663ffffffff610fca16565b836119d7565b9150505b610ed8818f8981518110610ebd57fe5b6020026020010151610140015161095590919063ffffffff16565b610ee88b8363ffffffff6119ee16565b9a50610efa8a8263ffffffff6119ee16565b99508c8b10610f0e57505050505050610f1d565b5050505050505b600101610b9c565b505050935093915050565b606063cdcbed5d60e01b8383604051602401610f45929190613623565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b600082821115610fe357610fe36100e760028585611a06565b50900390565b8015610734576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d9061104590849060040161361a565b600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f19350505050158015610967573d6000803e3d6000fd5b825160009081907fdc1600f30000000000000000000000000000000000000000000000000000000090825b8181146113c0578781815181106110e257fe5b60200260200101516080015160001480611113575087818151811061110357fe5b602002602001015160a001516000145b1561111d576113b8565b600061112f888663ffffffff610fca16565b9050600061114460008b8581518110610c4a57fe5b90506000807fffffffff00000000000000000000000000000000000000000000000000000000808416908816141561122f5761118760108d8781518110610ca857fe5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff8316906370a08231906111dc903090600401613246565b60206040518083038186803b1580156111f457600080fd5b505afa158015611208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061122c9190810190613150565b90505b6000806112638e888151811061124157fe5b60200260200101518d898151811061125557fe5b602002602001015188611a25565b91509150887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561136b576040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190611302903090600401613246565b60206040518083038186803b15801561131a57600080fd5b505afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113529190810190613150565b9050611367610ea3828663ffffffff610fca16565b9150505b61137b818f8981518110610ebd57fe5b61138b8b8363ffffffff6119ee16565b9a5061139d8a8263ffffffff6119ee16565b99508c8a106113b1575050505050506113c0565b5050505050505b6001016110cf565b50858310156113d6576113d66100e78785611af7565b5050935093915050565b60408051808201909152600481527fe69edc3e00000000000000000000000000000000000000000000000000000000602082015290565b6060632800659560e01b848484604051602401611436939291906133b1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b9392505050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516114e6919061322a565b6000604051808303816000865af19150503d8060008114611523576040519150601f19603f3d011682016040523d82523d6000602084013e611528565b606091505b5091509150811561156c578051611540575050610967565b80516020141561156c576000611557826000611b14565b9050806001141561156a57505050610967565b505b6104c4816102d8565b6060631de45ad160e01b8383604051602401610f45929190613267565b8061159c576104c4565b60006115ae858263ffffffff61075b16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000148061164157507fffffffff0000000000000000000000000000000000000000000000000000000081167fdc1600f300000000000000000000000000000000000000000000000000000000145b1561165d576116588585858563ffffffff611b2016565b6117c6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f025717920000000000000000000000000000000000000000000000000000000014156116b9576116588585858563ffffffff611b6a16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611715576116588585858563ffffffff611c3916565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611771576116588585858563ffffffff611d8f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a00000000000000000000000000000000000000000000000000000000146117c6576117c66100e782611e23565b5050505050565b6060633ecb6ceb60e01b8383604051602401610f45929190613623565b606063ecf40fd960e01b8383604051602401610f45929190613623565b600082611816575060006107ab565b8282028284828161182357fe5b04146114b6576114b66100e760018686611a06565b60006003826101800151511180156107ab57506101808201517f770501f8000000000000000000000000000000000000000000000000000000009061188490600063ffffffff61075b16565b7fffffffff00000000000000000000000000000000000000000000000000000000161492915050565b6000808460e00151600014806118d257506118d2856101a00151866101400151611e3e565b15611929576118df612710565b6118ea868587611feb565b9050611907816080015182602001516119ee90919063ffffffff16565b60608201518251919450611921919063ffffffff610fca16565b9150506119cf565b61193d856101a00151866101600151611e3e565b156119be5760a085015160e086015160009161196a9161196490829063ffffffff6119ee16565b86612026565b9050611974612710565b61197f878388611feb565b90506119b081608001516119a4836060015184602001516119ee90919063ffffffff16565b9063ffffffff6119ee16565b905190935091506119cf9050565b6119cf6100e7866101a0015161205c565b935093915050565b6000818310156119e757816114b6565b5090919050565b6000828201838110156114b6576114b66100e7600086865b606063e946c1bb60e01b8484846040516024016114369392919061338f565b6000808460e0015160001480611a4a5750611a4a856101a00151866101600151611e3e565b15611a6457600061196a8660a00151876080015186612026565b611a78856101a00151866101400151611e3e565b156119be576000611aa28660a001516119648860e001518960800151610fca90919063ffffffff16565b9050611aac612710565b611ab7878388611feb565b9050611ad4816080015182602001516119ee90919063ffffffff16565b60608201518251919550611aee919063ffffffff610fca16565b925050506119cf565b60606391353a0c60e01b8383604051602401610f45929190613623565b60006114b68383612077565b6000611b3385601063ffffffff61080b16565b905073ffffffffffffffffffffffffffffffffffffffff8416301415611b5e576116588184846120a1565b6117c6818585856120d9565b80600114611b7e57611b7e6100e78261219c565b6000611b9185601063ffffffff61080b16565b90506000611ba686602463ffffffff611b1416565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611bff908890889086906004016132f8565b600060405180830381600087803b158015611c1957600080fd5b505af1158015611c2d573d6000803e3d6000fd5b50505050505050505050565b60006060806060611c57600489518a6121b79092919063ffffffff16565b806020019051611c6a9190810190612caa565b9350935093509350600082519050606081604051908082528060200260200182016040528015611ca4578160200160208202803883390190505b50905060005b828114611cf657611cd788868381518110611cc157fe5b602002602001015161180790919063ffffffff16565b828281518110611ce357fe5b6020908102919091010152600101611caa565b506040517f2eb2c2d600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690632eb2c2d690611d51908c908c908a9087908a9060040161328e565b600060405180830381600087803b158015611d6b57600080fd5b505af1158015611d7f573d6000803e3d6000fd5b5050505050505050505050505050565b606080611da960048751886121b79092919063ffffffff16565b806020019051611dbc9190810190612fc5565b8051919350915060005b818114611e1957611e11838281518110611ddc57fe5b60200260200101518888611e0c888681518110611df557fe5b60200260200101518a61180790919063ffffffff16565b611592565b600101611dc6565b5050505050505050565b6060637996a27160e01b82604051602401610254919061334f565b600080611e51848263ffffffff61075b16565b90506000611e65848263ffffffff61075b16565b90507ff47261b0000000000000000000000000000000000000000000000000000000007fdc1600f3000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008416821480611efd57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b8015611f5b57507fffffffff000000000000000000000000000000000000000000000000000000008381169083161480611f5b57507fffffffff00000000000000000000000000000000000000000000000000000000838116908216145b15611fc6576000611f7388601063ffffffff61080b16565b90506000611f8888601063ffffffff61080b16565b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161496505050505050506107ab565b611fd6878763ffffffff61223716565b9450505050506107ab565b5050505092915050565b611ff3612710565b611ffc84611838565b156120135761200c84848461225c565b90506114b6565b61201e8484846124b0565b949350505050565b600061201e8361205061204082600163ffffffff610fca16565b6119a4888763ffffffff61180716565b9063ffffffff61261d16565b60606331360af160e01b82604051602401610254919061337c565b60008160200183511015612098576120986100e76005855185602001611417565b50016020015190565b6040516060907fa9059cbb00000000000000000000000000000000000000000000000000000000906108839085908590602401613329565b6040516060907f23b872dd0000000000000000000000000000000000000000000000000000000090612113908690869086906024016132f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506117c685826114bd565b606063baffa47460e01b82604051602401610254919061361a565b6060818311156121d0576121d06100e760008585611417565b83518211156121e9576121e96100e76001848751611417565b8282036040519080825280601f01601f191660200182016040528015612216576020820181803883390190505b5090506114b661222582612647565b8461222f87612647565b01835161264d565b6000815183511480156114b65750508051602091820120825192909101919091201490565b612264612710565b61226c61273f565b604051806101800160405280866000015173ffffffffffffffffffffffffffffffffffffffff168152602001866020015173ffffffffffffffffffffffffffffffffffffffff168152602001866040015173ffffffffffffffffffffffffffffffffffffffff168152602001866060015173ffffffffffffffffffffffffffffffffffffffff168152602001866080015181526020018660a001518152602001600081526020016000815260200186610100015181526020018661012001518152602001866101400151815260200186610160015181525090506060600073ffffffffffffffffffffffffffffffffffffffff1663b4be83d5905060e01b82868660405160240161237f939291906133bf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925073ffffffffffffffffffffffffffffffffffffffff90911690600090606090839061243090869061322a565b6000604051808303816000865af19150503d806000811461246d576040519150601f19603f3d011682016040523d82523d6000602084013e612472565b606091505b509150915081156124a457805160801461248857fe5b8080602001905161249c9190810190613168565b602088015286525b50505050509392505050565b6124b8612710565b6040516060907f9b44d55600000000000000000000000000000000000000000000000000000000906124f2908790879087906024016134df565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600354915190925073ffffffffffffffffffffffffffffffffffffffff9091169060009060609083906125a390869061322a565b6000604051808303816000865af19150503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b5091509150811561261257805160a0146125fb57fe5b8080602001905161260f91908101906130ff565b94505b505050509392505050565b600081612633576126336100e760038585611a06565b600082848161263e57fe5b04949350505050565b60200190565b6020811015612677576001816020036101000a03801983511681855116808217865250505061051b565b828214156126845761051b565b828211156126be5760208103905080820181840181515b828510156126b657845186526020958601959094019361269b565b90525061051b565b60208103905080820181840183515b8186121561270757825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe092830192909101906126cd565b85525050505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b80356107ab816136e6565b600082601f830112612813578081fd5b813561282661282182613658565b613631565b81815291506020808301908481018184028601820187101561284757600080fd5b60005b8481101561286f57813561285d816136e6565b8452928201929082019060010161284a565b505050505092915050565b600082601f83011261288a578081fd5b813561289861282182613658565b8181529150602080830190840160005b83811015611fe1576128c08760208435890101612bd7565b835260209283019291909101906001016128a8565b600082601f8301126128e5578081fd5b81356128f361282182613658565b818152915060208083019084810160005b8481101561286f57813587016101c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838c0301121561294457600080fd5b61294d81613631565b6129598b8785016127f8565b81526129688b604085016127f8565b868201526129798b606085016127f8565b604082015261298b8b608085016127f8565b606082015260a0830135608082015260c083013560a082015260e083013560c08201526101008084013560e0830152610120808501358284015261014091508185013581840152506101608085013567ffffffffffffffff808211156129f057600080fd5b6129fe8f8b848a0101612bd7565b84860152610180935083870135915080821115612a1a57600080fd5b612a288f8b848a0101612bd7565b838601526101a0925082870135915080821115612a4457600080fd5b612a528f8b848a0101612bd7565b8486015285870135935080841115612a6957600080fd5b5050612a798d8984880101612bd7565b9083015250865250509282019290820190600101612904565b60008083601f840112612aa3578182fd5b50813567ffffffffffffffff811115612aba578182fd5b6020830191508360208083028501011115612ad457600080fd5b9250929050565b600082601f830112612aeb578081fd5b8151612af961282182613658565b818152915060208083019084810181840286018201871015612b1a57600080fd5b60005b8481101561286f57815184529282019290820190600101612b1d565b600082601f830112612b49578081fd5b8135612b5761282182613658565b818152915060208083019084810181840286018201871015612b7857600080fd5b60005b8481101561286f57813584529282019290820190600101612b7b565b60008083601f840112612ba8578182fd5b50813567ffffffffffffffff811115612bbf578182fd5b602083019150836020828501011115612ad457600080fd5b600082601f830112612be7578081fd5b8135612bf561282182613678565b9150808252836020828501011115612c0c57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112612c35578081fd5b8151612c4361282182613678565b9150808252836020828501011115612c5a57600080fd5b612c6b8160208401602086016136ba565b5092915050565b600060208284031215612c83578081fd5b81356114b6816136e6565b600060208284031215612c9f578081fd5b81516114b6816136e6565b60008060008060808587031215612cbf578283fd5b8451612cca816136e6565b602086015190945067ffffffffffffffff80821115612ce7578485fd5b612cf388838901612adb565b94506040870151915080821115612d08578384fd5b612d1488838901612adb565b93506060870151915080821115612d29578283fd5b50612d3687828801612c25565b91505092959194509250565b60008060008060008060008060a0898b031215612d5d578586fd5b8835612d68816136e6565b97506020890135612d78816136e6565b9650604089013567ffffffffffffffff80821115612d94578788fd5b612da08c838d01612a92565b909850965060608b0135915080821115612db8578586fd5b612dc48c838d01612a92565b909650945060808b0135915080821115612ddc578384fd5b50612de98b828c01612b97565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215612e15578384fd5b8635612e20816136e6565b95506020870135612e30816136e6565b94506040870135935060608701359250608087013567ffffffffffffffff811115612e59578283fd5b612e6589828a01612b97565b979a9699509497509295939492505050565b60008060008060808587031215612e8c578182fd5b843567ffffffffffffffff80821115612ea3578384fd5b612eaf888389016128d5565b95506020870135915080821115612ec4578384fd5b612ed08883890161287a565b94506040870135915080821115612ee5578384fd5b612ef188838901612b39565b93506060870135915080821115612f06578283fd5b50612d3687828801612803565b600080600080600060a08688031215612f2a578283fd5b853567ffffffffffffffff80821115612f41578485fd5b612f4d89838a016128d5565b9650602088013595506040880135915080821115612f69578485fd5b612f7589838a0161287a565b94506060880135915080821115612f8a578283fd5b612f9689838a01612b39565b93506080880135915080821115612fab578283fd5b50612fb888828901612803565b9150509295509295909350565b60008060408385031215612fd7578182fd5b825167ffffffffffffffff80821115612fee578384fd5b612ffa86838701612adb565b9350602091508185015181811115613010578384fd5b85019050601f81018613613022578283fd5b805161303061282182613658565b81815283810190838501865b84811015613065576130538b888451890101612c25565b8452928601929086019060010161303c565b5096999098509650505050505050565b60008060208385031215613087578182fd5b823567ffffffffffffffff81111561309d578283fd5b6130a985828601612b97565b90969095509350505050565b6000806000604084860312156130c9578081fd5b833567ffffffffffffffff8111156130df578182fd5b6130eb86828701612b97565b909790965060209590950135949350505050565b600060a08284031215613110578081fd5b61311a60a0613631565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b600060208284031215613161578081fd5b5051919050565b6000806040838503121561317a578182fd5b505080516020909101519092909150565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208401935060208301825b828110156131d65781518652602095860195909101906001016131b8565b5093949350505050565b600081518084526131f88160208601602086016136ba565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161323c8184602087016136ba565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526132c760a08301866131a5565b82810360608401526132d981866131a5565b83810360808501526132eb81866131e0565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6000602082526114b660208301846131e0565b606081016004851061339d57fe5b938152602081019290925260409091015290565b606081016008851061339d57fe5b6000606082526133d360608301865161318b565b60208501516133e5608084018261318b565b5060408501516133f860a084018261318b565b50606085015161340b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e088015192506101408381870152828901519350610160925083838701528189015193506101809150838287015280890151935050806101a08601525061347e6101e08501836131e0565b8188015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101c08601526134b981846131e0565b91505085602085015283810360408501526134d481866131e0565b979650505050505050565b6000606082526134f360608301865161318b565b6020850151613505608084018261318b565b50604085015161351860a084018261318b565b50606085015161352b60c084018261318b565b50608085015160e083015260a0850151610100818185015260c08701519150610120828186015260e0880151925061014083818701528289015193506101609250838387015281890151935061018091508382870152808901519350506101c06101a081818801526135a16102208801866131e0565b848b015195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa094508488820301838901526135dd81876131e0565b925050828a0151945083878303016101e08801526135fb82866131e0565b9250808a01519450505081858203016102008601526134b981846131e0565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561365057600080fd5b604052919050565b600067ffffffffffffffff82111561366e578081fd5b5060209081020190565b600067ffffffffffffffff82111561368e578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156136d55781810151838201526020016136bd565b838111156104c45750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461073457600080fdfea365627a7a72315820ebedf6ba0823da75dd29d928186748ec6baa07f40f145a90097baa22da29b56a6c6578706572696d656e74616cf564736f6c63430005100040" } } },