@venusprotocol/venus-protocol 7.6.0-dev.2 → 7.6.0-dev.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/artifacts/@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol/AccessControlledV8.dbg.json +1 -1
  2. package/artifacts/@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol/IAccessControlManagerV8.dbg.json +1 -1
  3. package/artifacts/@venusprotocol/oracle/contracts/interfaces/OracleInterface.sol/BoundValidatorInterface.dbg.json +1 -1
  4. package/artifacts/@venusprotocol/oracle/contracts/interfaces/OracleInterface.sol/OracleInterface.dbg.json +1 -1
  5. package/artifacts/@venusprotocol/oracle/contracts/interfaces/OracleInterface.sol/ResilientOracleInterface.dbg.json +1 -1
  6. package/artifacts/@venusprotocol/oracle/contracts/interfaces/OracleInterface.sol/TwapInterface.dbg.json +1 -1
  7. package/artifacts/@venusprotocol/solidity-utilities/contracts/MaxLoopsLimitHelper.sol/MaxLoopsLimitHelper.dbg.json +1 -1
  8. package/artifacts/@venusprotocol/solidity-utilities/contracts/TimeManagerV8.sol/TimeManagerV8.dbg.json +1 -1
  9. package/artifacts/build-info/{db82b17d0da6752b00ad696fe36aa8fb.json → f873604cc800d476500cd733aebbcd98.json} +1 -1
  10. package/artifacts/contracts/Admin/VBNBAdmin.sol/VBNBAdmin.dbg.json +1 -1
  11. package/artifacts/contracts/Admin/VBNBAdminStorage.sol/IProtocolShareReserve.dbg.json +1 -1
  12. package/artifacts/contracts/Admin/VBNBAdminStorage.sol/IWBNB.dbg.json +1 -1
  13. package/artifacts/contracts/Admin/VBNBAdminStorage.sol/VBNBAdminStorage.dbg.json +1 -1
  14. package/artifacts/contracts/Admin/VBNBAdminStorage.sol/VTokenInterface.dbg.json +1 -1
  15. package/artifacts/contracts/DelegateBorrowers/MoveDebtDelegate.sol/MoveDebtDelegate.dbg.json +1 -1
  16. package/artifacts/contracts/DelegateBorrowers/MoveDebtDelegate.sol/MoveDebtDelegate.json +2 -2
  17. package/artifacts/contracts/DelegateBorrowers/SwapDebtDelegate.sol/SwapDebtDelegate.dbg.json +1 -1
  18. package/artifacts/contracts/DelegateBorrowers/SwapDebtDelegate.sol/SwapDebtDelegate.json +2 -2
  19. package/artifacts/contracts/Governance/TokenRedeemer.sol/TokenRedeemer.dbg.json +1 -1
  20. package/artifacts/contracts/Governance/TokenRedeemer.sol/TokenRedeemer.json +71 -5
  21. package/artifacts/contracts/InterfacesV8.sol/IComptroller.dbg.json +1 -1
  22. package/artifacts/contracts/InterfacesV8.sol/ILiquidator.dbg.json +1 -1
  23. package/artifacts/contracts/InterfacesV8.sol/IProtocolShareReserve.dbg.json +1 -1
  24. package/artifacts/contracts/InterfacesV8.sol/IVAIController.dbg.json +1 -1
  25. package/artifacts/contracts/InterfacesV8.sol/IVBNB.dbg.json +1 -1
  26. package/artifacts/contracts/InterfacesV8.sol/IVBNB.json +83 -0
  27. package/artifacts/contracts/InterfacesV8.sol/IVBep20.dbg.json +1 -1
  28. package/artifacts/contracts/InterfacesV8.sol/IVBep20.json +52 -1
  29. package/artifacts/contracts/InterfacesV8.sol/IVToken.dbg.json +1 -1
  30. package/artifacts/contracts/InterfacesV8.sol/IVToken.json +70 -0
  31. package/artifacts/contracts/InterfacesV8.sol/IWBNB.dbg.json +1 -1
  32. package/artifacts/contracts/Liquidator/BUSDLiquidator.sol/BUSDLiquidator.dbg.json +1 -1
  33. package/artifacts/contracts/Liquidator/BUSDLiquidator.sol/BUSDLiquidator.json +2 -2
  34. package/artifacts/contracts/Liquidator/Liquidator.sol/Liquidator.dbg.json +1 -1
  35. package/artifacts/contracts/Liquidator/Liquidator.sol/Liquidator.json +2 -2
  36. package/artifacts/contracts/Liquidator/LiquidatorStorage.sol/LiquidatorStorage.dbg.json +1 -1
  37. package/artifacts/contracts/PegStability/IVAI.sol/IVAI.dbg.json +1 -1
  38. package/artifacts/contracts/PegStability/PegStability.sol/PegStability.dbg.json +1 -1
  39. package/artifacts/contracts/Swap/IRouterHelper.sol/IRouterHelper.dbg.json +1 -1
  40. package/artifacts/contracts/Swap/RouterHelper.sol/RouterHelper.dbg.json +1 -1
  41. package/artifacts/contracts/Swap/SwapRouter.sol/SwapRouter.dbg.json +1 -1
  42. package/artifacts/contracts/Swap/interfaces/IPancakePair.sol/IPancakePair.dbg.json +1 -1
  43. package/artifacts/contracts/Swap/interfaces/IPancakeSwapV2Factory.sol/IPancakeSwapV2Factory.dbg.json +1 -1
  44. package/artifacts/contracts/Swap/interfaces/IPancakeSwapV2Router.sol/IPancakeSwapV2Router.dbg.json +1 -1
  45. package/artifacts/contracts/Swap/interfaces/IVBNB.sol/IVBNB.dbg.json +1 -1
  46. package/artifacts/contracts/Swap/interfaces/IVtoken.sol/IVToken.dbg.json +1 -1
  47. package/artifacts/contracts/Swap/interfaces/IWBNB.sol/IWBNB.dbg.json +1 -1
  48. package/artifacts/contracts/Swap/interfaces/InterfaceComptroller.sol/InterfaceComptroller.dbg.json +1 -1
  49. package/artifacts/contracts/Swap/lib/PancakeLibrary.sol/PancakeLibrary.dbg.json +1 -1
  50. package/artifacts/contracts/Swap/lib/TransferHelper.sol/TransferHelper.dbg.json +1 -1
  51. package/artifacts/contracts/Tokens/Prime/Interfaces/IPoolRegistry.sol/PoolRegistryInterface.dbg.json +1 -1
  52. package/artifacts/contracts/Tokens/Prime/Interfaces/IPrime.sol/IPrime.dbg.json +1 -1
  53. package/artifacts/contracts/Tokens/Prime/Interfaces/IPrimeLiquidityProvider.sol/IPrimeLiquidityProvider.dbg.json +1 -1
  54. package/artifacts/contracts/Tokens/Prime/Interfaces/IVToken.sol/IVToken.dbg.json +1 -1
  55. package/artifacts/contracts/Tokens/Prime/Interfaces/IXVSVault.sol/IXVSVault.dbg.json +1 -1
  56. package/artifacts/contracts/Tokens/Prime/Interfaces/InterfaceComptroller.sol/InterfaceComptroller.dbg.json +1 -1
  57. package/artifacts/contracts/Tokens/Prime/Prime.sol/Prime.dbg.json +1 -1
  58. package/artifacts/contracts/Tokens/Prime/PrimeLiquidityProvider.sol/PrimeLiquidityProvider.dbg.json +1 -1
  59. package/artifacts/contracts/Tokens/Prime/PrimeLiquidityProviderStorage.sol/PrimeLiquidityProviderStorageV1.dbg.json +1 -1
  60. package/artifacts/contracts/Tokens/Prime/PrimeStorage.sol/PrimeStorageV1.dbg.json +1 -1
  61. package/artifacts/contracts/Tokens/Prime/libs/FixedMath.sol/FixedMath.dbg.json +1 -1
  62. package/artifacts/contracts/Tokens/Prime/libs/FixedMath0x.sol/FixedMath0x.dbg.json +1 -1
  63. package/artifacts/contracts/Tokens/Prime/libs/Scores.sol/Scores.dbg.json +1 -1
  64. package/artifacts/contracts/lib/Currency.sol/CurrencyLibrary.dbg.json +4 -0
  65. package/artifacts/contracts/lib/Currency.sol/CurrencyLibrary.json +29 -0
  66. package/artifacts/contracts/test/AccessControlManagerMock.sol/AccessControlManagerMock.dbg.json +1 -1
  67. package/artifacts/contracts/test/LiquidatorHarness.sol/LiquidatorHarness.dbg.json +1 -1
  68. package/artifacts/contracts/test/LiquidatorHarness.sol/LiquidatorHarness.json +2 -2
  69. package/artifacts/contracts/test/MockProtocolShareReserve.sol/IComptroller.dbg.json +1 -1
  70. package/artifacts/contracts/test/MockProtocolShareReserve.sol/IIncomeDestination.dbg.json +1 -1
  71. package/artifacts/contracts/test/MockProtocolShareReserve.sol/IMockProtocolShareReserve.dbg.json +1 -1
  72. package/artifacts/contracts/test/MockProtocolShareReserve.sol/IPoolRegistry.dbg.json +1 -1
  73. package/artifacts/contracts/test/MockProtocolShareReserve.sol/IPrime.dbg.json +1 -1
  74. package/artifacts/contracts/test/MockProtocolShareReserve.sol/IVToken.dbg.json +1 -1
  75. package/artifacts/contracts/test/MockProtocolShareReserve.sol/MaxLoopsLimitHelper.dbg.json +1 -1
  76. package/artifacts/contracts/test/MockProtocolShareReserve.sol/MockProtocolShareReserve.dbg.json +1 -1
  77. package/artifacts/contracts/test/PrimeScenario.sol/PrimeScenario.dbg.json +1 -1
  78. package/contracts/Governance/TokenRedeemer.sol +126 -20
  79. package/contracts/InterfacesV8.sol +10 -2
  80. package/contracts/lib/Currency.sol +82 -0
  81. package/deploy/012-deploy-token-redeemer.ts +2 -1
  82. package/deployments/bscmainnet/TokenRedeemer.json +105 -34
  83. package/deployments/bscmainnet.json +70 -4
  84. package/deployments/bscmainnet_addresses.json +1 -1
  85. package/dist/deploy/012-deploy-token-redeemer.js +2 -1
  86. package/dist/deployments/bscmainnet.json +70 -4
  87. package/dist/deployments/bscmainnet_addresses.json +1 -1
  88. package/dist/typechain/contracts/Governance/TokenRedeemer.d.ts +29 -1
  89. package/dist/typechain/contracts/InterfacesV8.sol/IVBNB.d.ts +73 -1
  90. package/dist/typechain/contracts/InterfacesV8.sol/IVBep20.d.ts +46 -6
  91. package/dist/typechain/contracts/InterfacesV8.sol/IVToken.d.ts +57 -1
  92. package/dist/typechain/contracts/index.d.ts +2 -0
  93. package/dist/typechain/contracts/lib/Currency.sol/CurrencyLibrary.d.ts +42 -0
  94. package/dist/typechain/contracts/lib/Currency.sol/CurrencyLibrary.js +3 -0
  95. package/dist/typechain/contracts/lib/Currency.sol/index.d.ts +1 -0
  96. package/dist/typechain/contracts/lib/Currency.sol/index.js +2 -0
  97. package/dist/typechain/contracts/lib/index.d.ts +2 -0
  98. package/dist/typechain/contracts/lib/index.js +3 -0
  99. package/dist/typechain/factories/contracts/DelegateBorrowers/MoveDebtDelegate__factory.d.ts +1 -1
  100. package/dist/typechain/factories/contracts/DelegateBorrowers/MoveDebtDelegate__factory.js +1 -1
  101. package/dist/typechain/factories/contracts/DelegateBorrowers/SwapDebtDelegate__factory.d.ts +1 -1
  102. package/dist/typechain/factories/contracts/DelegateBorrowers/SwapDebtDelegate__factory.js +1 -1
  103. package/dist/typechain/factories/contracts/Governance/TokenRedeemer__factory.d.ts +57 -6
  104. package/dist/typechain/factories/contracts/Governance/TokenRedeemer__factory.js +74 -8
  105. package/dist/typechain/factories/contracts/InterfacesV8.sol/IVBNB__factory.d.ts +62 -0
  106. package/dist/typechain/factories/contracts/InterfacesV8.sol/IVBNB__factory.js +83 -0
  107. package/dist/typechain/factories/contracts/InterfacesV8.sol/IVBep20__factory.d.ts +39 -1
  108. package/dist/typechain/factories/contracts/InterfacesV8.sol/IVBep20__factory.js +52 -1
  109. package/dist/typechain/factories/contracts/InterfacesV8.sol/IVToken__factory.d.ts +52 -0
  110. package/dist/typechain/factories/contracts/InterfacesV8.sol/IVToken__factory.js +70 -0
  111. package/dist/typechain/factories/contracts/Liquidator/BUSDLiquidator__factory.d.ts +1 -1
  112. package/dist/typechain/factories/contracts/Liquidator/BUSDLiquidator__factory.js +1 -1
  113. package/dist/typechain/factories/contracts/Liquidator/Liquidator__factory.d.ts +1 -1
  114. package/dist/typechain/factories/contracts/Liquidator/Liquidator__factory.js +1 -1
  115. package/dist/typechain/factories/contracts/index.d.ts +1 -0
  116. package/dist/typechain/factories/contracts/index.js +2 -1
  117. package/dist/typechain/factories/contracts/lib/Currency.sol/CurrencyLibrary__factory.d.ts +35 -0
  118. package/dist/typechain/factories/contracts/lib/Currency.sol/CurrencyLibrary__factory.js +58 -0
  119. package/dist/typechain/factories/contracts/lib/Currency.sol/index.d.ts +1 -0
  120. package/dist/typechain/factories/contracts/lib/Currency.sol/index.js +8 -0
  121. package/dist/typechain/factories/contracts/lib/index.d.ts +1 -0
  122. package/dist/typechain/factories/contracts/lib/index.js +30 -0
  123. package/dist/typechain/factories/contracts/test/LiquidatorHarness__factory.d.ts +1 -1
  124. package/dist/typechain/factories/contracts/test/LiquidatorHarness__factory.js +1 -1
  125. package/dist/typechain/index.d.ts +2 -0
  126. package/dist/typechain/index.js +6 -4
  127. package/package.json +1 -1
@@ -1029,8 +1029,8 @@
1029
1029
  "type": "receive"
1030
1030
  }
1031
1031
  ],
1032
- "bytecode": "0x6101006040523480156200001257600080fd5b50604051620034f5380380620034f58339810160408190526200003591620001fa565b8282826200004382620000f8565b6200004e83620000f8565b6200005981620000f8565b6001600160a01b0380831660805281811660e052831660a081905260408051639254f5e560e01b81529051639254f5e5916004808201926020929091908290030181865afa158015620000b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d691906200024e565b6001600160a01b031660c052620000ec62000123565b50505050505062000275565b6001600160a01b03811662000120576040516342bcdf7f60e11b815260040160405180910390fd5b50565b600054610100900460ff1615620001905760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620001e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200012057600080fd5b6000806000606084860312156200021057600080fd5b83516200021d81620001e4565b60208501519093506200023081620001e4565b60408501519092506200024381620001e4565b809150509250925092565b6000602082840312156200026157600080fd5b81516200026e81620001e4565b9392505050565b60805160a05160c05160e05161319e620003576000396000818161059f015281816125ca0152818161264b015281816126c1015261272c01526000818161047d01528181610b8a01528181611720015281816117c2015281816118fe0152818161196901528181611a0f01528181611a440152611a9a01526000818161035d01528181610963015281816117930152818161186601528181611b3d015281816120cf015281816121d70152818161269f015261289801526000818161031101528181610a7601528181610afd01528181611e770152611f91015261319e6000f3fe6080604052600436106101f25760003560e01c80638da5cb5b1161010d578063b8332db7116100a0578063e9a44fd91161006f578063e9a44fd9146105df578063f2531ea1146105ff578063f2fde38b1461061f578063f52421b31461063f578063f7dcd96e1461065f57600080fd5b8063b8332db714610543578063bbd98d7014610558578063d02eb3f41461058d578063e30c3978146105c157600080fd5b8063b09c7742116100dc578063b09c7742146104bf578063b26461de146104d4578063b4988fd014610504578063b4a0bdf31461052457600080fd5b80638da5cb5b146104375780638e3525fc146104555780639254f5e51461046b578063a093796a1461049f57600080fd5b80635fe3b567116101855780637debe3fe116101545780637debe3fe146103b35780638722ddf2146103d35780638765adcb146103f757806389a2bc251461041757600080fd5b80635fe3b5671461034b57806364fd70781461037f578063715018a61461039257806379ba50971461039e57600080fd5b806336eab4ae116101c157806336eab4ae1461027557806344b3716a146102a457806347a6a971146102df5780635ba3792d146102ff57600080fd5b80630d060ea8146101fe5780630e32cb8614610215578063107568df1461023557806311ec4b7a1461025557600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067f565b005b34801561022157600080fd5b50610213610230366004612ce5565b61075e565b34801561024157600080fd5b50610213610250366004612ce5565b610772565b34801561026157600080fd5b50610213610270366004612ce5565b610783565b34801561028157600080fd5b5060cd5461028f9060ff1681565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5061028f6102bf366004612d09565b60ca60209081526000928352604080842090915290825290205460ff1681565b3480156102eb57600080fd5b506102136102fa366004612d09565b610852565b34801561030b57600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b34801561035757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b61021361038d366004612d42565b610926565b34801561021357600080fd5b3480156103aa57600080fd5b50610213610ce3565b3480156103bf57600080fd5b506102136103ce366004612d09565b610d5a565b3480156103df57600080fd5b506103e960cc5481565b60405190815260200161029b565b34801561040357600080fd5b50610213610412366004612ce5565b610e4f565b34801561042357600080fd5b50610213610432366004612d95565b610f1a565b34801561044357600080fd5b506033546001600160a01b0316610333565b34801561046157600080fd5b506103e960c95481565b34801561047757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ab57600080fd5b506102136104ba366004612d95565b610fa2565b3480156104cb57600080fd5b50610213611049565b3480156104e057600080fd5b5061028f6104ef366004612ce5565b60cb6020526000908152604090205460ff1681565b34801561051057600080fd5b5061021361051f366004612dae565b611128565b34801561053057600080fd5b50610102546001600160a01b0316610333565b34801561054f57600080fd5b5061021361123e565b34801561056457600080fd5b50610578610573366004612df0565b611258565b6040805192835260208301919091520161029b565b34801561059957600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156105cd57600080fd5b506065546001600160a01b0316610333565b3480156105eb57600080fd5b5060cf54610333906001600160a01b031681565b34801561060b57600080fd5b5061057861061a366004612d95565b6112ac565b34801561062b57600080fd5b5061021361063a366004612ce5565b6112c1565b34801561064b57600080fd5b5061021361065a366004612d95565b611332565b34801561066b57600080fd5b5061033361067a366004612d95565b6113b1565b6106bd6040518060400160405280601881526020017f7061757365466f7263655641494c6971756964617465282900000000000000008152506113db565b60cd5460ff166107275760405162461bcd60e51b815260206004820152602a60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526918591e4814185d5cd95960b21b60648201526084015b60405180910390fd5b60cd805460ff1916905560405133907f42388332be4beb2ad2ff83017119b9d702ce7fbaf67e18e53a137508cf967e4390600090a2565b61076661147a565b61076f816114d4565b50565b61077a61147a565b61076f8161159a565b6107c16040518060400160405280601c81526020017f72657374726963744c69717569646174696f6e286164647265737329000000008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16156108065760405163404fe9fb60e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19166001179055517f614c47c82976e8f145409efb6366fe2cefa323f389ed9354649262e38dbb35899190a250565b610873604051806060016040528060248152602001613121602491396113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff166108cc5760405163435aad4360e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19169055517f6b0d38eafddac0d37e0aff8f4bbd5f3a3cfe124b8eabea27558bffc931ac05b59190a35050565b61092e6115ff565b61093783611658565b610941833361167f565b604051638e8f294b60e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612e31565b50509050806109fd57604051635a9a1eb960e11b81526001600160a01b038316600482015260240161071e565b610a0785856116fe565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a729190612e6d565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610b6057348414610ad65760405163dd97100160e01b81526004810185905234602482015260440161071e565b604051635572051560e11b81526001600160a01b03868116600483015284811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063aae40a2a9034906044016000604051808303818588803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b5050505050610bdd565b3415610b885760405163dd97100160e01b81526000600482015234602482015260440161071e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610bd157610bcc858585611965565b610bdd565b610bdd86868686611b1b565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612e6d565b90506000610c568383612e9c565b9050600080610c658784611d04565b91509150610c71611ec4565b604080518981526001600160a01b038c8116602083015291810184905260608101839052818916918b169033907fdd091524d794aecdb5235b2d816620c2598790835e0f3849808504c2dcb4f1a99060800160405180910390a4505050505050610cdb6001609755565b50505050565b565b60655433906001600160a01b03168114610d515760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161071e565b61076f816120a9565b610d986040518060400160405280601f81526020017f616464546f416c6c6f776c69737428616464726573732c6164647265737329008152506113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff1615610df25760405163071df39160e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19166001179055517ffe40417b78788808c927141f806ef5082e7bba0f7790f2e85b811621a91094339190a35050565b610e8d6040518060400160405280601e81526020017f756e72657374726963744c69717569646174696f6e28616464726573732900008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16610ed157604051633bf9d98960e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19169055517fe1f03de94d16c262d2f0e89a1c42ede8899d540ac992cf53495a5cf29c2896af9190a250565b610f586040518060400160405280601b81526020017f736574547265617375727950657263656e742875696e743235362900000000008152506113db565b610f61816120c2565b60c95460408051918252602082018390527f0e9a1641744b21c49e4183ab9ce941d420e05a05a446c71875fb07814f362c1a910160405180910390a160c955565b610fc3604051806060016040528060248152602001613145602491396113db565b600081116110085760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206368756e6b2073697a6560701b604482015260640161071e565b60d05460408051918252602082018390527fe5eef53e396f0cb79322e15e72b6c6613ae3e62c9079f5a12f2c410867c28b2c910160405180910390a160d055565b6110876040518060400160405280601981526020017f726573756d65466f7263655641494c69717569646174652829000000000000008152506113db565b60cd5460ff16156110ee5760405162461bcd60e51b815260206004820152602b60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526a18591e481c995cdd5b595960aa1b606482015260840161071e565b60cd805460ff1916600117905560405133907fd4b8f320ada24d048ee6c25c53a31aa20b2ea37fa25542e6e239c80d31d5b60b90600090a2565b600054610100900460ff16158080156111485750600054600160ff909116105b806111625750303b158015611162575060005460ff166001145b6111c55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071e565b6000805460ff1916600117905580156111e8576000805461ff0019166101001790555b6111f3848484612186565b8015610cdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6112466115ff565b61124e611ec4565b610ce16001609755565b6000806112658484611d04565b60408051838152602081018390529294509092507f965c73d6a816dcbe4cc33516168787cb029afb2156ec3372a16e8c6cfbbe6e22910160405180910390a15b9250929050565b6000806112b8836121d0565b91509150915091565b6112c961147a565b606580546001600160a01b0383166001600160a01b031990911681179091556112fa6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6113706040518060400160405280601e81526020017f7365744d696e4c6971756964617461626c655641492875696e743235362900008152506113db565b60cc5460408051918252602082018390527f8df018dc5fe866d192a3f4d9f16dbfdb38f58a7470a65b92262ccc008c55fff0910160405180910390a160cc55565b60ce81815481106113c157600080fd5b6000918252602090912001546001600160a01b0316905081565b610102546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab9061140f9033908690600401612f0b565b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114509190612f2f565b90508061147657333083604051634a3fa29360e01b815260040161071e93929190612f4a565b5050565b6033546001600160a01b03163314610ce15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071e565b6001600160a01b0381166115385760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161071e565b61010280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910160405180910390a15050565b6115a381611658565b60cf546040516001600160a01b038084169216907fafec95c8612496c3ecf5dddc71e393528fe29bd145fbaf9c6b496d78d7e2d79b90600090a360cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6002609754036116515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071e565b6002609755565b6001600160a01b03811661076f576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038216600090815260cb602052604090205460ff1680156116cd57506001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff16155b156114765760405163074c80eb60e51b81526001600160a01b0380841660048301528216602482015260440161071e565b604051633c617c9160e11b81526001600160a01b0382811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906378c2f92290602401602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190612e6d565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e85a29607f000000000000000000000000000000000000000000000000000000000000000060056040518363ffffffff1660e01b8152600401611800929190612f95565b602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190612f2f565b60405163460d60c560e11b81526001600160a01b0386811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690638c1ac18a90602401602060405180830381865afa1580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d19190612f2f565b905080806118dc5750815b806118ea575060cd5460ff16155b806118f6575060cc5483105b8061193257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b1561193e575050505050565b60cc546040516329eb1e8760e01b815261071e918591600401918252602082015260400190565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cbeb2b286040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190612fc2565b9050611a006001600160a01b038216333086612286565b611a356001600160a01b0382167f000000000000000000000000000000000000000000000000000000000000000060006122f1565b611a696001600160a01b0382167f0000000000000000000000000000000000000000000000000000000000000000856122f1565b6040516311b3d5e760e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906311b3d5e79060640160408051808303816000875af1158015611ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b089190612fdf565b509050611b1481612406565b5050505050565b604051638e8f294b60e01b81526001600160a01b0385811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa158015611b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611baa9190612e31565b5050905080611bd757604051635a9a1eb960e11b81526001600160a01b038616600482015260240161071e565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b9190612fc2565b90506000611c4b8233308861242a565b9050611c626001600160a01b0383168860006122f1565b611c766001600160a01b03831688836122f1565b604051637af1e23160e11b81526001600160a01b038781166004830152602482018390528581166044830152611cfb919089169063f5e3c462906064016020604051808303816000875af1158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190612e6d565b612406565b50505050505050565b600080611d10836121d0565b60405163a9059cbb60e01b81523360048201526024810182905291935091506001600160a01b0385169063a9059cbb906044016020604051808303816000875af1158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d869190612f2f565b611db25760405163241165bb60e21b81523060048201523360248201526044810182905260640161071e565b600082118015611dc95750611dc78483612533565b155b15611e755760005b60ce54811015611e1a57846001600160a01b031660ce8281548110611df857611df8613003565b6000918252602090912001546001600160a01b031614611e1a57600101611dd1565b60ce548103611e6f5760ce80546001810182556000919091527fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a0180546001600160a01b0319166001600160a01b0387161790555b506112a5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603611ebb57611eb66125c3565b6112a5565b6112a584612781565b60ce5460d054600090821015611eda5781611ede565b60d0545b9050805b801561209d57600060ce611ef7600184612e9c565b81548110611f0757611f07613003565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015611f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7e9190612e6d565b9050611f8a8282612533565b15612092577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611fd557611fd06125c3565b611fde565b611fde82612781565b60ce8054611fee90600190612e9c565b81548110611ffe57611ffe613003565b6000918252602090912001546001600160a01b031660ce612020600186612e9c565b8154811061203057612030613003565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060ce80548061206f5761206f613019565b600082815260209020810160001990810180546001600160a01b03191690550190555b505060001901611ee2565b505050565b6001609755565b606580546001600160a01b031916905561076f8161293c565b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214f9190612e6d565b6121599190612e9c565b90508082111561147657604051635659cb3b60e01b8152600481018290526024810183905260440161071e565b600054610100900460ff166121ad5760405162461bcd60e51b815260040161071e9061302f565b6121b561298e565b6121bd6129bd565b6121c783826129ec565b61209d82612a2a565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122579190612e6d565b90508060c95485612268919061307a565b6122729190613099565b925061227e8385612e9c565b915050915091565b6040516001600160a01b0380851660248301528316604482015260648101829052610cdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a51565b80158061236b5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123699190612e6d565b155b6123d65760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063095ea7b360e01b906064016122ba565b8061240e5750565b60405163125a96ab60e01b81526004810182905260240161071e565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182918716906370a0823190602401602060405180830381865afa158015612475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124999190612e6d565b90506124b06001600160a01b038716868686612286565b6040516370a0823160e01b81526001600160a01b0385811660048301528291908816906370a0823190602401602060405180830381865afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190612e6d565b6125279190612e9c565b9150505b949350505050565b60405163db006a7560e01b8152600481018290526000906001600160a01b0384169063db006a75906024016020604051808303816000875af1925050508015612599575060408051601f3d908101601f1916820190925261259691810190612e6d565b60015b6125a5575060006125bd565b806000036125b75760019150506125bd565b60009150505b92915050565b60004790507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262357600080fd5b505af1158015612637573d6000803e3d6000fd5b505060cf5461267793506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116935016905083612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906126ec907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001906004016130bb565b600060405180830381600087803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b50506040518381526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a350565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e59190612fc2565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561282f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128539190612e6d565b60cf54909150612870906001600160a01b03848116911683612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906128c5907f00000000000000000000000000000000000000000000000000000000000000009086906001906004016130bb565b600060405180830381600087803b1580156128df57600080fd5b505af11580156128f3573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a3505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166129b55760405162461bcd60e51b815260040161071e9061302f565b610ce1612b56565b600054610100900460ff166129e45760405162461bcd60e51b815260040161071e9061302f565b610ce1612b86565b600054610100900460ff16612a135760405162461bcd60e51b815260040161071e9061302f565b612a1c826120c2565b60c98290556114768161159a565b600054610100900460ff166107665760405162461bcd60e51b815260040161071e9061302f565b6000612aa6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612bad9092919063ffffffff16565b9050805160001480612ac7575080806020019051810190612ac79190612f2f565b61209d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063a9059cbb60e01b906064016122ba565b600054610100900460ff16612b7d5760405162461bcd60e51b815260040161071e9061302f565b610ce1336120a9565b600054610100900460ff166120a25760405162461bcd60e51b815260040161071e9061302f565b606061252b848460008585600080866001600160a01b03168587604051612bd491906130f1565b60006040518083038185875af1925050503d8060008114612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b5091509150612c2787838387612c32565b979650505050505050565b60608315612ca1578251600003612c9a576001600160a01b0385163b612c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161071e565b508161252b565b61252b8383815115612cb65781518083602001fd5b8060405162461bcd60e51b815260040161071e919061310d565b6001600160a01b038116811461076f57600080fd5b600060208284031215612cf757600080fd5b8135612d0281612cd0565b9392505050565b60008060408385031215612d1c57600080fd5b8235612d2781612cd0565b91506020830135612d3781612cd0565b809150509250929050565b60008060008060808587031215612d5857600080fd5b8435612d6381612cd0565b93506020850135612d7381612cd0565b9250604085013591506060850135612d8a81612cd0565b939692955090935050565b600060208284031215612da757600080fd5b5035919050565b600080600060608486031215612dc357600080fd5b833592506020840135612dd581612cd0565b91506040840135612de581612cd0565b809150509250925092565b60008060408385031215612e0357600080fd5b8235612e0e81612cd0565b946020939093013593505050565b80518015158114612e2c57600080fd5b919050565b600080600060608486031215612e4657600080fd5b612e4f84612e1c565b925060208401519150612e6460408501612e1c565b90509250925092565b600060208284031215612e7f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612eae57612eae612e86565b500390565b60005b83811015612ece578181015183820152602001612eb6565b83811115610cdb5750506000910152565b60008151808452612ef7816020860160208601612eb3565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061252b90830184612edf565b600060208284031215612f4157600080fd5b612d0282612e1c565b6001600160a01b03848116825283166020820152606060408201819052600090612f7690830184612edf565b95945050505050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b03831681526040810160098310612fb557612fb5612f7f565b8260208301529392505050565b600060208284031215612fd457600080fd5b8151612d0281612cd0565b60008060408385031215612ff257600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600081600019048311821515161561309457613094612e86565b500290565b6000826130b657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0384811682528316602082015260608101600283106130e3576130e3612f7f565b826040830152949350505050565b60008251613103818460208701612eb3565b9190910192915050565b602081526000612d026020830184612edf56fe72656d6f766546726f6d416c6c6f776c69737428616464726573732c616464726573732973657450656e64696e6752656465656d4368756e6b4c656e6774682875696e7432353629a264697066735822122031ffa44e37df8deda22f81e767db2e6d3d68948f4afc968bcba1d17f046a6daf64736f6c634300080d0033",
1033
- "deployedBytecode": "0x6080604052600436106101f25760003560e01c80638da5cb5b1161010d578063b8332db7116100a0578063e9a44fd91161006f578063e9a44fd9146105df578063f2531ea1146105ff578063f2fde38b1461061f578063f52421b31461063f578063f7dcd96e1461065f57600080fd5b8063b8332db714610543578063bbd98d7014610558578063d02eb3f41461058d578063e30c3978146105c157600080fd5b8063b09c7742116100dc578063b09c7742146104bf578063b26461de146104d4578063b4988fd014610504578063b4a0bdf31461052457600080fd5b80638da5cb5b146104375780638e3525fc146104555780639254f5e51461046b578063a093796a1461049f57600080fd5b80635fe3b567116101855780637debe3fe116101545780637debe3fe146103b35780638722ddf2146103d35780638765adcb146103f757806389a2bc251461041757600080fd5b80635fe3b5671461034b57806364fd70781461037f578063715018a61461039257806379ba50971461039e57600080fd5b806336eab4ae116101c157806336eab4ae1461027557806344b3716a146102a457806347a6a971146102df5780635ba3792d146102ff57600080fd5b80630d060ea8146101fe5780630e32cb8614610215578063107568df1461023557806311ec4b7a1461025557600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067f565b005b34801561022157600080fd5b50610213610230366004612ce5565b61075e565b34801561024157600080fd5b50610213610250366004612ce5565b610772565b34801561026157600080fd5b50610213610270366004612ce5565b610783565b34801561028157600080fd5b5060cd5461028f9060ff1681565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5061028f6102bf366004612d09565b60ca60209081526000928352604080842090915290825290205460ff1681565b3480156102eb57600080fd5b506102136102fa366004612d09565b610852565b34801561030b57600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b34801561035757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b61021361038d366004612d42565b610926565b34801561021357600080fd5b3480156103aa57600080fd5b50610213610ce3565b3480156103bf57600080fd5b506102136103ce366004612d09565b610d5a565b3480156103df57600080fd5b506103e960cc5481565b60405190815260200161029b565b34801561040357600080fd5b50610213610412366004612ce5565b610e4f565b34801561042357600080fd5b50610213610432366004612d95565b610f1a565b34801561044357600080fd5b506033546001600160a01b0316610333565b34801561046157600080fd5b506103e960c95481565b34801561047757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ab57600080fd5b506102136104ba366004612d95565b610fa2565b3480156104cb57600080fd5b50610213611049565b3480156104e057600080fd5b5061028f6104ef366004612ce5565b60cb6020526000908152604090205460ff1681565b34801561051057600080fd5b5061021361051f366004612dae565b611128565b34801561053057600080fd5b50610102546001600160a01b0316610333565b34801561054f57600080fd5b5061021361123e565b34801561056457600080fd5b50610578610573366004612df0565b611258565b6040805192835260208301919091520161029b565b34801561059957600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156105cd57600080fd5b506065546001600160a01b0316610333565b3480156105eb57600080fd5b5060cf54610333906001600160a01b031681565b34801561060b57600080fd5b5061057861061a366004612d95565b6112ac565b34801561062b57600080fd5b5061021361063a366004612ce5565b6112c1565b34801561064b57600080fd5b5061021361065a366004612d95565b611332565b34801561066b57600080fd5b5061033361067a366004612d95565b6113b1565b6106bd6040518060400160405280601881526020017f7061757365466f7263655641494c6971756964617465282900000000000000008152506113db565b60cd5460ff166107275760405162461bcd60e51b815260206004820152602a60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526918591e4814185d5cd95960b21b60648201526084015b60405180910390fd5b60cd805460ff1916905560405133907f42388332be4beb2ad2ff83017119b9d702ce7fbaf67e18e53a137508cf967e4390600090a2565b61076661147a565b61076f816114d4565b50565b61077a61147a565b61076f8161159a565b6107c16040518060400160405280601c81526020017f72657374726963744c69717569646174696f6e286164647265737329000000008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16156108065760405163404fe9fb60e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19166001179055517f614c47c82976e8f145409efb6366fe2cefa323f389ed9354649262e38dbb35899190a250565b610873604051806060016040528060248152602001613121602491396113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff166108cc5760405163435aad4360e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19169055517f6b0d38eafddac0d37e0aff8f4bbd5f3a3cfe124b8eabea27558bffc931ac05b59190a35050565b61092e6115ff565b61093783611658565b610941833361167f565b604051638e8f294b60e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612e31565b50509050806109fd57604051635a9a1eb960e11b81526001600160a01b038316600482015260240161071e565b610a0785856116fe565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a729190612e6d565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610b6057348414610ad65760405163dd97100160e01b81526004810185905234602482015260440161071e565b604051635572051560e11b81526001600160a01b03868116600483015284811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063aae40a2a9034906044016000604051808303818588803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b5050505050610bdd565b3415610b885760405163dd97100160e01b81526000600482015234602482015260440161071e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610bd157610bcc858585611965565b610bdd565b610bdd86868686611b1b565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612e6d565b90506000610c568383612e9c565b9050600080610c658784611d04565b91509150610c71611ec4565b604080518981526001600160a01b038c8116602083015291810184905260608101839052818916918b169033907fdd091524d794aecdb5235b2d816620c2598790835e0f3849808504c2dcb4f1a99060800160405180910390a4505050505050610cdb6001609755565b50505050565b565b60655433906001600160a01b03168114610d515760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161071e565b61076f816120a9565b610d986040518060400160405280601f81526020017f616464546f416c6c6f776c69737428616464726573732c6164647265737329008152506113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff1615610df25760405163071df39160e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19166001179055517ffe40417b78788808c927141f806ef5082e7bba0f7790f2e85b811621a91094339190a35050565b610e8d6040518060400160405280601e81526020017f756e72657374726963744c69717569646174696f6e28616464726573732900008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16610ed157604051633bf9d98960e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19169055517fe1f03de94d16c262d2f0e89a1c42ede8899d540ac992cf53495a5cf29c2896af9190a250565b610f586040518060400160405280601b81526020017f736574547265617375727950657263656e742875696e743235362900000000008152506113db565b610f61816120c2565b60c95460408051918252602082018390527f0e9a1641744b21c49e4183ab9ce941d420e05a05a446c71875fb07814f362c1a910160405180910390a160c955565b610fc3604051806060016040528060248152602001613145602491396113db565b600081116110085760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206368756e6b2073697a6560701b604482015260640161071e565b60d05460408051918252602082018390527fe5eef53e396f0cb79322e15e72b6c6613ae3e62c9079f5a12f2c410867c28b2c910160405180910390a160d055565b6110876040518060400160405280601981526020017f726573756d65466f7263655641494c69717569646174652829000000000000008152506113db565b60cd5460ff16156110ee5760405162461bcd60e51b815260206004820152602b60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526a18591e481c995cdd5b595960aa1b606482015260840161071e565b60cd805460ff1916600117905560405133907fd4b8f320ada24d048ee6c25c53a31aa20b2ea37fa25542e6e239c80d31d5b60b90600090a2565b600054610100900460ff16158080156111485750600054600160ff909116105b806111625750303b158015611162575060005460ff166001145b6111c55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071e565b6000805460ff1916600117905580156111e8576000805461ff0019166101001790555b6111f3848484612186565b8015610cdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6112466115ff565b61124e611ec4565b610ce16001609755565b6000806112658484611d04565b60408051838152602081018390529294509092507f965c73d6a816dcbe4cc33516168787cb029afb2156ec3372a16e8c6cfbbe6e22910160405180910390a15b9250929050565b6000806112b8836121d0565b91509150915091565b6112c961147a565b606580546001600160a01b0383166001600160a01b031990911681179091556112fa6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6113706040518060400160405280601e81526020017f7365744d696e4c6971756964617461626c655641492875696e743235362900008152506113db565b60cc5460408051918252602082018390527f8df018dc5fe866d192a3f4d9f16dbfdb38f58a7470a65b92262ccc008c55fff0910160405180910390a160cc55565b60ce81815481106113c157600080fd5b6000918252602090912001546001600160a01b0316905081565b610102546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab9061140f9033908690600401612f0b565b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114509190612f2f565b90508061147657333083604051634a3fa29360e01b815260040161071e93929190612f4a565b5050565b6033546001600160a01b03163314610ce15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071e565b6001600160a01b0381166115385760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161071e565b61010280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910160405180910390a15050565b6115a381611658565b60cf546040516001600160a01b038084169216907fafec95c8612496c3ecf5dddc71e393528fe29bd145fbaf9c6b496d78d7e2d79b90600090a360cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6002609754036116515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071e565b6002609755565b6001600160a01b03811661076f576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038216600090815260cb602052604090205460ff1680156116cd57506001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff16155b156114765760405163074c80eb60e51b81526001600160a01b0380841660048301528216602482015260440161071e565b604051633c617c9160e11b81526001600160a01b0382811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906378c2f92290602401602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190612e6d565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e85a29607f000000000000000000000000000000000000000000000000000000000000000060056040518363ffffffff1660e01b8152600401611800929190612f95565b602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190612f2f565b60405163460d60c560e11b81526001600160a01b0386811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690638c1ac18a90602401602060405180830381865afa1580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d19190612f2f565b905080806118dc5750815b806118ea575060cd5460ff16155b806118f6575060cc5483105b8061193257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b1561193e575050505050565b60cc546040516329eb1e8760e01b815261071e918591600401918252602082015260400190565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cbeb2b286040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190612fc2565b9050611a006001600160a01b038216333086612286565b611a356001600160a01b0382167f000000000000000000000000000000000000000000000000000000000000000060006122f1565b611a696001600160a01b0382167f0000000000000000000000000000000000000000000000000000000000000000856122f1565b6040516311b3d5e760e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906311b3d5e79060640160408051808303816000875af1158015611ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b089190612fdf565b509050611b1481612406565b5050505050565b604051638e8f294b60e01b81526001600160a01b0385811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa158015611b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611baa9190612e31565b5050905080611bd757604051635a9a1eb960e11b81526001600160a01b038616600482015260240161071e565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b9190612fc2565b90506000611c4b8233308861242a565b9050611c626001600160a01b0383168860006122f1565b611c766001600160a01b03831688836122f1565b604051637af1e23160e11b81526001600160a01b038781166004830152602482018390528581166044830152611cfb919089169063f5e3c462906064016020604051808303816000875af1158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190612e6d565b612406565b50505050505050565b600080611d10836121d0565b60405163a9059cbb60e01b81523360048201526024810182905291935091506001600160a01b0385169063a9059cbb906044016020604051808303816000875af1158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d869190612f2f565b611db25760405163241165bb60e21b81523060048201523360248201526044810182905260640161071e565b600082118015611dc95750611dc78483612533565b155b15611e755760005b60ce54811015611e1a57846001600160a01b031660ce8281548110611df857611df8613003565b6000918252602090912001546001600160a01b031614611e1a57600101611dd1565b60ce548103611e6f5760ce80546001810182556000919091527fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a0180546001600160a01b0319166001600160a01b0387161790555b506112a5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603611ebb57611eb66125c3565b6112a5565b6112a584612781565b60ce5460d054600090821015611eda5781611ede565b60d0545b9050805b801561209d57600060ce611ef7600184612e9c565b81548110611f0757611f07613003565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015611f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7e9190612e6d565b9050611f8a8282612533565b15612092577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611fd557611fd06125c3565b611fde565b611fde82612781565b60ce8054611fee90600190612e9c565b81548110611ffe57611ffe613003565b6000918252602090912001546001600160a01b031660ce612020600186612e9c565b8154811061203057612030613003565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060ce80548061206f5761206f613019565b600082815260209020810160001990810180546001600160a01b03191690550190555b505060001901611ee2565b505050565b6001609755565b606580546001600160a01b031916905561076f8161293c565b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214f9190612e6d565b6121599190612e9c565b90508082111561147657604051635659cb3b60e01b8152600481018290526024810183905260440161071e565b600054610100900460ff166121ad5760405162461bcd60e51b815260040161071e9061302f565b6121b561298e565b6121bd6129bd565b6121c783826129ec565b61209d82612a2a565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122579190612e6d565b90508060c95485612268919061307a565b6122729190613099565b925061227e8385612e9c565b915050915091565b6040516001600160a01b0380851660248301528316604482015260648101829052610cdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a51565b80158061236b5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123699190612e6d565b155b6123d65760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063095ea7b360e01b906064016122ba565b8061240e5750565b60405163125a96ab60e01b81526004810182905260240161071e565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182918716906370a0823190602401602060405180830381865afa158015612475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124999190612e6d565b90506124b06001600160a01b038716868686612286565b6040516370a0823160e01b81526001600160a01b0385811660048301528291908816906370a0823190602401602060405180830381865afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190612e6d565b6125279190612e9c565b9150505b949350505050565b60405163db006a7560e01b8152600481018290526000906001600160a01b0384169063db006a75906024016020604051808303816000875af1925050508015612599575060408051601f3d908101601f1916820190925261259691810190612e6d565b60015b6125a5575060006125bd565b806000036125b75760019150506125bd565b60009150505b92915050565b60004790507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262357600080fd5b505af1158015612637573d6000803e3d6000fd5b505060cf5461267793506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116935016905083612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906126ec907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001906004016130bb565b600060405180830381600087803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b50506040518381526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a350565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e59190612fc2565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561282f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128539190612e6d565b60cf54909150612870906001600160a01b03848116911683612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906128c5907f00000000000000000000000000000000000000000000000000000000000000009086906001906004016130bb565b600060405180830381600087803b1580156128df57600080fd5b505af11580156128f3573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a3505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166129b55760405162461bcd60e51b815260040161071e9061302f565b610ce1612b56565b600054610100900460ff166129e45760405162461bcd60e51b815260040161071e9061302f565b610ce1612b86565b600054610100900460ff16612a135760405162461bcd60e51b815260040161071e9061302f565b612a1c826120c2565b60c98290556114768161159a565b600054610100900460ff166107665760405162461bcd60e51b815260040161071e9061302f565b6000612aa6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612bad9092919063ffffffff16565b9050805160001480612ac7575080806020019051810190612ac79190612f2f565b61209d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063a9059cbb60e01b906064016122ba565b600054610100900460ff16612b7d5760405162461bcd60e51b815260040161071e9061302f565b610ce1336120a9565b600054610100900460ff166120a25760405162461bcd60e51b815260040161071e9061302f565b606061252b848460008585600080866001600160a01b03168587604051612bd491906130f1565b60006040518083038185875af1925050503d8060008114612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b5091509150612c2787838387612c32565b979650505050505050565b60608315612ca1578251600003612c9a576001600160a01b0385163b612c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161071e565b508161252b565b61252b8383815115612cb65781518083602001fd5b8060405162461bcd60e51b815260040161071e919061310d565b6001600160a01b038116811461076f57600080fd5b600060208284031215612cf757600080fd5b8135612d0281612cd0565b9392505050565b60008060408385031215612d1c57600080fd5b8235612d2781612cd0565b91506020830135612d3781612cd0565b809150509250929050565b60008060008060808587031215612d5857600080fd5b8435612d6381612cd0565b93506020850135612d7381612cd0565b9250604085013591506060850135612d8a81612cd0565b939692955090935050565b600060208284031215612da757600080fd5b5035919050565b600080600060608486031215612dc357600080fd5b833592506020840135612dd581612cd0565b91506040840135612de581612cd0565b809150509250925092565b60008060408385031215612e0357600080fd5b8235612e0e81612cd0565b946020939093013593505050565b80518015158114612e2c57600080fd5b919050565b600080600060608486031215612e4657600080fd5b612e4f84612e1c565b925060208401519150612e6460408501612e1c565b90509250925092565b600060208284031215612e7f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612eae57612eae612e86565b500390565b60005b83811015612ece578181015183820152602001612eb6565b83811115610cdb5750506000910152565b60008151808452612ef7816020860160208601612eb3565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061252b90830184612edf565b600060208284031215612f4157600080fd5b612d0282612e1c565b6001600160a01b03848116825283166020820152606060408201819052600090612f7690830184612edf565b95945050505050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b03831681526040810160098310612fb557612fb5612f7f565b8260208301529392505050565b600060208284031215612fd457600080fd5b8151612d0281612cd0565b60008060408385031215612ff257600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600081600019048311821515161561309457613094612e86565b500290565b6000826130b657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0384811682528316602082015260608101600283106130e3576130e3612f7f565b826040830152949350505050565b60008251613103818460208701612eb3565b9190910192915050565b602081526000612d026020830184612edf56fe72656d6f766546726f6d416c6c6f776c69737428616464726573732c616464726573732973657450656e64696e6752656465656d4368756e6b4c656e6774682875696e7432353629a264697066735822122031ffa44e37df8deda22f81e767db2e6d3d68948f4afc968bcba1d17f046a6daf64736f6c634300080d0033",
1032
+ "bytecode": "0x6101006040523480156200001257600080fd5b50604051620034f5380380620034f58339810160408190526200003591620001fa565b8282826200004382620000f8565b6200004e83620000f8565b6200005981620000f8565b6001600160a01b0380831660805281811660e052831660a081905260408051639254f5e560e01b81529051639254f5e5916004808201926020929091908290030181865afa158015620000b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d691906200024e565b6001600160a01b031660c052620000ec62000123565b50505050505062000275565b6001600160a01b03811662000120576040516342bcdf7f60e11b815260040160405180910390fd5b50565b600054610100900460ff1615620001905760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620001e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200012057600080fd5b6000806000606084860312156200021057600080fd5b83516200021d81620001e4565b60208501519093506200023081620001e4565b60408501519092506200024381620001e4565b809150509250925092565b6000602082840312156200026157600080fd5b81516200026e81620001e4565b9392505050565b60805160a05160c05160e05161319e620003576000396000818161059f015281816125ca0152818161264b015281816126c1015261272c01526000818161047d01528181610b8a01528181611720015281816117c2015281816118fe0152818161196901528181611a0f01528181611a440152611a9a01526000818161035d01528181610963015281816117930152818161186601528181611b3d015281816120cf015281816121d70152818161269f015261289801526000818161031101528181610a7601528181610afd01528181611e770152611f91015261319e6000f3fe6080604052600436106101f25760003560e01c80638da5cb5b1161010d578063b8332db7116100a0578063e9a44fd91161006f578063e9a44fd9146105df578063f2531ea1146105ff578063f2fde38b1461061f578063f52421b31461063f578063f7dcd96e1461065f57600080fd5b8063b8332db714610543578063bbd98d7014610558578063d02eb3f41461058d578063e30c3978146105c157600080fd5b8063b09c7742116100dc578063b09c7742146104bf578063b26461de146104d4578063b4988fd014610504578063b4a0bdf31461052457600080fd5b80638da5cb5b146104375780638e3525fc146104555780639254f5e51461046b578063a093796a1461049f57600080fd5b80635fe3b567116101855780637debe3fe116101545780637debe3fe146103b35780638722ddf2146103d35780638765adcb146103f757806389a2bc251461041757600080fd5b80635fe3b5671461034b57806364fd70781461037f578063715018a61461039257806379ba50971461039e57600080fd5b806336eab4ae116101c157806336eab4ae1461027557806344b3716a146102a457806347a6a971146102df5780635ba3792d146102ff57600080fd5b80630d060ea8146101fe5780630e32cb8614610215578063107568df1461023557806311ec4b7a1461025557600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067f565b005b34801561022157600080fd5b50610213610230366004612ce5565b61075e565b34801561024157600080fd5b50610213610250366004612ce5565b610772565b34801561026157600080fd5b50610213610270366004612ce5565b610783565b34801561028157600080fd5b5060cd5461028f9060ff1681565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5061028f6102bf366004612d09565b60ca60209081526000928352604080842090915290825290205460ff1681565b3480156102eb57600080fd5b506102136102fa366004612d09565b610852565b34801561030b57600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b34801561035757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b61021361038d366004612d42565b610926565b34801561021357600080fd5b3480156103aa57600080fd5b50610213610ce3565b3480156103bf57600080fd5b506102136103ce366004612d09565b610d5a565b3480156103df57600080fd5b506103e960cc5481565b60405190815260200161029b565b34801561040357600080fd5b50610213610412366004612ce5565b610e4f565b34801561042357600080fd5b50610213610432366004612d95565b610f1a565b34801561044357600080fd5b506033546001600160a01b0316610333565b34801561046157600080fd5b506103e960c95481565b34801561047757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ab57600080fd5b506102136104ba366004612d95565b610fa2565b3480156104cb57600080fd5b50610213611049565b3480156104e057600080fd5b5061028f6104ef366004612ce5565b60cb6020526000908152604090205460ff1681565b34801561051057600080fd5b5061021361051f366004612dae565b611128565b34801561053057600080fd5b50610102546001600160a01b0316610333565b34801561054f57600080fd5b5061021361123e565b34801561056457600080fd5b50610578610573366004612df0565b611258565b6040805192835260208301919091520161029b565b34801561059957600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156105cd57600080fd5b506065546001600160a01b0316610333565b3480156105eb57600080fd5b5060cf54610333906001600160a01b031681565b34801561060b57600080fd5b5061057861061a366004612d95565b6112ac565b34801561062b57600080fd5b5061021361063a366004612ce5565b6112c1565b34801561064b57600080fd5b5061021361065a366004612d95565b611332565b34801561066b57600080fd5b5061033361067a366004612d95565b6113b1565b6106bd6040518060400160405280601881526020017f7061757365466f7263655641494c6971756964617465282900000000000000008152506113db565b60cd5460ff166107275760405162461bcd60e51b815260206004820152602a60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526918591e4814185d5cd95960b21b60648201526084015b60405180910390fd5b60cd805460ff1916905560405133907f42388332be4beb2ad2ff83017119b9d702ce7fbaf67e18e53a137508cf967e4390600090a2565b61076661147a565b61076f816114d4565b50565b61077a61147a565b61076f8161159a565b6107c16040518060400160405280601c81526020017f72657374726963744c69717569646174696f6e286164647265737329000000008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16156108065760405163404fe9fb60e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19166001179055517f614c47c82976e8f145409efb6366fe2cefa323f389ed9354649262e38dbb35899190a250565b610873604051806060016040528060248152602001613121602491396113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff166108cc5760405163435aad4360e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19169055517f6b0d38eafddac0d37e0aff8f4bbd5f3a3cfe124b8eabea27558bffc931ac05b59190a35050565b61092e6115ff565b61093783611658565b610941833361167f565b604051638e8f294b60e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612e31565b50509050806109fd57604051635a9a1eb960e11b81526001600160a01b038316600482015260240161071e565b610a0785856116fe565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a729190612e6d565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610b6057348414610ad65760405163dd97100160e01b81526004810185905234602482015260440161071e565b604051635572051560e11b81526001600160a01b03868116600483015284811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063aae40a2a9034906044016000604051808303818588803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b5050505050610bdd565b3415610b885760405163dd97100160e01b81526000600482015234602482015260440161071e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610bd157610bcc858585611965565b610bdd565b610bdd86868686611b1b565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612e6d565b90506000610c568383612e9c565b9050600080610c658784611d04565b91509150610c71611ec4565b604080518981526001600160a01b038c8116602083015291810184905260608101839052818916918b169033907fdd091524d794aecdb5235b2d816620c2598790835e0f3849808504c2dcb4f1a99060800160405180910390a4505050505050610cdb6001609755565b50505050565b565b60655433906001600160a01b03168114610d515760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161071e565b61076f816120a9565b610d986040518060400160405280601f81526020017f616464546f416c6c6f776c69737428616464726573732c6164647265737329008152506113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff1615610df25760405163071df39160e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19166001179055517ffe40417b78788808c927141f806ef5082e7bba0f7790f2e85b811621a91094339190a35050565b610e8d6040518060400160405280601e81526020017f756e72657374726963744c69717569646174696f6e28616464726573732900008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16610ed157604051633bf9d98960e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19169055517fe1f03de94d16c262d2f0e89a1c42ede8899d540ac992cf53495a5cf29c2896af9190a250565b610f586040518060400160405280601b81526020017f736574547265617375727950657263656e742875696e743235362900000000008152506113db565b610f61816120c2565b60c95460408051918252602082018390527f0e9a1641744b21c49e4183ab9ce941d420e05a05a446c71875fb07814f362c1a910160405180910390a160c955565b610fc3604051806060016040528060248152602001613145602491396113db565b600081116110085760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206368756e6b2073697a6560701b604482015260640161071e565b60d05460408051918252602082018390527fe5eef53e396f0cb79322e15e72b6c6613ae3e62c9079f5a12f2c410867c28b2c910160405180910390a160d055565b6110876040518060400160405280601981526020017f726573756d65466f7263655641494c69717569646174652829000000000000008152506113db565b60cd5460ff16156110ee5760405162461bcd60e51b815260206004820152602b60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526a18591e481c995cdd5b595960aa1b606482015260840161071e565b60cd805460ff1916600117905560405133907fd4b8f320ada24d048ee6c25c53a31aa20b2ea37fa25542e6e239c80d31d5b60b90600090a2565b600054610100900460ff16158080156111485750600054600160ff909116105b806111625750303b158015611162575060005460ff166001145b6111c55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071e565b6000805460ff1916600117905580156111e8576000805461ff0019166101001790555b6111f3848484612186565b8015610cdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6112466115ff565b61124e611ec4565b610ce16001609755565b6000806112658484611d04565b60408051838152602081018390529294509092507f965c73d6a816dcbe4cc33516168787cb029afb2156ec3372a16e8c6cfbbe6e22910160405180910390a15b9250929050565b6000806112b8836121d0565b91509150915091565b6112c961147a565b606580546001600160a01b0383166001600160a01b031990911681179091556112fa6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6113706040518060400160405280601e81526020017f7365744d696e4c6971756964617461626c655641492875696e743235362900008152506113db565b60cc5460408051918252602082018390527f8df018dc5fe866d192a3f4d9f16dbfdb38f58a7470a65b92262ccc008c55fff0910160405180910390a160cc55565b60ce81815481106113c157600080fd5b6000918252602090912001546001600160a01b0316905081565b610102546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab9061140f9033908690600401612f0b565b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114509190612f2f565b90508061147657333083604051634a3fa29360e01b815260040161071e93929190612f4a565b5050565b6033546001600160a01b03163314610ce15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071e565b6001600160a01b0381166115385760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161071e565b61010280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910160405180910390a15050565b6115a381611658565b60cf546040516001600160a01b038084169216907fafec95c8612496c3ecf5dddc71e393528fe29bd145fbaf9c6b496d78d7e2d79b90600090a360cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6002609754036116515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071e565b6002609755565b6001600160a01b03811661076f576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038216600090815260cb602052604090205460ff1680156116cd57506001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff16155b156114765760405163074c80eb60e51b81526001600160a01b0380841660048301528216602482015260440161071e565b604051633c617c9160e11b81526001600160a01b0382811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906378c2f92290602401602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190612e6d565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e85a29607f000000000000000000000000000000000000000000000000000000000000000060056040518363ffffffff1660e01b8152600401611800929190612f95565b602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190612f2f565b60405163460d60c560e11b81526001600160a01b0386811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690638c1ac18a90602401602060405180830381865afa1580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d19190612f2f565b905080806118dc5750815b806118ea575060cd5460ff16155b806118f6575060cc5483105b8061193257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b1561193e575050505050565b60cc546040516329eb1e8760e01b815261071e918591600401918252602082015260400190565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cbeb2b286040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190612fc2565b9050611a006001600160a01b038216333086612286565b611a356001600160a01b0382167f000000000000000000000000000000000000000000000000000000000000000060006122f1565b611a696001600160a01b0382167f0000000000000000000000000000000000000000000000000000000000000000856122f1565b6040516311b3d5e760e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906311b3d5e79060640160408051808303816000875af1158015611ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b089190612fdf565b509050611b1481612406565b5050505050565b604051638e8f294b60e01b81526001600160a01b0385811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa158015611b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611baa9190612e31565b5050905080611bd757604051635a9a1eb960e11b81526001600160a01b038616600482015260240161071e565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b9190612fc2565b90506000611c4b8233308861242a565b9050611c626001600160a01b0383168860006122f1565b611c766001600160a01b03831688836122f1565b604051637af1e23160e11b81526001600160a01b038781166004830152602482018390528581166044830152611cfb919089169063f5e3c462906064016020604051808303816000875af1158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190612e6d565b612406565b50505050505050565b600080611d10836121d0565b60405163a9059cbb60e01b81523360048201526024810182905291935091506001600160a01b0385169063a9059cbb906044016020604051808303816000875af1158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d869190612f2f565b611db25760405163241165bb60e21b81523060048201523360248201526044810182905260640161071e565b600082118015611dc95750611dc78483612533565b155b15611e755760005b60ce54811015611e1a57846001600160a01b031660ce8281548110611df857611df8613003565b6000918252602090912001546001600160a01b031614611e1a57600101611dd1565b60ce548103611e6f5760ce80546001810182556000919091527fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a0180546001600160a01b0319166001600160a01b0387161790555b506112a5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603611ebb57611eb66125c3565b6112a5565b6112a584612781565b60ce5460d054600090821015611eda5781611ede565b60d0545b9050805b801561209d57600060ce611ef7600184612e9c565b81548110611f0757611f07613003565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015611f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7e9190612e6d565b9050611f8a8282612533565b15612092577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611fd557611fd06125c3565b611fde565b611fde82612781565b60ce8054611fee90600190612e9c565b81548110611ffe57611ffe613003565b6000918252602090912001546001600160a01b031660ce612020600186612e9c565b8154811061203057612030613003565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060ce80548061206f5761206f613019565b600082815260209020810160001990810180546001600160a01b03191690550190555b505060001901611ee2565b505050565b6001609755565b606580546001600160a01b031916905561076f8161293c565b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214f9190612e6d565b6121599190612e9c565b90508082111561147657604051635659cb3b60e01b8152600481018290526024810183905260440161071e565b600054610100900460ff166121ad5760405162461bcd60e51b815260040161071e9061302f565b6121b561298e565b6121bd6129bd565b6121c783826129ec565b61209d82612a2a565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122579190612e6d565b90508060c95485612268919061307a565b6122729190613099565b925061227e8385612e9c565b915050915091565b6040516001600160a01b0380851660248301528316604482015260648101829052610cdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a51565b80158061236b5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123699190612e6d565b155b6123d65760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063095ea7b360e01b906064016122ba565b8061240e5750565b60405163125a96ab60e01b81526004810182905260240161071e565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182918716906370a0823190602401602060405180830381865afa158015612475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124999190612e6d565b90506124b06001600160a01b038716868686612286565b6040516370a0823160e01b81526001600160a01b0385811660048301528291908816906370a0823190602401602060405180830381865afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190612e6d565b6125279190612e9c565b9150505b949350505050565b60405163db006a7560e01b8152600481018290526000906001600160a01b0384169063db006a75906024016020604051808303816000875af1925050508015612599575060408051601f3d908101601f1916820190925261259691810190612e6d565b60015b6125a5575060006125bd565b806000036125b75760019150506125bd565b60009150505b92915050565b60004790507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262357600080fd5b505af1158015612637573d6000803e3d6000fd5b505060cf5461267793506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116935016905083612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906126ec907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001906004016130bb565b600060405180830381600087803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b50506040518381526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a350565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e59190612fc2565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561282f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128539190612e6d565b60cf54909150612870906001600160a01b03848116911683612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906128c5907f00000000000000000000000000000000000000000000000000000000000000009086906001906004016130bb565b600060405180830381600087803b1580156128df57600080fd5b505af11580156128f3573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a3505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166129b55760405162461bcd60e51b815260040161071e9061302f565b610ce1612b56565b600054610100900460ff166129e45760405162461bcd60e51b815260040161071e9061302f565b610ce1612b86565b600054610100900460ff16612a135760405162461bcd60e51b815260040161071e9061302f565b612a1c826120c2565b60c98290556114768161159a565b600054610100900460ff166107665760405162461bcd60e51b815260040161071e9061302f565b6000612aa6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612bad9092919063ffffffff16565b9050805160001480612ac7575080806020019051810190612ac79190612f2f565b61209d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063a9059cbb60e01b906064016122ba565b600054610100900460ff16612b7d5760405162461bcd60e51b815260040161071e9061302f565b610ce1336120a9565b600054610100900460ff166120a25760405162461bcd60e51b815260040161071e9061302f565b606061252b848460008585600080866001600160a01b03168587604051612bd491906130f1565b60006040518083038185875af1925050503d8060008114612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b5091509150612c2787838387612c32565b979650505050505050565b60608315612ca1578251600003612c9a576001600160a01b0385163b612c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161071e565b508161252b565b61252b8383815115612cb65781518083602001fd5b8060405162461bcd60e51b815260040161071e919061310d565b6001600160a01b038116811461076f57600080fd5b600060208284031215612cf757600080fd5b8135612d0281612cd0565b9392505050565b60008060408385031215612d1c57600080fd5b8235612d2781612cd0565b91506020830135612d3781612cd0565b809150509250929050565b60008060008060808587031215612d5857600080fd5b8435612d6381612cd0565b93506020850135612d7381612cd0565b9250604085013591506060850135612d8a81612cd0565b939692955090935050565b600060208284031215612da757600080fd5b5035919050565b600080600060608486031215612dc357600080fd5b833592506020840135612dd581612cd0565b91506040840135612de581612cd0565b809150509250925092565b60008060408385031215612e0357600080fd5b8235612e0e81612cd0565b946020939093013593505050565b80518015158114612e2c57600080fd5b919050565b600080600060608486031215612e4657600080fd5b612e4f84612e1c565b925060208401519150612e6460408501612e1c565b90509250925092565b600060208284031215612e7f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612eae57612eae612e86565b500390565b60005b83811015612ece578181015183820152602001612eb6565b83811115610cdb5750506000910152565b60008151808452612ef7816020860160208601612eb3565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061252b90830184612edf565b600060208284031215612f4157600080fd5b612d0282612e1c565b6001600160a01b03848116825283166020820152606060408201819052600090612f7690830184612edf565b95945050505050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b03831681526040810160098310612fb557612fb5612f7f565b8260208301529392505050565b600060208284031215612fd457600080fd5b8151612d0281612cd0565b60008060408385031215612ff257600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600081600019048311821515161561309457613094612e86565b500290565b6000826130b657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0384811682528316602082015260608101600283106130e3576130e3612f7f565b826040830152949350505050565b60008251613103818460208701612eb3565b9190910192915050565b602081526000612d026020830184612edf56fe72656d6f766546726f6d416c6c6f776c69737428616464726573732c616464726573732973657450656e64696e6752656465656d4368756e6b4c656e6774682875696e7432353629a26469706673582212204b609eff30160a8945e0b0a5c94465d46d3f1c03211d6125ec80f64df19ec3f564736f6c634300080d0033",
1033
+ "deployedBytecode": "0x6080604052600436106101f25760003560e01c80638da5cb5b1161010d578063b8332db7116100a0578063e9a44fd91161006f578063e9a44fd9146105df578063f2531ea1146105ff578063f2fde38b1461061f578063f52421b31461063f578063f7dcd96e1461065f57600080fd5b8063b8332db714610543578063bbd98d7014610558578063d02eb3f41461058d578063e30c3978146105c157600080fd5b8063b09c7742116100dc578063b09c7742146104bf578063b26461de146104d4578063b4988fd014610504578063b4a0bdf31461052457600080fd5b80638da5cb5b146104375780638e3525fc146104555780639254f5e51461046b578063a093796a1461049f57600080fd5b80635fe3b567116101855780637debe3fe116101545780637debe3fe146103b35780638722ddf2146103d35780638765adcb146103f757806389a2bc251461041757600080fd5b80635fe3b5671461034b57806364fd70781461037f578063715018a61461039257806379ba50971461039e57600080fd5b806336eab4ae116101c157806336eab4ae1461027557806344b3716a146102a457806347a6a971146102df5780635ba3792d146102ff57600080fd5b80630d060ea8146101fe5780630e32cb8614610215578063107568df1461023557806311ec4b7a1461025557600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067f565b005b34801561022157600080fd5b50610213610230366004612ce5565b61075e565b34801561024157600080fd5b50610213610250366004612ce5565b610772565b34801561026157600080fd5b50610213610270366004612ce5565b610783565b34801561028157600080fd5b5060cd5461028f9060ff1681565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5061028f6102bf366004612d09565b60ca60209081526000928352604080842090915290825290205460ff1681565b3480156102eb57600080fd5b506102136102fa366004612d09565b610852565b34801561030b57600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b34801561035757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b61021361038d366004612d42565b610926565b34801561021357600080fd5b3480156103aa57600080fd5b50610213610ce3565b3480156103bf57600080fd5b506102136103ce366004612d09565b610d5a565b3480156103df57600080fd5b506103e960cc5481565b60405190815260200161029b565b34801561040357600080fd5b50610213610412366004612ce5565b610e4f565b34801561042357600080fd5b50610213610432366004612d95565b610f1a565b34801561044357600080fd5b506033546001600160a01b0316610333565b34801561046157600080fd5b506103e960c95481565b34801561047757600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ab57600080fd5b506102136104ba366004612d95565b610fa2565b3480156104cb57600080fd5b50610213611049565b3480156104e057600080fd5b5061028f6104ef366004612ce5565b60cb6020526000908152604090205460ff1681565b34801561051057600080fd5b5061021361051f366004612dae565b611128565b34801561053057600080fd5b50610102546001600160a01b0316610333565b34801561054f57600080fd5b5061021361123e565b34801561056457600080fd5b50610578610573366004612df0565b611258565b6040805192835260208301919091520161029b565b34801561059957600080fd5b506103337f000000000000000000000000000000000000000000000000000000000000000081565b3480156105cd57600080fd5b506065546001600160a01b0316610333565b3480156105eb57600080fd5b5060cf54610333906001600160a01b031681565b34801561060b57600080fd5b5061057861061a366004612d95565b6112ac565b34801561062b57600080fd5b5061021361063a366004612ce5565b6112c1565b34801561064b57600080fd5b5061021361065a366004612d95565b611332565b34801561066b57600080fd5b5061033361067a366004612d95565b6113b1565b6106bd6040518060400160405280601881526020017f7061757365466f7263655641494c6971756964617465282900000000000000008152506113db565b60cd5460ff166107275760405162461bcd60e51b815260206004820152602a60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526918591e4814185d5cd95960b21b60648201526084015b60405180910390fd5b60cd805460ff1916905560405133907f42388332be4beb2ad2ff83017119b9d702ce7fbaf67e18e53a137508cf967e4390600090a2565b61076661147a565b61076f816114d4565b50565b61077a61147a565b61076f8161159a565b6107c16040518060400160405280601c81526020017f72657374726963744c69717569646174696f6e286164647265737329000000008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16156108065760405163404fe9fb60e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19166001179055517f614c47c82976e8f145409efb6366fe2cefa323f389ed9354649262e38dbb35899190a250565b610873604051806060016040528060248152602001613121602491396113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff166108cc5760405163435aad4360e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19169055517f6b0d38eafddac0d37e0aff8f4bbd5f3a3cfe124b8eabea27558bffc931ac05b59190a35050565b61092e6115ff565b61093783611658565b610941833361167f565b604051638e8f294b60e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190612e31565b50509050806109fd57604051635a9a1eb960e11b81526001600160a01b038316600482015260240161071e565b610a0785856116fe565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a729190612e6d565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610b6057348414610ad65760405163dd97100160e01b81526004810185905234602482015260440161071e565b604051635572051560e11b81526001600160a01b03868116600483015284811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063aae40a2a9034906044016000604051808303818588803b158015610b4257600080fd5b505af1158015610b56573d6000803e3d6000fd5b5050505050610bdd565b3415610b885760405163dd97100160e01b81526000600482015234602482015260440161071e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603610bd157610bcc858585611965565b610bdd565b610bdd86868686611b1b565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c489190612e6d565b90506000610c568383612e9c565b9050600080610c658784611d04565b91509150610c71611ec4565b604080518981526001600160a01b038c8116602083015291810184905260608101839052818916918b169033907fdd091524d794aecdb5235b2d816620c2598790835e0f3849808504c2dcb4f1a99060800160405180910390a4505050505050610cdb6001609755565b50505050565b565b60655433906001600160a01b03168114610d515760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161071e565b61076f816120a9565b610d986040518060400160405280601f81526020017f616464546f416c6c6f776c69737428616464726573732c6164647265737329008152506113db565b6001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff1615610df25760405163071df39160e01b81526001600160a01b0380841660048301528216602482015260440161071e565b6001600160a01b03808316600081815260ca6020908152604080832094861680845294909152808220805460ff19166001179055517ffe40417b78788808c927141f806ef5082e7bba0f7790f2e85b811621a91094339190a35050565b610e8d6040518060400160405280601e81526020017f756e72657374726963744c69717569646174696f6e28616464726573732900008152506113db565b6001600160a01b038116600090815260cb602052604090205460ff16610ed157604051633bf9d98960e11b81526001600160a01b038216600482015260240161071e565b6001600160a01b038116600081815260cb6020526040808220805460ff19169055517fe1f03de94d16c262d2f0e89a1c42ede8899d540ac992cf53495a5cf29c2896af9190a250565b610f586040518060400160405280601b81526020017f736574547265617375727950657263656e742875696e743235362900000000008152506113db565b610f61816120c2565b60c95460408051918252602082018390527f0e9a1641744b21c49e4183ab9ce941d420e05a05a446c71875fb07814f362c1a910160405180910390a160c955565b610fc3604051806060016040528060248152602001613145602491396113db565b600081116110085760405162461bcd60e51b8152602060048201526012602482015271496e76616c6964206368756e6b2073697a6560701b604482015260640161071e565b60d05460408051918252602082018390527fe5eef53e396f0cb79322e15e72b6c6613ae3e62c9079f5a12f2c410867c28b2c910160405180910390a160d055565b6110876040518060400160405280601981526020017f726573756d65466f7263655641494c69717569646174652829000000000000008152506113db565b60cd5460ff16156110ee5760405162461bcd60e51b815260206004820152602b60248201527f466f726365204c69717569646174696f6e206f662056414920697320616c726560448201526a18591e481c995cdd5b595960aa1b606482015260840161071e565b60cd805460ff1916600117905560405133907fd4b8f320ada24d048ee6c25c53a31aa20b2ea37fa25542e6e239c80d31d5b60b90600090a2565b600054610100900460ff16158080156111485750600054600160ff909116105b806111625750303b158015611162575060005460ff166001145b6111c55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071e565b6000805460ff1916600117905580156111e8576000805461ff0019166101001790555b6111f3848484612186565b8015610cdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6112466115ff565b61124e611ec4565b610ce16001609755565b6000806112658484611d04565b60408051838152602081018390529294509092507f965c73d6a816dcbe4cc33516168787cb029afb2156ec3372a16e8c6cfbbe6e22910160405180910390a15b9250929050565b6000806112b8836121d0565b91509150915091565b6112c961147a565b606580546001600160a01b0383166001600160a01b031990911681179091556112fa6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6113706040518060400160405280601e81526020017f7365744d696e4c6971756964617461626c655641492875696e743235362900008152506113db565b60cc5460408051918252602082018390527f8df018dc5fe866d192a3f4d9f16dbfdb38f58a7470a65b92262ccc008c55fff0910160405180910390a160cc55565b60ce81815481106113c157600080fd5b6000918252602090912001546001600160a01b0316905081565b610102546040516318c5e8ab60e01b81526000916001600160a01b0316906318c5e8ab9061140f9033908690600401612f0b565b602060405180830381865afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114509190612f2f565b90508061147657333083604051634a3fa29360e01b815260040161071e93929190612f4a565b5050565b6033546001600160a01b03163314610ce15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071e565b6001600160a01b0381166115385760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161071e565b61010280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910160405180910390a15050565b6115a381611658565b60cf546040516001600160a01b038084169216907fafec95c8612496c3ecf5dddc71e393528fe29bd145fbaf9c6b496d78d7e2d79b90600090a360cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6002609754036116515760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071e565b6002609755565b6001600160a01b03811661076f576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038216600090815260cb602052604090205460ff1680156116cd57506001600160a01b03808316600090815260ca602090815260408083209385168352929052205460ff16155b156114765760405163074c80eb60e51b81526001600160a01b0380841660048301528216602482015260440161071e565b604051633c617c9160e11b81526001600160a01b0382811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906378c2f92290602401602060405180830381865afa158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d9190612e6d565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e85a29607f000000000000000000000000000000000000000000000000000000000000000060056040518363ffffffff1660e01b8152600401611800929190612f95565b602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190612f2f565b60405163460d60c560e11b81526001600160a01b0386811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690638c1ac18a90602401602060405180830381865afa1580156118ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d19190612f2f565b905080806118dc5750815b806118ea575060cd5460ff16155b806118f6575060cc5483105b8061193257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b1561193e575050505050565b60cc546040516329eb1e8760e01b815261071e918591600401918252602082015260400190565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cbeb2b286040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190612fc2565b9050611a006001600160a01b038216333086612286565b611a356001600160a01b0382167f000000000000000000000000000000000000000000000000000000000000000060006122f1565b611a696001600160a01b0382167f0000000000000000000000000000000000000000000000000000000000000000856122f1565b6040516311b3d5e760e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906311b3d5e79060640160408051808303816000875af1158015611ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b089190612fdf565b509050611b1481612406565b5050505050565b604051638e8f294b60e01b81526001600160a01b0385811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690638e8f294b90602401606060405180830381865afa158015611b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611baa9190612e31565b5050905080611bd757604051635a9a1eb960e11b81526001600160a01b038616600482015260240161071e565b6000856001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3b9190612fc2565b90506000611c4b8233308861242a565b9050611c626001600160a01b0383168860006122f1565b611c766001600160a01b03831688836122f1565b604051637af1e23160e11b81526001600160a01b038781166004830152602482018390528581166044830152611cfb919089169063f5e3c462906064016020604051808303816000875af1158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190612e6d565b612406565b50505050505050565b600080611d10836121d0565b60405163a9059cbb60e01b81523360048201526024810182905291935091506001600160a01b0385169063a9059cbb906044016020604051808303816000875af1158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d869190612f2f565b611db25760405163241165bb60e21b81523060048201523360248201526044810182905260640161071e565b600082118015611dc95750611dc78483612533565b155b15611e755760005b60ce54811015611e1a57846001600160a01b031660ce8281548110611df857611df8613003565b6000918252602090912001546001600160a01b031614611e1a57600101611dd1565b60ce548103611e6f5760ce80546001810182556000919091527fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a0180546001600160a01b0319166001600160a01b0387161790555b506112a5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603611ebb57611eb66125c3565b6112a5565b6112a584612781565b60ce5460d054600090821015611eda5781611ede565b60d0545b9050805b801561209d57600060ce611ef7600184612e9c565b81548110611f0757611f07613003565b60009182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa158015611f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7e9190612e6d565b9050611f8a8282612533565b15612092577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611fd557611fd06125c3565b611fde565b611fde82612781565b60ce8054611fee90600190612e9c565b81548110611ffe57611ffe613003565b6000918252602090912001546001600160a01b031660ce612020600186612e9c565b8154811061203057612030613003565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060ce80548061206f5761206f613019565b600082815260209020810160001990810180546001600160a01b03191690550190555b505060001901611ee2565b505050565b6001609755565b606580546001600160a01b031916905561076f8161293c565b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561212b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214f9190612e6d565b6121599190612e9c565b90508082111561147657604051635659cb3b60e01b8152600481018290526024810183905260440161071e565b600054610100900460ff166121ad5760405162461bcd60e51b815260040161071e9061302f565b6121b561298e565b6121bd6129bd565b6121c783826129ec565b61209d82612a2a565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ada90af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122579190612e6d565b90508060c95485612268919061307a565b6122729190613099565b925061227e8385612e9c565b915050915091565b6040516001600160a01b0380851660248301528316604482015260648101829052610cdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a51565b80158061236b5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123699190612e6d565b155b6123d65760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063095ea7b360e01b906064016122ba565b8061240e5750565b60405163125a96ab60e01b81526004810182905260240161071e565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182918716906370a0823190602401602060405180830381865afa158015612475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124999190612e6d565b90506124b06001600160a01b038716868686612286565b6040516370a0823160e01b81526001600160a01b0385811660048301528291908816906370a0823190602401602060405180830381865afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190612e6d565b6125279190612e9c565b9150505b949350505050565b60405163db006a7560e01b8152600481018290526000906001600160a01b0384169063db006a75906024016020604051808303816000875af1925050508015612599575060408051601f3d908101601f1916820190925261259691810190612e6d565b60015b6125a5575060006125bd565b806000036125b75760019150506125bd565b60009150505b92915050565b60004790507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262357600080fd5b505af1158015612637573d6000803e3d6000fd5b505060cf5461267793506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116935016905083612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906126ec907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001906004016130bb565b600060405180830381600087803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b50506040518381526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a350565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e59190612fc2565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561282f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128539190612e6d565b60cf54909150612870906001600160a01b03848116911683612b26565b60cf546040516305bebb3b60e21b81526001600160a01b03909116906316faecec906128c5907f00000000000000000000000000000000000000000000000000000000000000009086906001906004016130bb565b600060405180830381600087803b1580156128df57600080fd5b505af11580156128f3573d6000803e3d6000fd5b50506040518381526001600160a01b03851692503391507fb68163184d017d69dff908f587b51f68dc2689426509efd546fbf77b518cc8769060200160405180910390a3505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166129b55760405162461bcd60e51b815260040161071e9061302f565b610ce1612b56565b600054610100900460ff166129e45760405162461bcd60e51b815260040161071e9061302f565b610ce1612b86565b600054610100900460ff16612a135760405162461bcd60e51b815260040161071e9061302f565b612a1c826120c2565b60c98290556114768161159a565b600054610100900460ff166107665760405162461bcd60e51b815260040161071e9061302f565b6000612aa6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612bad9092919063ffffffff16565b9050805160001480612ac7575080806020019051810190612ac79190612f2f565b61209d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161071e565b6040516001600160a01b03831660248201526044810182905261209d90849063a9059cbb60e01b906064016122ba565b600054610100900460ff16612b7d5760405162461bcd60e51b815260040161071e9061302f565b610ce1336120a9565b600054610100900460ff166120a25760405162461bcd60e51b815260040161071e9061302f565b606061252b848460008585600080866001600160a01b03168587604051612bd491906130f1565b60006040518083038185875af1925050503d8060008114612c11576040519150601f19603f3d011682016040523d82523d6000602084013e612c16565b606091505b5091509150612c2787838387612c32565b979650505050505050565b60608315612ca1578251600003612c9a576001600160a01b0385163b612c9a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161071e565b508161252b565b61252b8383815115612cb65781518083602001fd5b8060405162461bcd60e51b815260040161071e919061310d565b6001600160a01b038116811461076f57600080fd5b600060208284031215612cf757600080fd5b8135612d0281612cd0565b9392505050565b60008060408385031215612d1c57600080fd5b8235612d2781612cd0565b91506020830135612d3781612cd0565b809150509250929050565b60008060008060808587031215612d5857600080fd5b8435612d6381612cd0565b93506020850135612d7381612cd0565b9250604085013591506060850135612d8a81612cd0565b939692955090935050565b600060208284031215612da757600080fd5b5035919050565b600080600060608486031215612dc357600080fd5b833592506020840135612dd581612cd0565b91506040840135612de581612cd0565b809150509250925092565b60008060408385031215612e0357600080fd5b8235612e0e81612cd0565b946020939093013593505050565b80518015158114612e2c57600080fd5b919050565b600080600060608486031215612e4657600080fd5b612e4f84612e1c565b925060208401519150612e6460408501612e1c565b90509250925092565b600060208284031215612e7f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612eae57612eae612e86565b500390565b60005b83811015612ece578181015183820152602001612eb6565b83811115610cdb5750506000910152565b60008151808452612ef7816020860160208601612eb3565b601f01601f19169290920160200192915050565b6001600160a01b038316815260406020820181905260009061252b90830184612edf565b600060208284031215612f4157600080fd5b612d0282612e1c565b6001600160a01b03848116825283166020820152606060408201819052600090612f7690830184612edf565b95945050505050565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b03831681526040810160098310612fb557612fb5612f7f565b8260208301529392505050565b600060208284031215612fd457600080fd5b8151612d0281612cd0565b60008060408385031215612ff257600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600081600019048311821515161561309457613094612e86565b500290565b6000826130b657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0384811682528316602082015260608101600283106130e3576130e3612f7f565b826040830152949350505050565b60008251613103818460208701612eb3565b9190910192915050565b602081526000612d026020830184612edf56fe72656d6f766546726f6d416c6c6f776c69737428616464726573732c616464726573732973657450656e64696e6752656465656d4368756e6b4c656e6774682875696e7432353629a26469706673582212204b609eff30160a8945e0b0a5c94465d46d3f1c03211d6125ec80f64df19ec3f564736f6c634300080d0033",
1034
1034
  "linkReferences": {},
1035
1035
  "deployedLinkReferences": {}
1036
1036
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../build-info/db82b17d0da6752b00ad696fe36aa8fb.json"
3
+ "buildInfo": "../../../build-info/f873604cc800d476500cd733aebbcd98.json"
4
4
  }
@@ -3,63 +3,169 @@ pragma solidity 0.8.13;
3
3
 
4
4
  import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
5
5
  import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol";
6
- import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
- import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
8
6
  import { ensureNonzeroAddress } from "@venusprotocol/solidity-utilities/contracts/validators.sol";
9
7
 
10
- import { IVBep20 } from "../InterfacesV8.sol";
8
+ import { IVToken, IVBep20, IVBNB } from "../InterfacesV8.sol";
9
+ import { Currency, CurrencyLibrary } from "../lib/Currency.sol";
11
10
 
12
11
  contract TokenRedeemer is ReentrancyGuard, Ownable2Step {
13
- using SafeERC20 for IERC20;
12
+ using CurrencyLibrary for Currency;
14
13
 
14
+ struct AccountBorrows {
15
+ address borrower;
16
+ uint256 amount;
17
+ }
18
+
19
+ struct Borrows {
20
+ uint256 totalBorrows;
21
+ AccountBorrows[] accountBorrows;
22
+ }
23
+
24
+ IVBNB public immutable VBNB;
25
+
26
+ error AccrueInterestFailed(uint256 errCode);
15
27
  error RedeemFailed(uint256 errCode);
16
28
  error RepaymentFailed(uint256 errCode);
29
+ error NativeTokenTransferFailed();
17
30
 
18
- constructor(address owner_) {
31
+ constructor(address owner_, IVBNB vBNB) {
19
32
  ensureNonzeroAddress(owner_);
33
+ VBNB = vBNB;
20
34
  _transferOwnership(owner_);
21
35
  }
22
36
 
23
- function redeemAndTransfer(IVBep20 vToken, address destination) external nonReentrant onlyOwner {
24
- IERC20 underlying = IERC20(vToken.underlying());
37
+ receive() external payable {}
38
+
39
+ function redeemAndTransfer(IVToken vToken, address destination) external nonReentrant onlyOwner {
40
+ Currency underlying = _underlying(vToken);
25
41
  uint256 err = vToken.redeem(vToken.balanceOf(address(this)));
26
42
  if (err != 0) {
27
43
  revert RedeemFailed(err);
28
44
  }
29
- _transferAll(underlying, destination);
45
+ underlying.transferAll(destination);
30
46
  }
31
47
 
32
48
  function redeemUnderlyingAndRepayBorrowBehalf(
33
- IVBep20 vToken,
49
+ IVToken vToken,
34
50
  address borrower,
35
51
  uint256 amount,
36
52
  address receiver
37
53
  ) external nonReentrant onlyOwner {
38
- IERC20 underlying = IERC20(vToken.underlying());
54
+ Currency underlying = _underlying(vToken);
39
55
 
40
56
  uint256 err = vToken.redeemUnderlying(amount);
41
57
  if (err != 0) {
42
58
  revert RedeemFailed(err);
43
59
  }
44
60
 
45
- SafeERC20.forceApprove(underlying, address(vToken), amount);
61
+ underlying.approve(address(vToken), amount);
62
+
63
+ _repay(vToken, borrower, amount);
64
+
65
+ underlying.approve(address(vToken), 0);
66
+
67
+ underlying.transferAll(receiver);
68
+ Currency.wrap(address(vToken)).transferAll(receiver);
69
+ }
70
+
71
+ function redeemAndBatchRepay(
72
+ IVToken vToken,
73
+ address[] calldata borrowers,
74
+ address receiver
75
+ ) external nonReentrant onlyOwner {
76
+ _accrueInterest(vToken);
77
+
78
+ (uint256 totalBorrowedAmount, AccountBorrows[] memory borrows) = _getBorrows(vToken, borrowers);
79
+ _redeemUpTo(vToken, totalBorrowedAmount);
80
+
81
+ Currency underlying = _underlying(vToken);
82
+ uint256 balance = underlying.balanceOfSelf();
83
+ underlying.approve(address(vToken), totalBorrowedAmount);
84
+ uint256 borrowsCount = borrows.length;
85
+ // The code below assumes no fees on transfer
86
+ if (balance >= totalBorrowedAmount) {
87
+ // If we're doing a full repayment, we can optimize it by skipping the balance checks
88
+ for (uint256 i = 0; i < borrowsCount; ++i) {
89
+ AccountBorrows memory accountBorrows = borrows[i];
90
+ _repay(vToken, accountBorrows.borrower, accountBorrows.amount);
91
+ }
92
+ } else {
93
+ // Otherwise, we have to check and update the balance on every iteration
94
+ for (uint256 i = 0; i < borrowsCount && balance != 0; ++i) {
95
+ AccountBorrows memory accountBorrows = borrows[i];
96
+ _repay(vToken, accountBorrows.borrower, _min(accountBorrows.amount, balance));
97
+ balance = underlying.balanceOfSelf();
98
+ }
99
+ }
100
+ underlying.approve(address(vToken), 0);
46
101
 
47
- err = vToken.repayBorrowBehalf(borrower, amount);
102
+ underlying.transferAll(receiver);
103
+ Currency.wrap(address(vToken)).transferAll(receiver);
104
+ }
105
+
106
+ function sweepTokens(address token, address destination) external onlyOwner {
107
+ Currency.wrap(token).transferAll(destination);
108
+ }
109
+
110
+ function _accrueInterest(IVToken vToken) internal {
111
+ uint256 err = vToken.accrueInterest();
48
112
  if (err != 0) {
49
- revert RepaymentFailed(err);
113
+ revert AccrueInterestFailed(err);
50
114
  }
115
+ }
51
116
 
52
- SafeERC20.forceApprove(underlying, address(vToken), 0);
117
+ function _redeemUpTo(IVToken vToken, uint256 amount) internal {
118
+ uint256 unredeemedUnderlying = vToken.balanceOfUnderlying(address(this));
119
+ if (unredeemedUnderlying > 0) {
120
+ uint256 err = vToken.redeemUnderlying(_min(amount, unredeemedUnderlying));
121
+ if (err != 0) {
122
+ revert RedeemFailed(err);
123
+ }
124
+ }
125
+ }
53
126
 
54
- _transferAll(underlying, receiver);
55
- _transferAll(IERC20(address(vToken)), receiver);
127
+ function _repay(IVToken vToken, address borrower, uint256 amount) internal {
128
+ if (amount == 0) {
129
+ return;
130
+ }
131
+ if (_isVBNB(vToken)) {
132
+ IVBNB(address(vToken)).repayBorrowBehalf{ value: amount }(borrower);
133
+ } else {
134
+ uint256 err = IVBep20(address(vToken)).repayBorrowBehalf(borrower, amount);
135
+ if (err != 0) {
136
+ revert RepaymentFailed(err);
137
+ }
138
+ }
139
+ }
140
+
141
+ function _getBorrows(
142
+ IVToken vToken,
143
+ address[] calldata borrowers
144
+ ) internal view returns (uint256, AccountBorrows[] memory) {
145
+ uint256 borrowersCount = borrowers.length;
146
+ AccountBorrows[] memory borrows = new AccountBorrows[](borrowersCount);
147
+ uint256 totalBorrowedAmount = 0;
148
+ for (uint256 i = 0; i < borrowers.length; ++i) {
149
+ address borrower = borrowers[i];
150
+ uint256 amount = vToken.borrowBalanceStored(borrower);
151
+ totalBorrowedAmount += amount;
152
+ borrows[i] = AccountBorrows({ borrower: borrower, amount: amount });
153
+ }
154
+ return (totalBorrowedAmount, borrows);
155
+ }
156
+
157
+ function _underlying(IVToken vToken) internal view returns (Currency) {
158
+ if (_isVBNB(vToken)) {
159
+ return CurrencyLibrary.NATIVE;
160
+ }
161
+ return Currency.wrap(IVBep20(address(vToken)).underlying());
56
162
  }
57
163
 
58
- function sweepTokens(IERC20 token, address destination) external onlyOwner {
59
- _transferAll(token, destination);
164
+ function _isVBNB(IVToken vToken) internal view returns (bool) {
165
+ return address(vToken) == address(VBNB);
60
166
  }
61
167
 
62
- function _transferAll(IERC20 token, address destination) internal {
63
- token.safeTransfer(destination, token.balanceOf(address(this)));
168
+ function _min(uint256 a, uint256 b) internal pure returns (uint256) {
169
+ return a < b ? a : b;
64
170
  }
65
171
  }
@@ -5,11 +5,19 @@ import { IERC20Upgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC
5
5
  import { ResilientOracleInterface } from "@venusprotocol/oracle/contracts/interfaces/OracleInterface.sol";
6
6
 
7
7
  interface IVToken is IERC20Upgradeable {
8
+ function accrueInterest() external returns (uint256);
9
+
8
10
  function redeem(uint256 redeemTokens) external returns (uint256);
9
11
 
12
+ function redeemUnderlying(uint256 redeemAmount) external returns (uint256);
13
+
10
14
  function borrowBalanceCurrent(address borrower) external returns (uint256);
11
15
 
16
+ function balanceOfUnderlying(address owner) external returns (uint256);
17
+
12
18
  function comptroller() external view returns (IComptroller);
19
+
20
+ function borrowBalanceStored(address account) external view returns (uint256);
13
21
  }
14
22
 
15
23
  interface IVBep20 is IVToken {
@@ -24,11 +32,11 @@ interface IVBep20 is IVToken {
24
32
  ) external returns (uint256);
25
33
 
26
34
  function underlying() external view returns (address);
27
-
28
- function redeemUnderlying(uint256 repayAmount) external returns (uint256);
29
35
  }
30
36
 
31
37
  interface IVBNB is IVToken {
38
+ function repayBorrowBehalf(address borrower) external payable;
39
+
32
40
  function liquidateBorrow(address borrower, IVToken vTokenCollateral) external payable;
33
41
  }
34
42
 
@@ -0,0 +1,82 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ pragma solidity 0.8.13;
3
+
4
+ // This library is heavily inspired by Uniswap v4 Currency lib
5
+ // (https://github.com/Uniswap/v4-core/blob/b230769238879e1d4f58ffa57a4696b0c390d188/src/types/Currency.sol)
6
+ // Contrary to the implementation above, this library does not
7
+ // use assembly to save gas. It rather relies on OpenZeppelin's
8
+ // SafeERC20 to simplify the review and audits. This might change
9
+ // in future if it's more heavily used by Venus contracts.
10
+
11
+ import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
12
+ import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
13
+
14
+ type Currency is address;
15
+
16
+ library CurrencyLibrary {
17
+ using CurrencyLibrary for Currency;
18
+
19
+ /// @notice Thrown when a native transfer fails
20
+ error NativeTransferFailed();
21
+
22
+ Currency public constant NATIVE = Currency.wrap(0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB);
23
+
24
+ /**
25
+ * @dev If currency is a token, invokes SafeERC20.forceApprove to allow spender
26
+ * to spend the amount of tokens on behalf of the current contract. Otherwise,
27
+ * does nothing.
28
+ * @param currency Currency
29
+ * @param spender The account approved to spend the tokens
30
+ * @param amount The approved amount
31
+ */
32
+ function approve(Currency currency, address spender, uint256 amount) internal {
33
+ if (!currency.isNative()) {
34
+ // I'd rather use approveOrRevert instead of forceApprove
35
+ // once we migrate to OZ v5: force-approve does approve(0)
36
+ // before approving the amount, and it's not always
37
+ // desirable. The users will need to pay gas unnecessarily,
38
+ // and using just approve() is safe as long as we revert on
39
+ // errors (approveOrRevert handles that) and reset the approvals
40
+ // after transfers (which is a best practice recommended by
41
+ // auditors anyway).
42
+ SafeERC20.forceApprove(IERC20(Currency.unwrap(currency)), spender, amount);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * @dev Transfers an amount of currency to the receiver. If currency is a token,
48
+ * uses SafeERC20.safeTransfer, otherwise transfers the native currency using
49
+ * the recommended approach (`receiver.call{value: amount}("")`).
50
+ * @param currency Currency
51
+ * @param receiver The account that would receive the tokens
52
+ * @param amount The amount to transfer
53
+ */
54
+ function transfer(Currency currency, address receiver, uint256 amount) internal {
55
+ if (currency.isNative()) {
56
+ (bool success, ) = receiver.call{ value: amount }("");
57
+ if (!success) {
58
+ revert NativeTransferFailed();
59
+ }
60
+ } else {
61
+ SafeERC20.safeTransfer(IERC20(Currency.unwrap(currency)), receiver, amount);
62
+ }
63
+ }
64
+
65
+ function transferAll(Currency currency, address receiver) internal {
66
+ uint256 balance = currency.balanceOfSelf();
67
+ if (balance > 0) {
68
+ currency.transfer(receiver, balance);
69
+ }
70
+ }
71
+
72
+ function balanceOfSelf(Currency currency) internal view returns (uint256) {
73
+ if (currency.isNative()) {
74
+ return address(this).balance;
75
+ }
76
+ return IERC20(Currency.unwrap(currency)).balanceOf(address(this));
77
+ }
78
+
79
+ function isNative(Currency currency) internal pure returns (bool) {
80
+ return Currency.unwrap(currency) == Currency.unwrap(NATIVE);
81
+ }
82
+ }