diff --git a/precompiles/Precompiles.sol b/precompiles/Precompiles.sol index 76da39f79..472588760 100644 --- a/precompiles/Precompiles.sol +++ b/precompiles/Precompiles.sol @@ -25,11 +25,11 @@ contract Precompiles { //////////////////////////////////////////////////////////////////////////*/ bytes public constant BYTECODE_LOCKUP_DYNAMIC = - hex"60c034620003dc576001600160401b0390601f601f1962005a0b3881900383810183168501919086831186841017620002f557808692606094604052833981010312620003dc5782516001600160a01b038082169590929091869003620003dc5760209485810151938416809403620003dc57604001519362000081620003e1565b95601d87527f5361626c696572205632204c6f636b75702044796e616d6963204e465400000081880152620000b5620003e1565b90601182527029a0a116ab1916a627a1a5aaa816a22ca760791b81830152306080528751858111620002f5576001988954908a82811c92168015620003d1575b84831014620002d45781868493116200037b575b50839086831160011462000317576000926200030b575b5050600019600383901b1c191690891b1788555b8151948511620002f557600254938885811c95168015620002ea575b82861014620002d457848487961162000277575b50819385116001146200020d57505060009262000201575b5050600019600383901b1c191690841b176002555b60018060a01b03198481600054161760005560085416176008556040519260007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360a0526007556156099081620004028239608051816139a6015260a051818181610c9f0152613a670152f35b0151905038806200017c565b88959392919316600260005283600020936000905b8282106200025d575050841162000243575b505050811b0160025562000191565b015160001960f88460031b161c1916905538808062000234565b8484015186558a9790950194938401939081019062000222565b9091929394506002600052826000208580880160051c820192858910620002ca575b9188978c9297969594930160051c01915b828110620002ba57505062000164565b600081558897508b9101620002aa565b9250819262000299565b634e487b7160e01b600052602260045260246000fd5b94607f169462000150565b634e487b7160e01b600052604160045260246000fd5b01519050388062000120565b90878c94169184600052856000209260005b878282106200036457505084116200034a575b505050811b01885562000134565b015160001960f88460031b161c191690553880806200033c565b8385015186558f9790950194938401930162000329565b9091508a600052836000208680850160051c820192868610620003c7575b918d91869594930160051c01915b828110620003b757505062000109565b600081558594508d9101620003a7565b9250819262000399565b91607f1691620000f5565b600080fd5b60408051919082016001600160401b03811183821017620002f55760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146126dc57508063027b6744146126b957806306fdde03146125f3578063081812fc146125d5578063095ea7b3146124d45780631400ecec1461242f5780631c1cdd4c146123c95780631e99d569146123ab57806323b872dd1461239457806331df3d481461228857806340e58ee514611f8e578063425d30dd14611f3a57806342842e0e14611f0057806342966c6814611d245780634426757014611cfd5780634857501f14611c875780634869e12d14611c4b5780634cc55e1114611b5057806354c02292146118cb5780636352211e1461189c5780636d0cee751461189c57806370a082311461182b57806375829def146117995780637cad6cd11461169e5780637de6b1db146114865780638659c27014611125578063894e9a0d14610d985780638f69b99314610d155780639067b67714610cc25780639188ec8414610c8757806395d89b4114610b77578063a22cb46514610aba578063a80fc07114610a65578063ad35efd414610a02578063b2564569146109ae578063b637b86514610951578063b88d4fde146108c8578063b8a3be6614610891578063b971302a1461083f578063bc2be1be146107ec578063c156a11d146106a8578063c87b56dd14610593578063cc364f48146104f9578063d4dbd20b146104a4578063d511609f14610455578063d975dfed14610408578063e985e9c5146103b1578063ea5ead1914610383578063eac8f5b81461032e578063f590c176146102c9578063f851a440146102a25763fdd46d601461025b57600080fd5b3461029d57606036600319011261029d57610274612809565b6044356001600160801b038116810361029d5761029b9161029361399c565b6004356133a6565b005b600080fd5b3461029d57600036600319011261029d5760206001600160a01b0360005416604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060406000205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160a01b0360016040600020015416604051908152f35b3461029d57604036600319011261029d5761029b6004356103a2612809565b6103ab82614197565b91612ffb565b3461029d57604036600319011261029d576103ca6127f3565b6103d2612809565b906001600160a01b03809116600052600660205260406000209116600052602052602060ff604060002054166040519015158152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757610444602091614197565b6001600160801b0360405191168152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060026040600020015460801c604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160801b0360036040600020015416604051908152f35b3461029d57602036600319011261029d576004356000602060405161051d81612943565b828152015280600052600960205260ff60016040600020015460a81c16156103175760005260096020526040806000205464ffffffffff82519161056083612943565b818160a01c16835260c81c166020820152610591825180926020908164ffffffffff91828151168552015116910152565bf35b3461029d5760208060031936011261029d57600435906105b282613735565b5060006001600160a01b0360085416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561069c57600092610623575b5061061f6040519282849384528301906127ce565b0390f35b9091503d806000833e6106368183612990565b810190828183031261029d5780519067ffffffffffffffff821161029d570181601f8201121561029d57805161066b816129b2565b926106796040519485612990565b81845284828401011161029d57610695918480850191016127ab565b908261060a565b6040513d6000823e3d90fd5b3461029d57604036600319011261029d576004356106c4612809565b6106cc61399c565b81600052600960205260ff60016040600020015460a81c16156107d5578160005260036020526001600160a01b038060406000205416918233036107b65761071384614197565b6001600160801b0381166107a5575b508181161561078d578361073591613857565b908116806107555760248460405190637e27328960e01b82526004820152fd5b820361075d57005b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b6024604051633250574960e11b815260006004820152fd5b6107b0908486612ffb565b84610722565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602064ffffffffff60406000205460a01c16604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160a01b0360406000205416604051908152f35b3461029d57602036600319011261029d576004356000526009602052602060ff60016040600020015460a81c166040519015158152f35b3461029d57608036600319011261029d576108e16127f3565b6108e9612809565b6064359167ffffffffffffffff831161029d573660238401121561029d57826004013591610916836129b2565b926109246040519485612990565b808452366024828701011161029d57602081600092602461029b9801838801378501015260443591612e87565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600a60205261061f61099a6040600020612df7565b604051918291602083526020830190612899565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060ff60016040600020015460b01c166040519015158152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757610a3c906137d0565b6040516005821015610a4f576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160801b0360026040600020015416604051908152f35b3461029d57604036600319011261029d57610ad36127f3565b6024359081151580920361029d576001600160a01b0316908115610b4657336000526006602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b3461029d57600036600319011261029d5760405160006002549060018260011c9160018416918215610c7d575b6020948585108414610c67578587948686529182600014610c47575050600114610bea575b50610bd692500383612990565b61061f6040519282849384528301906127ce565b84915060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace906000915b858310610c2f575050610bd6935082010185610bc9565b80548389018501528794508693909201918101610c18565b60ff191685820152610bd695151560051b8501019250879150610bc99050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ba4565b3461029d57600036600319011261029d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602064ffffffffff60406000205460c81c16604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757610d4f906137d0565b600581101580610a4f5760028214908115610d8b575b8115610d79575b6020826040519015158152f35b9050610a4f5760046020911482610d6c565b5050600381146000610d65565b3461029d57602036600319011261029d57604051610180810181811067ffffffffffffffff8211176110eb576060916101609160405260008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526000610120820152610e1a612da4565b6101408201520152600435600052600960205260ff60016040600020015460a81c161561110d5760043560005260096020526040600020610eeb600260405192610e6384612973565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015201612dc3565b610120820152610efc6004356137d0565b6005811015610a4f57600214611101575b610120810151906001600160a01b0360a0820151169164ffffffffff6040830151166060830151151591610100840151151560c0850151151560e086015115159060043560005260036020526001600160a01b036040600020541697600a6020526040600020956001600160a01b0389511697608064ffffffffff60208c0151169a01511515916040519a8b67ffffffffffffffff6101808281810110920111176110eb576101609c610ffe9b6101808e016040528d5260208d015260408c015260608b015260808a015260a089015260c088015260e0870152610100860152610120850152610140840152612df7565b8282015261061f604051928392602084526001600160a01b0381511660208501526001600160a01b03602082015116604085015264ffffffffff604082015116606085015264ffffffffff60608201511660808501526080810151151560a085015260a0810151151560c08501526001600160a01b0360c08201511660e085015260e081015115156101008501526101008101511515610120850152610120810151151561014085015261014081015160406001600160801b03918281511685880152826020820151166101808801520151166101a085015201516101c0808401526101e0830190612899565b634e487b7160e01b600052604160045260246000fd5b60006060820152610f0d565b602460405162b8e7e760e51b81526004356004820152fd5b3461029d5760208060031936011261029d5760043567ffffffffffffffff811161029d57611157903690600401612868565b9061116061399c565b6000915b80831061116d57005b611178838284612d49565b359261118261399c565b83600052600980865260ff90600182816040600020015460a81c161561146f57866000528188526040600020838282015460a01c166000146111d65760248860405190634a5541ef60e01b82526004820152fd5b969495965460f81c611457576112028560005260096020526001600160a01b0360406000205416331490565b156114385761121085613758565b91856000528089526112286002604060002001612dc3565b926001600160801b03948585511686831610156114205787600052828b5260406000205460f01c16156114085780858b6112686112729483895116612a06565b9601511690612a06565b86600052818a528960406000207f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50815496600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89161783558a6113578a8716998a156113ef575b60038096019b84169b8c6fffffffffffffffffffffffffffffffff198254161790556001600160a01b03809116998a9688528160406000205416998a985260406000200154169661132d8c878a6145d5565b60405193849384916040919493606084019584526001600160801b03809216602085015216910152565b0390a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce789604051888152a1803b61139a575b5050505060019150019190611164565b803b1561029d5760019560006084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af16113e0575b80808061138a565b6113e99061295f565b856113d8565b898601600160a01b60ff60a01b198254161790556112db565b602487604051906339c6dc7360e21b82526004820152fd5b602488604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101869052336024820152604490fd5b6024856040519063fe19f19f60e01b82526004820152fd5b6024876040519062b8e7e760e51b82526004820152fd5b3461029d5760208060031936011261029d57600435906114a461399c565b816000526009815260ff60016040600020015460a81c16156107d5576114c9826137d0565b6005811015610a4f57600481036114f25760248360405190634a5541ef60e01b82526004820152fd5b60038103611512576024836040519063fe19f19f60e01b82526004820152fd5b600214611686576115398260005260096020526001600160a01b0360406000205416331490565b1561166757816000526009815260ff60406000205460f01c161561164f578160005260098152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600382526001600160a01b036040600020541692833b6115e0575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78383604051908152a1005b833b1561029d57600081602481837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7987f450154640000000000000000000000000000000000000000000000000000000083528760048401525af1156115b4576116499061295f565b836115b4565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b3461029d57602036600319011261029d576004356001600160a01b039081811680910361029d578160005416338103611770575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600754600019810190811161175a5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461029d57602036600319011261029d576117b26127f3565b6000546001600160a01b0380821692338403611804576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461029d57602036600319011261029d576001600160a01b0361184c6127f3565b16801561186b5760005260046020526020604060002054604051908152f35b60246040517f89c62b6400000000000000000000000000000000000000000000000000000000815260006004820152fd5b3461029d57602036600319011261029d5760206118ba600435613735565b6001600160a01b0360405191168152f35b3461029d576020600319818136011261029d5760043567ffffffffffffffff9182821161029d576101208236039182011261029d5761190861399c565b60c4820135906022190181121561029d57810160048101359083821161029d57602401606082023603811361029d57611942913691612c7a565b9182519161194f83612c62565b9261195d6040519485612990565b808452601f1961196c82612c62565b018660005b828110611b3a5750505064ffffffffff90814216936001600160801b039687611999826139f8565b515116828a6119a7846139f8565b51015116858060406119b8866139f8565b5101511689011690604051926119cd84612927565b83528b83015260408201526119e1886139f8565b526119eb876139f8565b506001938760015b8a8c878310611ab95790838b8b611a0c81600401612d83565b92611a1960248301612d83565b92611a2660448401612d6f565b946064840135946001600160a01b039586811680910361029d57611ab198611a7198611aa698611a5860848a01612d97565b9481611a6660a48c01612d97565b976040519d8e61290a565b168c52168c8b0152166040890152606088015215156080870152151560a086015260c085015260e084015260e4369101612d1a565b610100820152613a19565b604051908152f35b889385806040611aed8b86611add8a8e9a611ad4828d613a05565b5151169a613a05565b5101511694600019890190613a05565b51015116816040611afe888c613a05565b5101511601169160405193611b1285612927565b84528301526040820152611b26828c613a05565b52611b31818b613a05565b500188906119f3565b611b42612da4565b828289010152018790611971565b3461029d57604036600319011261029d5767ffffffffffffffff60043581811161029d57611b82903690600401612868565b9160243590811161029d57611b9b903690600401612868565b9091611ba561399c565b818403611c145760005b848110611bb857005b80611c0e611bc96001938886612d49565b35611bd5838987612d49565b3560005260036020526001600160a01b0360406000205416611c00611bfb85898b612d49565b612d6f565b91611c0961399c565b6133a6565b01611baf565b60448483604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c16156103175761044460209161462f565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000611cc3826137d0565b6005811015610a4f57600203611ce1575b6020906040519015158152f35b506000526009602052602060ff60406000205460f01c16611cd4565b3461029d57600036600319011261029d5760206001600160a01b0360085416604051908152f35b3461029d5760208060031936011261029d5760043590611d4261399c565b816000526009815260ff60016040600020015460a81c16156107d557816000526009815260ff60016040600020015460a01c1615611ecf57611d83826140fe565b156116675781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c16159081611ec5575b5080611ebd575b611ea5577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790836000526003835260406000205416918215928315611e6a575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a1611e5257005b60249060405190637e27328960e01b82526004820152fd5b611e8b85600052600560205260406000206001600160a01b03198154169055565b806000526004825260406000206000198154019055611e02565b60248360405190630da9b01360e01b82526004820152fd5b506000611dc2565b9050151584611dbb565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461029d57611f0e36612833565b60405191602083019383851067ffffffffffffffff8611176110eb5761029b9460405260008452612e87565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060ff60016040600020015460a01c166040519015158152f35b3461029d5760208060031936011261029d5760043590611fac61399c565b8160005260099081815260ff60016040600020015460a81c16156122715782600052818152604060002060ff600182015460a01c166000146120005760248460405190634a5541ef60e01b82526004820152fd5b5460f81c612259576120288360005260096020526001600160a01b0360406000205416331490565b1561223a5761203683613758565b928060005282825261204e6002604060002001612dc3565b916001600160801b0394858451168682161015612222578260005284825260ff60406000205460f01c161561220a57816120df82888796956120d57ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce796837f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509b5116612a06565b9701511690612a06565b9383600052868252604060002096875495600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff881617895560038a8216998a156121f0575b01998316998a6fffffffffffffffffffffffffffffffff198254161790556001600160a01b03809716978891600386528860406000205416988994875260016040600020015416946121798d85886145d5565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ab57005b813b1561029d5760006084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af16121e757005b61029b9061295f565b60018101600160a01b60ff60a01b19825416179055612126565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024836040519063fe19f19f60e01b82526004820152fd5b6024836040519062b8e7e760e51b82526004820152fd5b3461029d5760031960203682011261029d5760043567ffffffffffffffff9182821161029d5761014090823603011261029d576122c361399c565b604051916122d08361290a565b6122dc8260040161281f565b83526122ea6024830161281f565b60208401526122fb604483016129ce565b604084015260648201356001600160a01b038116810361029d576060840152612326608483016128fd565b608084015261233760a483016128fd565b60a084015261234860c48301612c50565b60c084015260e482013590811161029d578101913660238401121561029d57611aa6611ab1926123846020953690602460048201359101612c7a565b60e0840152610104369101612d1a565b3461029d5761029b6123a536612833565b91612a1f565b3461029d57600036600319011261029d576020600754604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757612403906137d0565b6005811015610a4f578060209115908115612424575b506040519015158152f35b600191501482612419565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576020906000908060005260098352604060002060ff815460f01c16806124c2575b612499575b50506001600160801b0360405191168152f35b6124bb92506001600160801b0360026124b59201541691613758565b90612a06565b8280612486565b5060ff600182015460a01c1615612481565b3461029d57604036600319011261029d576124ed6127f3565b6024356124f981613735565b331515806125c2575b80612594575b6125645781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460005260056020526040600020906001600160a01b0319825416179055600080f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116600052600660205260406000203360005260205260ff6040600020541615612508565b50336001600160a01b0382161415612502565b3461029d57602036600319011261029d5760206118ba6004356129e2565b3461029d57600036600319011261029d576040516000600190600154918260011c91600184169182156126af575b6020948585108414610c67578587948686529182600014610c475750506001146126525750610bd692500383612990565b84915060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6906000915b858310612697575050610bd6935082010185610bc9565b80548389018501528794508693909201918101612680565b92607f1692612621565b3461029d57600036600319011261029d57602060405167016345785d8a00008152f35b3461029d57602036600319011261029d57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361029d57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612781575b8115612757575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612750565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612749565b60005b8381106127be5750506000910152565b81810151838201526020016127ae565b906020916127e7815180928185528580860191016127ab565b601f01601f1916010190565b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b35906001600160a01b038216820361029d57565b606090600319011261029d576001600160a01b0390600435828116810361029d5791602435908116810361029d579060443590565b9181601f8401121561029d5782359167ffffffffffffffff831161029d576020808501948460051b01011161029d57565b90815180825260208080930193019160005b8281106128b9575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff1690860152606090940193928101926001016128ab565b3590811515820361029d57565b610120810190811067ffffffffffffffff8211176110eb57604052565b6060810190811067ffffffffffffffff8211176110eb57604052565b6040810190811067ffffffffffffffff8211176110eb57604052565b67ffffffffffffffff81116110eb57604052565b610140810190811067ffffffffffffffff8211176110eb57604052565b90601f8019910116810190811067ffffffffffffffff8211176110eb57604052565b67ffffffffffffffff81116110eb57601f01601f191660200190565b35906001600160801b038216820361029d57565b6129eb81613735565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161175a57565b906001600160a01b03809116801561078d57600091848352602091600383526040928284862054166009825260ff6001868820015460b01c16159081612c46575b5080612c3e575b612c27578685526003815282848620541694873315159384612b77575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7945087612b3f575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a183168203612b115750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b612b6082600052600560205260406000206001600160a01b03198154169055565b878352600484528683208054600019019055612aad565b91929380915090612be6575b15612b915790878392612a84565b848887612bae576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015612c0b575b80612b835750878252600583523384868420541614612b83565b5085825260068352848220338352835260ff8583205416612bf1565b602487855190630da9b01360e01b82526004820152fd5b506001612a67565b9050151538612a60565b359064ffffffffff8216820361029d57565b67ffffffffffffffff81116110eb5760051b60200190565b929192612c8682612c62565b604094612c966040519283612990565b8195848352602080930191606080960285019481861161029d57925b858410612cc25750505050505050565b868483031261029d57825190612cd782612927565b612ce0856129ce565b8252858501359067ffffffffffffffff8216820361029d57828792838b950152612d0b868801612c50565b86820152815201930192612cb2565b919082604091031261029d57604051612d3281612943565b6020808294612d408161281f565b84520135910152565b9190811015612d595760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160801b038116810361029d5790565b356001600160a01b038116810361029d5790565b35801515810361029d5790565b60405190612db182612927565b60006040838281528260208201520152565b90604051612dd081612927565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b908154612e0381612c62565b92604093612e146040519182612990565b82815280946020809201926000526020600020906000935b858510612e3b57505050505050565b60018481928451612e4b81612927565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391612e2c565b9190612e94828285612a1f565b803b612ea1575b50505050565b612efd6001600160a01b03809216946040519384937f150b7a02000000000000000000000000000000000000000000000000000000009687865233600487015216602485015260448401526080606484015260848301906127ce565b03906020816000938185885af190829082612f93575b5050612f4a5782612f22614167565b8051919082612f435760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff000000000000000000000000000000000000000000000000000000001603612f7b575038808080612e9b565b60249060405190633250574960e11b82526004820152fd5b909192506020813d602011612ff3575b81612fb060209383612990565b81010312612fef5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612fec5750903880612f13565b80fd5b5080fd5b3d9150612fa3565b9291909261300761399c565b60009381855260099260209380855260409260ff6001858a20015460a81c16156133905784885281865260ff6001858a20015460a01c16613379576001600160a01b0391828216928315613369576001600160801b039384861691821561335257888c5260038a5280888d205416938483141580613342575b61331f5761308d8a614197565b87811685116132ee57508a8a928e928484528083528b8085209a8c848d54169c6002015460801c906130be916141bf565b878752838652828720600201908282549160801b6fffffffffffffffffffffffffffffffff191691161781556130f390612dc3565b90808683015116918184818351169201511661310e91612a06565b161115946001927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d966132c1575b878252855220015416946131518189886145d5565b8a51908152a480331415806132b7575b613252575b823314159081613247575b8161323c575b506131ab575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce793945051908152a1565b813b15613238578351636fd110e960e01b8152600481018690523360248201526001600160a01b0390911660448201526001600160801b03909216606483015294957ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79582908183816084810103925af1613229575b85948161317d565b6132329061295f565b38613221565b8780fd5b905082141538613177565b833b15159150613171565b803b156132b3578451636fd110e960e01b8152600481018790523360248201526001600160a01b03831660448201526001600160801b0385166064820152898160848183865af16132a4575b50613166565b6132ad9061295f565b3861329e565b8880fd5b50803b1515613161565b878252808652828220848101600160a01b60ff60a01b1982541617905560ff60f01b19815416905561313c565b895163287ecaef60e21b8152600481018c90526001600160801b038a81166024830152919091166044820152606490fd5b60648a848b519163b34359d360e01b835260048301523360248301526044820152fd5b5061334c8a6140fe565b15613080565b60248989519063d2aabcd960e01b82526004820152fd5b6004865163630d074f60e11b8152fd5b602485855190634a5541ef60e01b82526004820152fd5b60248585519062b8e7e760e51b82526004820152fd5b9291909260009381855260099060209382855260409260ff6001858a20015460a81c1615613390578785815281875260ff6001868320015460a01c1661371e576001600160a01b039081851692831561370e576001600160801b03938486169182156136f75789845260038b528489852054169485831415806136e7575b6136c45761344b8b838e6134378361462f565b9289525260028c8820015460801c90612a06565b87811685116136935750908b8b928387528282528b808820998b838c54169b6002015460801c9061347b916141bf565b868a52858552828a20600201908282549160801b6fffffffffffffffffffffffffffffffff191691161781556134b090612dc3565b818086830151169381835116920151166134c991612a06565b161115927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d93613665575b848852825260018c88200154169461350d818c886145d5565b8b51908152a4813314158061365b575b6135f5575b508133141590816135ea575b816135df575b50613567575050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce793945051908152a1565b908188923b156135db578451636fd110e960e01b8152600481018790523360248201526001600160a01b0390941660448501526001600160801b03909116606484015282908183816084810103925af16135c3575b808061317d565b6135cd869161295f565b6135d757846135bc565b8480fd5b8280fd5b905081141538613534565b823b1515915061352e565b813b15612fec578551636fd110e960e01b8152600481018890523360248201526001600160a01b03861660448201526001600160801b0385166064820152818160848183875af1613647575b50613522565b61365391929a5061295f565b973880613641565b50813b151561351d565b8488528083528c882060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556134f4565b8a5163287ecaef60e21b8152600481018d90526001600160801b038a81166024830152919091166044820152606490fd5b60648b848c519163b34359d360e01b835260048301523360248301526044820152fd5b506136f18b6140fe565b15613424565b60248a8a519063d2aabcd960e01b82526004820152fd5b6004875163630d074f60e11b8152fd5b602486865190634a5541ef60e01b82526004820152fd5b8060005260036020526001600160a01b0360406000205416908115611e52575090565b64ffffffffff804216826000526009602052604060002091825482828260a01c1610156137c65760c81c1611156137b45750600a6020526001604060002054116000146137ab576137a8906142ab565b90565b6137a8906141da565b6001600160801b039150600201541690565b5050505050600090565b806000526009602052604060002060ff600182015460a01c166000146137f7575050600490565b805460f81c613850575460a01c64ffffffffff16421061384a5761381a81613758565b9060005260096020526001600160801b03806002604060002001541691161060001461384557600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613992575b5080613987575b613970579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84838720541694859283613938575b169283613922575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b83875260048852808720600181540190556138fe565b61395986600052600560205260406000206001600160a01b03198154169055565b8388526004895284882080546000190190556138f6565b602486885190630da9b01360e01b82526004820152fd5b508181161515613895565b905015153861388e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036139ce57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b805115612d595760200190565b8051821015612d595760209160051b010190565b90613a3b6001600160801b03604084015116602061010085015101519061448b565b6001600160801b0381511660e084015164ffffffffff60c08601511682156140d457815180156140aa577f00000000000000000000000000000000000000000000000000000000000000008111614079575064ffffffffff6040613a9e846139f8565b510151168110156140225750600090819082815184905b808210613f91575050505064ffffffffff421664ffffffffff8216811015613f515750506001600160801b0316808203613f1a575050600754928360005260096020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036060830151166001840154750100000000000000000000000000000000000000000060808501511515918654937fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff0000000000000000000000000000000000000000000060a0890151151560b01b16921617171760018601556001600160a01b0384511678ffffffffff000000000000000000000000000000000000000060c086015160a01b169060e0860151937fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff000000000000000000000000000000000000000000000000006040613c518951996000198b0190613a05565b51015160c81b169560f01b16911617171717845560005b818110613e48575050600185016007556001600160a01b03602083015116801561078d57613c9e866001600160a01b0392613857565b16613e1757613cc96001600160a01b036060840151166001600160801b038351169030903390614564565b6001600160801b0360208201511680613de7575b507f33eb09bbf19ea3fb22c760d5164234f8bf62ca07dcf5a437ad389e96b0bd644360206001600160a01b03845116926001600160a01b038286015116946001600160a01b0360608201511696613ddc613dbd60808401511515928c60a086015115156001600160a01b0361010060e089015194549864ffffffffff6040519a613d668c612943565b818160a01c168c5260c81c168c8b015201515116956001600160801b036040519a8b9a610140958c5233828d01528281511660408d015201511660608a0152608089015260a08801528060c0880152860190612899565b9260e08501906020908164ffffffffff91828151168552015116910152565b6101208301520390a4565b613e11906001600160a01b036060850151166001600160a01b036101008601515116903390614564565b38613cdd565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b86600052600a602052604060002090613e658160e0870151613a05565b518254680100000000000000008110156110eb5760018101808555811015612d5957600193600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501613c68565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193613fb5906001600160801b03613fac8588613a05565b515116906141bf565b9364ffffffffff806040613fc98685613a05565b51015116941680851115613fe557506001849301909291613ab5565b8385606492604051927f9588ac09000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614033846139f8565b5101516040517ff539a17c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b038060408420541692833314938415614143575b5050821561413157505090565b90915061413e33926129e2565b161490565b60ff9294509060409181526006602052818120338252602052205416913880614124565b3d15614192573d90614178826129b2565b916141866040519384612990565b82523d6000602084013e565b606090565b6137a8906141a48161462f565b90600052600960205260026040600020015460801c90612a06565b9190916001600160801b038080941691160191821161175a57565b64ffffffffff61420f600091838352600960205280806040852054818160a01c1693849160c81c1603169181421603166146aa565b91808252600a602052604082208054156142975790829167ffffffffffffffff9352614269602083205482845260096020526142646001600160801b03968760026040882001541696879360801c169061479a565b614808565b92831361427f57505061427b906148f2565b1690565b60029350604092508152600960205220015460801c90565b602483634e487b7160e01b81526032600452fd5b64ffffffffff80421660008381526009602052604091828220908351916142d183612973565b80549661012061435760026001600160a01b0394858c168852602088019b8b8160a01c168d528b8160c81c168b8a015260ff8160f01c16151560608a015260f81c1515608089015260ff600196600183015490811660a08b0152818160a01c16151560c08b0152818160a81c16151560e08b015260b01c16151561010089015201612dc3565b94019384528452600a60205261436e858520612df7565b918496808761437c866139f8565b5101511692828288955b161061445557509161440a6142649284888161440f98976001600160801b039e8f6143b1898c613a05565b5151169d8e9a67ffffffffffffffff60206143cc8c84613a05565b510151169984836143dd8385613a05565b5101511696508015614449576143f99293506000190190613a05565b5101511680925b03169203166146aa565b61479a565b92831361442857505061442283916148f2565b16011690565b5160200151929392831692841683101591506144449050575090565b905090565b50505051168092614400565b8093986001600160801b03908161446c8c89613a05565b51511601169801928282808a614482888a613a05565b51015116614386565b9190916040519061449b82612943565b600091828152826020820152936001600160801b03928383169182156145455767016345785d8a000080821161450e57506144d78591846154ba565b16602087019281845211156144fa575090826144f592511690612a06565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b509394505050506040519061455982612943565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176110eb576145d39260405261492e565b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b039290921660248301526044808301939093529181526145d39161462a606483612990565b61492e565b8060005260096020526146486002604060002001612dc3565b816000526009602052604060002060ff600182015460a01c1660001461467b57506001600160801b039150602001511690565b5460f81c61468d57506137a890613758565b6137a891506001600160801b036040818351169201511690612a06565b600160ff1b808214908115614790575b5061476657600081121561475d576146e3816000035b60008412156147565783600003906149ca565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161471f57600019911813156147195790565b60000390565b60449250604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b83906149ca565b6146e3816146d0565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508214386146ba565b806147b557506147b057670de0b6b3a764000090565b600090565b90670de0b6b3a76400008083146148025750806147da575050670de0b6b3a764000090565b670de0b6b3a764000081146147fe576147f9906142646137a893614ac4565b614c06565b5090565b91505090565b600160ff1b8082149081156148e8575b506148be5760008112156148b557614841816000035b60008412156148ae5783600003906154ba565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161487757600019911813156147195790565b60449250604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b83906154ba565b6148418161482e565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050821438614818565b600081126148fd5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b6001600160a01b031690614959600080836020829551910182875af1614952614167565b9084615569565b9081519182151592836149a2575b5050506149715750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312612fef576020015190811591821503612fec5750388080614967565b670de0b6b3a7640000916000198383099280830292838086109503948086039514614a865782851015614a4a57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015614a94570490565b634e487b7160e01b600052601260045260246000fd5b8015614a94576ec097ce7bc90715b34b9f10000000000590565b80600080831315614bd557670de0b6b3a764000092838112614bb257506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c93600197600160038711811b96871c11961717171717171781810294811d90828214614ba657506706f05b59d3b20000905b848213614b7a5750505050500290565b808391020590671bc16d674ec80000821215614b99575b831d90614b6a565b8091950194831d90614b91565b93505093925050020290565b6000199392508015614a94576ec097ce7bc90715b34b9f10000000000591614ae5565b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000811215614c355768033dd1780914b9711419811261384a57614c2c90600003614c06565b6137a890614aaa565b680a688906bd8affffff811361548957670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661536c575b66ff0000000000008316615264575b65ff00000000008316615164575b64ff00000000831661506c575b63ff0000008316614f7c575b62ff00008316614e94575b61ff008316614db4575b60ff8316614cdd575b02911c60bf031c90565b60808316614da2575b838316614d90575b60208316614d7e575b60108316614d6c575b60088316614d5a575b60048316614d48575b60028316614d36575b6001831615614cd3576801000000000000000102831c614cd3565b6801000000000000000102831c614d1b565b6801000000000000000302831c614d12565b6801000000000000000602831c614d09565b6801000000000000000b02831c614d00565b6801000000000000001602831c614cf7565b6801000000000000002c02831c614cee565b6801000000000000005902831c614ce6565b6180008316614e82575b6140008316614e70575b6120008316614e5e575b6110008316614e4c575b6108008316614e3a575b6104008316614e28575b6102008316614e16575b610100831615614cca57680100000000000000b102831c614cca565b6801000000000000016302831c614dfa565b680100000000000002c602831c614df0565b6801000000000000058c02831c614de6565b68010000000000000b1702831c614ddc565b6801000000000000162e02831c614dd2565b68010000000000002c5d02831c614dc8565b680100000000000058b902831c614dbe565b628000008316614f6a575b624000008316614f58575b622000008316614f46575b621000008316614f34575b620800008316614f22575b620400008316614f10575b620200008316614efe575b62010000831615614cc0576801000000000000b17202831c614cc0565b680100000000000162e402831c614ee1565b6801000000000002c5c802831c614ed6565b68010000000000058b9102831c614ecb565b680100000000000b172102831c614ec0565b68010000000000162e4302831c614eb5565b680100000000002c5c8602831c614eaa565b6801000000000058b90c02831c614e9f565b6380000000831661505a575b63400000008316615048575b63200000008316615036575b63100000008316615024575b63080000008316615012575b63040000008316615000575b63020000008316614fee575b6301000000831615614cb55768010000000000b1721802831c614cb5565b6801000000000162e43002831c614fd0565b68010000000002c5c86002831c614fc4565b680100000000058b90c002831c614fb8565b6801000000000b17217f02831c614fac565b680100000000162e42ff02831c614fa0565b6801000000002c5c85fe02831c614f94565b68010000000058b90bfc02831c614f88565b6480000000008316615152575b6440000000008316615140575b642000000000831661512e575b641000000000831661511c575b640800000000831661510a575b64040000000083166150f8575b64020000000083166150e6575b640100000000831615614ca957680100000000b17217f802831c614ca9565b68010000000162e42ff102831c6150c7565b680100000002c5c85fe302831c6150ba565b6801000000058b90bfce02831c6150ad565b68010000000b17217fbb02831c6150a0565b6801000000162e42fff002831c615093565b68010000002c5c8601cc02831c615086565b680100000058b90c0b4902831c615079565b658000000000008316615252575b654000000000008316615240575b65200000000000831661522e575b65100000000000831661521c575b65080000000000831661520a575b6504000000000083166151f8575b6502000000000083166151e6575b65010000000000831615614c9c576801000000b17218355102831c614c9c565b680100000162e430e5a202831c6151c6565b6801000002c5c863b73f02831c6151b8565b68010000058b90cf1e6e02831c6151aa565b680100000b1721bcfc9a02831c61519c565b68010000162e43f4f83102831c61518e565b680100002c5c89d5ec6d02831c615180565b6801000058b91b5bc9ae02831c615172565b6680000000000000831661535a575b66400000000000008316615348575b66200000000000008316615336575b66100000000000008316615324575b66080000000000008316615312575b66040000000000008316615300575b660200000000000083166152ee575b6601000000000000831615614c8e5768010000b17255775c0402831c614c8e565b6801000162e525ee054702831c6152cd565b68010002c5cc37da949202831c6152be565b680100058ba01fb9f96d02831c6152af565b6801000b175effdc76ba02831c6152a0565b680100162f3904051fa102831c615291565b6801002c605e2e8cec5002831c615282565b68010058c86da1c09ea202831c615273565b678000000000000000831661546a575b6740000000000000008316615458575b6720000000000000008316615446575b6710000000000000008316615434575b6708000000000000008316615422575b6704000000000000008316615410575b67020000000000000083166153fe575b670100000000000000831615614c7f57680100b1afa5abcbed6102831c614c7f565b68010163da9fb33356d802831c6153dc565b680102c9a3e778060ee702831c6153cc565b6801059b0d31585743ae02831c6153bc565b68010b5586cf9890f62a02831c6153ac565b6801172b83c7d517adce02831c61539c565b6801306fe0a31b7152df02831c61538c565b5077b504f333f9de64848000000000000000000000000000000061537c565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b9091906000198382098382029182808310920391808303921461555857670de0b6b3a7640000908183101561552157947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b906155a8575080511561557e57805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b815115806155f3575b6155b9575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b156155b156fea164736f6c6343000817000a"; + hex"60c034620003dc576001600160401b0390601f601f1962005a3b3881900383810183168501919086831186841017620002f557808692606094604052833981010312620003dc5782516001600160a01b038082169590929091869003620003dc5760209485810151938416809403620003dc57604001519362000081620003e1565b95601d87527f5361626c696572205632204c6f636b75702044796e616d6963204e465400000081880152620000b5620003e1565b90601182527029a0a116ab1916a627a1a5aaa816a22ca760791b81830152306080528751858111620002f5576001988954908a82811c92168015620003d1575b84831014620002d45781868493116200037b575b50839086831160011462000317576000926200030b575b5050600019600383901b1c191690891b1788555b8151948511620002f557600254938885811c95168015620002ea575b82861014620002d457848487961162000277575b50819385116001146200020d57505060009262000201575b5050600019600383901b1c191690841b176002555b60018060a01b03198481600054161760005560085416176008556040519260007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360a0526007556156399081620004028239608051816139a6015260a051818181610c9f0152613a6d0152f35b0151905038806200017c565b88959392919316600260005283600020936000905b8282106200025d575050841162000243575b505050811b0160025562000191565b015160001960f88460031b161c1916905538808062000234565b8484015186558a9790950194938401939081019062000222565b9091929394506002600052826000208580880160051c820192858910620002ca575b9188978c9297969594930160051c01915b828110620002ba57505062000164565b600081558897508b9101620002aa565b9250819262000299565b634e487b7160e01b600052602260045260246000fd5b94607f169462000150565b634e487b7160e01b600052604160045260246000fd5b01519050388062000120565b90878c94169184600052856000209260005b878282106200036457505084116200034a575b505050811b01885562000134565b015160001960f88460031b161c191690553880806200033c565b8385015186558f9790950194938401930162000329565b9091508a600052836000208680850160051c820192868610620003c7575b918d91869594930160051c01915b828110620003b757505062000109565b600081558594508d9101620003a7565b9250819262000399565b91607f1691620000f5565b600080fd5b60408051919082016001600160401b03811183821017620002f55760405256fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146126dc57508063027b6744146126b957806306fdde03146125f3578063081812fc146125d5578063095ea7b3146124d45780631400ecec1461242f5780631c1cdd4c146123c95780631e99d569146123ab57806323b872dd1461239457806331df3d481461228857806340e58ee514611f8e578063425d30dd14611f3a57806342842e0e14611f0057806342966c6814611d245780634426757014611cfd5780634857501f14611c875780634869e12d14611c4b5780634cc55e1114611b5057806354c02292146118cb5780636352211e1461189c5780636d0cee751461189c57806370a082311461182b57806375829def146117995780637cad6cd11461169e5780637de6b1db146114865780638659c27014611125578063894e9a0d14610d985780638f69b99314610d155780639067b67714610cc25780639188ec8414610c8757806395d89b4114610b77578063a22cb46514610aba578063a80fc07114610a65578063ad35efd414610a02578063b2564569146109ae578063b637b86514610951578063b88d4fde146108c8578063b8a3be6614610891578063b971302a1461083f578063bc2be1be146107ec578063c156a11d146106a8578063c87b56dd14610593578063cc364f48146104f9578063d4dbd20b146104a4578063d511609f14610455578063d975dfed14610408578063e985e9c5146103b1578063ea5ead1914610383578063eac8f5b81461032e578063f590c176146102c9578063f851a440146102a25763fdd46d601461025b57600080fd5b3461029d57606036600319011261029d57610274612809565b6044356001600160801b038116810361029d5761029b9161029361399c565b6004356133a6565b005b600080fd5b3461029d57600036600319011261029d5760206001600160a01b0360005416604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060406000205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160a01b0360016040600020015416604051908152f35b3461029d57604036600319011261029d5761029b6004356103a2612809565b6103ab826141c7565b91612ffb565b3461029d57604036600319011261029d576103ca6127f3565b6103d2612809565b906001600160a01b03809116600052600660205260406000209116600052602052602060ff604060002054166040519015158152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576104446020916141c7565b6001600160801b0360405191168152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060026040600020015460801c604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160801b0360036040600020015416604051908152f35b3461029d57602036600319011261029d576004356000602060405161051d81612943565b828152015280600052600960205260ff60016040600020015460a81c16156103175760005260096020526040806000205464ffffffffff82519161056083612943565b818160a01c16835260c81c166020820152610591825180926020908164ffffffffff91828151168552015116910152565bf35b3461029d5760208060031936011261029d57600435906105b282613735565b5060006001600160a01b0360085416926044604051809581937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa91821561069c57600092610623575b5061061f6040519282849384528301906127ce565b0390f35b9091503d806000833e6106368183612990565b810190828183031261029d5780519067ffffffffffffffff821161029d570181601f8201121561029d57805161066b816129b2565b926106796040519485612990565b81845284828401011161029d57610695918480850191016127ab565b908261060a565b6040513d6000823e3d90fd5b3461029d57604036600319011261029d576004356106c4612809565b6106cc61399c565b81600052600960205260ff60016040600020015460a81c16156107d5578160005260036020526001600160a01b038060406000205416918233036107b657610713846141c7565b6001600160801b0381166107a5575b508181161561078d578361073591613857565b908116806107555760248460405190637e27328960e01b82526004820152fd5b820361075d57005b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b6024604051633250574960e11b815260006004820152fd5b6107b0908486612ffb565b84610722565b60405163216caf0d60e01b815260048101859052336024820152604490fd5b6024826040519062b8e7e760e51b82526004820152fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602064ffffffffff60406000205460a01c16604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160a01b0360406000205416604051908152f35b3461029d57602036600319011261029d576004356000526009602052602060ff60016040600020015460a81c166040519015158152f35b3461029d57608036600319011261029d576108e16127f3565b6108e9612809565b6064359167ffffffffffffffff831161029d573660238401121561029d57826004013591610916836129b2565b926109246040519485612990565b808452366024828701011161029d57602081600092602461029b9801838801378501015260443591612e87565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600a60205261061f61099a6040600020612df7565b604051918291602083526020830190612899565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060ff60016040600020015460b01c166040519015158152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757610a3c906137d0565b6040516005821015610a4f576020918152f35b634e487b7160e01b600052602160045260246000fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757600052600960205260206001600160801b0360026040600020015416604051908152f35b3461029d57604036600319011261029d57610ad36127f3565b6024359081151580920361029d576001600160a01b0316908115610b4657336000526006602052604060002082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b3461029d57600036600319011261029d5760405160006002549060018260011c9160018416918215610c7d575b6020948585108414610c67578587948686529182600014610c47575050600114610bea575b50610bd692500383612990565b61061f6040519282849384528301906127ce565b84915060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace906000915b858310610c2f575050610bd6935082010185610bc9565b80548389018501528794508693909201918101610c18565b60ff191685820152610bd695151560051b8501019250879150610bc99050565b634e487b7160e01b600052602260045260246000fd5b92607f1692610ba4565b3461029d57600036600319011261029d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602064ffffffffff60406000205460c81c16604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757610d4f906137d0565b600581101580610a4f5760028214908115610d8b575b8115610d79575b6020826040519015158152f35b9050610a4f5760046020911482610d6c565b5050600381146000610d65565b3461029d57602036600319011261029d57604051610180810181811067ffffffffffffffff8211176110eb576060916101609160405260008152600060208201526000604082015260008382015260006080820152600060a0820152600060c0820152600060e082015260006101008201526000610120820152610e1a612da4565b6101408201520152600435600052600960205260ff60016040600020015460a81c161561110d5760043560005260096020526040600020610eeb600260405192610e6384612973565b80546001600160a01b038116855264ffffffffff8160a01c16602086015264ffffffffff8160c81c16604086015260ff8160f01c161515606086015260f81c1515608085015260ff60018201546001600160a01b03811660a0870152818160a01c16151560c0870152818160a81c16151560e087015260b01c16151561010085015201612dc3565b610120820152610efc6004356137d0565b6005811015610a4f57600214611101575b610120810151906001600160a01b0360a0820151169164ffffffffff6040830151166060830151151591610100840151151560c0850151151560e086015115159060043560005260036020526001600160a01b036040600020541697600a6020526040600020956001600160a01b0389511697608064ffffffffff60208c0151169a01511515916040519a8b67ffffffffffffffff6101808281810110920111176110eb576101609c610ffe9b6101808e016040528d5260208d015260408c015260608b015260808a015260a089015260c088015260e0870152610100860152610120850152610140840152612df7565b8282015261061f604051928392602084526001600160a01b0381511660208501526001600160a01b03602082015116604085015264ffffffffff604082015116606085015264ffffffffff60608201511660808501526080810151151560a085015260a0810151151560c08501526001600160a01b0360c08201511660e085015260e081015115156101008501526101008101511515610120850152610120810151151561014085015261014081015160406001600160801b03918281511685880152826020820151166101808801520151166101a085015201516101c0808401526101e0830190612899565b634e487b7160e01b600052604160045260246000fd5b60006060820152610f0d565b602460405162b8e7e760e51b81526004356004820152fd5b3461029d5760208060031936011261029d5760043567ffffffffffffffff811161029d57611157903690600401612868565b9061116061399c565b6000915b80831061116d57005b611178838284612d49565b359261118261399c565b83600052600980865260ff90600182816040600020015460a81c161561146f57866000528188526040600020838282015460a01c166000146111d65760248860405190634a5541ef60e01b82526004820152fd5b969495965460f81c611457576112028560005260096020526001600160a01b0360406000205416331490565b156114385761121085613758565b91856000528089526112286002604060002001612dc3565b926001600160801b03948585511686831610156114205787600052828b5260406000205460f01c16156114085780858b6112686112729483895116612a06565b9601511690612a06565b86600052818a528960406000207f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa50815496600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89161783558a6113578a8716998a156113ef575b60038096019b84169b8c6fffffffffffffffffffffffffffffffff198254161790556001600160a01b03809116998a9688528160406000205416998a985260406000200154169661132d8c878a614605565b60405193849384916040919493606084019584526001600160801b03809216602085015216910152565b0390a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce789604051888152a1803b61139a575b5050505060019150019190611164565b803b1561029d5760019560006084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af16113e0575b80808061138a565b6113e99061295f565b856113d8565b898601600160a01b60ff60a01b198254161790556112db565b602487604051906339c6dc7360e21b82526004820152fd5b602488604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101869052336024820152604490fd5b6024856040519063fe19f19f60e01b82526004820152fd5b6024876040519062b8e7e760e51b82526004820152fd5b3461029d5760208060031936011261029d57600435906114a461399c565b816000526009815260ff60016040600020015460a81c16156107d5576114c9826137d0565b6005811015610a4f57600481036114f25760248360405190634a5541ef60e01b82526004820152fd5b60038103611512576024836040519063fe19f19f60e01b82526004820152fd5b600214611686576115398260005260096020526001600160a01b0360406000205416331490565b1561166757816000526009815260ff60406000205460f01c161561164f578160005260098152604060002060ff60f01b19815416905560405191807f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f600080a2600382526001600160a01b036040600020541692833b6115e0575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78383604051908152a1005b833b1561029d57600081602481837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7987f450154640000000000000000000000000000000000000000000000000000000083528760048401525af1156115b4576116499061295f565b836115b4565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b3461029d57602036600319011261029d576004356001600160a01b039081811680910361029d578160005416338103611770575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a2600754600019810190811161175a5760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a1005b634e487b7160e01b600052601160045260246000fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b3461029d57602036600319011261029d576117b26127f3565b6000546001600160a01b0380821692338403611804576001600160a01b03199350169182911617600055337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf80600080a3005b6040516331b339a960e21b81526001600160a01b0385166004820152336024820152604490fd5b3461029d57602036600319011261029d576001600160a01b0361184c6127f3565b16801561186b5760005260046020526020604060002054604051908152f35b60246040517f89c62b6400000000000000000000000000000000000000000000000000000000815260006004820152fd5b3461029d57602036600319011261029d5760206118ba600435613735565b6001600160a01b0360405191168152f35b3461029d576020600319818136011261029d5760043567ffffffffffffffff9182821161029d576101208236039182011261029d5761190861399c565b60c4820135906022190181121561029d57810160048101359083821161029d57602401606082023603811361029d57611942913691612c7a565b9182519161194f83612c62565b9261195d6040519485612990565b808452601f1961196c82612c62565b018660005b828110611b3a5750505064ffffffffff90814216936001600160801b039687611999826139f8565b515116828a6119a7846139f8565b51015116858060406119b8866139f8565b5101511689011690604051926119cd84612927565b83528b83015260408201526119e1886139f8565b526119eb876139f8565b506001938760015b8a8c878310611ab95790838b8b611a0c81600401612d83565b92611a1960248301612d83565b92611a2660448401612d6f565b946064840135946001600160a01b039586811680910361029d57611ab198611a7198611aa698611a5860848a01612d97565b9481611a6660a48c01612d97565b976040519d8e61290a565b168c52168c8b0152166040890152606088015215156080870152151560a086015260c085015260e084015260e4369101612d1a565b610100820152613a19565b604051908152f35b889385806040611aed8b86611add8a8e9a611ad4828d613a05565b5151169a613a05565b5101511694600019890190613a05565b51015116816040611afe888c613a05565b5101511601169160405193611b1285612927565b84528301526040820152611b26828c613a05565b52611b31818b613a05565b500188906119f3565b611b42612da4565b828289010152018790611971565b3461029d57604036600319011261029d5767ffffffffffffffff60043581811161029d57611b82903690600401612868565b9160243590811161029d57611b9b903690600401612868565b9091611ba561399c565b818403611c145760005b848110611bb857005b80611c0e611bc96001938886612d49565b35611bd5838987612d49565b3560005260036020526001600160a01b0360406000205416611c00611bfb85898b612d49565b612d6f565b91611c0961399c565b6133a6565b01611baf565b60448483604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c16156103175761044460209161465f565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000611cc3826137d0565b6005811015610a4f57600203611ce1575b6020906040519015158152f35b506000526009602052602060ff60406000205460f01c16611cd4565b3461029d57600036600319011261029d5760206001600160a01b0360085416604051908152f35b3461029d5760208060031936011261029d5760043590611d4261399c565b816000526009815260ff60016040600020015460a81c16156107d557816000526009815260ff60016040600020015460a01c1615611ecf57611d838261412e565b156116675781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c16159081611ec5575b5080611ebd575b611ea5577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790836000526003835260406000205416918215928315611e6a575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a1611e5257005b60249060405190637e27328960e01b82526004820152fd5b611e8b85600052600560205260406000206001600160a01b03198154169055565b806000526004825260406000206000198154019055611e02565b60248360405190630da9b01360e01b82526004820152fd5b506000611dc2565b9050151584611dbb565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b3461029d57611f0e36612833565b60405191602083019383851067ffffffffffffffff8611176110eb5761029b9460405260008452612e87565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576000526009602052602060ff60016040600020015460a01c166040519015158152f35b3461029d5760208060031936011261029d5760043590611fac61399c565b8160005260099081815260ff60016040600020015460a81c16156122715782600052818152604060002060ff600182015460a01c166000146120005760248460405190634a5541ef60e01b82526004820152fd5b5460f81c612259576120288360005260096020526001600160a01b0360406000205416331490565b1561223a5761203683613758565b928060005282825261204e6002604060002001612dc3565b916001600160801b0394858451168682161015612222578260005284825260ff60406000205460f01c161561220a57816120df82888796956120d57ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce796837f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa509b5116612a06565b9701511690612a06565b9383600052868252604060002096875495600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff881617895560038a8216998a156121f0575b01998316998a6fffffffffffffffffffffffffffffffff198254161790556001600160a01b03809716978891600386528860406000205416988994875260016040600020015416946121798d8588614605565b604080518a81526001600160801b0392831660208201529290911690820152606090a4604051838152a1813b6121ab57005b813b1561029d5760006084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af16121e757005b61029b9061295f565b60018101600160a01b60ff60a01b19825416179055612126565b602483604051906339c6dc7360e21b82526004820152fd5b602483604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b815260048101849052336024820152604490fd5b6024836040519063fe19f19f60e01b82526004820152fd5b6024836040519062b8e7e760e51b82526004820152fd5b3461029d5760031960203682011261029d5760043567ffffffffffffffff9182821161029d5761014090823603011261029d576122c361399c565b604051916122d08361290a565b6122dc8260040161281f565b83526122ea6024830161281f565b60208401526122fb604483016129ce565b604084015260648201356001600160a01b038116810361029d576060840152612326608483016128fd565b608084015261233760a483016128fd565b60a084015261234860c48301612c50565b60c084015260e482013590811161029d578101913660238401121561029d57611aa6611ab1926123846020953690602460048201359101612c7a565b60e0840152610104369101612d1a565b3461029d5761029b6123a536612833565b91612a1f565b3461029d57600036600319011261029d576020600754604051908152f35b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c161561031757612403906137d0565b6005811015610a4f578060209115908115612424575b506040519015158152f35b600191501482612419565b3461029d57602036600319011261029d5760043580600052600960205260ff60016040600020015460a81c1615610317576020906000908060005260098352604060002060ff815460f01c16806124c2575b612499575b50506001600160801b0360405191168152f35b6124bb92506001600160801b0360026124b59201541691613758565b90612a06565b8280612486565b5060ff600182015460a01c1615612481565b3461029d57604036600319011261029d576124ed6127f3565b6024356124f981613735565b331515806125c2575b80612594575b6125645781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460005260056020526040600020906001600160a01b0319825416179055600080f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116600052600660205260406000203360005260205260ff6040600020541615612508565b50336001600160a01b0382161415612502565b3461029d57602036600319011261029d5760206118ba6004356129e2565b3461029d57600036600319011261029d576040516000600190600154918260011c91600184169182156126af575b6020948585108414610c67578587948686529182600014610c475750506001146126525750610bd692500383612990565b84915060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6906000915b858310612697575050610bd6935082010185610bc9565b80548389018501528794508693909201918101612680565b92607f1692612621565b3461029d57600036600319011261029d57602060405167016345785d8a00008152f35b3461029d57602036600319011261029d57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361029d57817f80ac58cd0000000000000000000000000000000000000000000000000000000060209314908115612781575b8115612757575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612750565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612749565b60005b8381106127be5750506000910152565b81810151838201526020016127ae565b906020916127e7815180928185528580860191016127ab565b601f01601f1916010190565b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b35906001600160a01b038216820361029d57565b606090600319011261029d576001600160a01b0390600435828116810361029d5791602435908116810361029d579060443590565b9181601f8401121561029d5782359167ffffffffffffffff831161029d576020808501948460051b01011161029d57565b90815180825260208080930193019160005b8281106128b9575050505090565b835180516001600160801b031686528083015167ffffffffffffffff168684015260409081015164ffffffffff1690860152606090940193928101926001016128ab565b3590811515820361029d57565b610120810190811067ffffffffffffffff8211176110eb57604052565b6060810190811067ffffffffffffffff8211176110eb57604052565b6040810190811067ffffffffffffffff8211176110eb57604052565b67ffffffffffffffff81116110eb57604052565b610140810190811067ffffffffffffffff8211176110eb57604052565b90601f8019910116810190811067ffffffffffffffff8211176110eb57604052565b67ffffffffffffffff81116110eb57601f01601f191660200190565b35906001600160801b038216820361029d57565b6129eb81613735565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161175a57565b906001600160a01b03809116801561078d57600091848352602091600383526040928284862054166009825260ff6001868820015460b01c16159081612c46575b5080612c3e575b612c27578685526003815282848620541694873315159384612b77575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7945087612b3f575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a183168203612b115750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b612b6082600052600560205260406000206001600160a01b03198154169055565b878352600484528683208054600019019055612aad565b91929380915090612be6575b15612b915790878392612a84565b848887612bae576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015612c0b575b80612b835750878252600583523384868420541614612b83565b5085825260068352848220338352835260ff8583205416612bf1565b602487855190630da9b01360e01b82526004820152fd5b506001612a67565b9050151538612a60565b359064ffffffffff8216820361029d57565b67ffffffffffffffff81116110eb5760051b60200190565b929192612c8682612c62565b604094612c966040519283612990565b8195848352602080930191606080960285019481861161029d57925b858410612cc25750505050505050565b868483031261029d57825190612cd782612927565b612ce0856129ce565b8252858501359067ffffffffffffffff8216820361029d57828792838b950152612d0b868801612c50565b86820152815201930192612cb2565b919082604091031261029d57604051612d3281612943565b6020808294612d408161281f565b84520135910152565b9190811015612d595760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160801b038116810361029d5790565b356001600160a01b038116810361029d5790565b35801515810361029d5790565b60405190612db182612927565b60006040838281528260208201520152565b90604051612dd081612927565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b908154612e0381612c62565b92604093612e146040519182612990565b82815280946020809201926000526020600020906000935b858510612e3b57505050505050565b60018481928451612e4b81612927565b64ffffffffff87546001600160801b038116835267ffffffffffffffff8160801c168584015260c01c1686820152815201930194019391612e2c565b9190612e94828285612a1f565b803b612ea1575b50505050565b612efd6001600160a01b03809216946040519384937f150b7a02000000000000000000000000000000000000000000000000000000009687865233600487015216602485015260448401526080606484015260848301906127ce565b03906020816000938185885af190829082612f93575b5050612f4a5782612f22614197565b8051919082612f435760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff000000000000000000000000000000000000000000000000000000001603612f7b575038808080612e9b565b60249060405190633250574960e11b82526004820152fd5b909192506020813d602011612ff3575b81612fb060209383612990565b81010312612fef5751907fffffffff0000000000000000000000000000000000000000000000000000000082168203612fec5750903880612f13565b80fd5b5080fd5b3d9150612fa3565b9291909261300761399c565b60009381855260099260209380855260409260ff6001858a20015460a81c16156133905784885281865260ff6001858a20015460a01c16613379576001600160a01b0391828216928315613369576001600160801b039384861691821561335257888c5260038a5280888d205416938483141580613342575b61331f5761308d8a6141c7565b87811685116132ee57508a8a928e928484528083528b8085209a8c848d54169c6002015460801c906130be916141ef565b878752838652828720600201908282549160801b6fffffffffffffffffffffffffffffffff191691161781556130f390612dc3565b90808683015116918184818351169201511661310e91612a06565b161115946001927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d966132c1575b87825285522001541694613151818988614605565b8a51908152a480331415806132b7575b613252575b823314159081613247575b8161323c575b506131ab575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce793945051908152a1565b813b15613238578351636fd110e960e01b8152600481018690523360248201526001600160a01b0390911660448201526001600160801b03909216606483015294957ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79582908183816084810103925af1613229575b85948161317d565b6132329061295f565b38613221565b8780fd5b905082141538613177565b833b15159150613171565b803b156132b3578451636fd110e960e01b8152600481018790523360248201526001600160a01b03831660448201526001600160801b0385166064820152898160848183865af16132a4575b50613166565b6132ad9061295f565b3861329e565b8880fd5b50803b1515613161565b878252808652828220848101600160a01b60ff60a01b1982541617905560ff60f01b19815416905561313c565b895163287ecaef60e21b8152600481018c90526001600160801b038a81166024830152919091166044820152606490fd5b60648a848b519163b34359d360e01b835260048301523360248301526044820152fd5b5061334c8a61412e565b15613080565b60248989519063d2aabcd960e01b82526004820152fd5b6004865163630d074f60e11b8152fd5b602485855190634a5541ef60e01b82526004820152fd5b60248585519062b8e7e760e51b82526004820152fd5b9291909260009381855260099060209382855260409260ff6001858a20015460a81c1615613390578785815281875260ff6001868320015460a01c1661371e576001600160a01b039081851692831561370e576001600160801b03938486169182156136f75789845260038b528489852054169485831415806136e7575b6136c45761344b8b838e6134378361465f565b9289525260028c8820015460801c90612a06565b87811685116136935750908b8b928387528282528b808820998b838c54169b6002015460801c9061347b916141ef565b868a52858552828a20600201908282549160801b6fffffffffffffffffffffffffffffffff191691161781556134b090612dc3565b818086830151169381835116920151166134c991612a06565b161115927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d93613665575b848852825260018c88200154169461350d818c88614605565b8b51908152a4813314158061365b575b6135f5575b508133141590816135ea575b816135df575b50613567575050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce793945051908152a1565b908188923b156135db578451636fd110e960e01b8152600481018790523360248201526001600160a01b0390941660448501526001600160801b03909116606484015282908183816084810103925af16135c3575b808061317d565b6135cd869161295f565b6135d757846135bc565b8480fd5b8280fd5b905081141538613534565b823b1515915061352e565b813b15612fec578551636fd110e960e01b8152600481018890523360248201526001600160a01b03861660448201526001600160801b0385166064820152818160848183875af1613647575b50613522565b61365391929a5061295f565b973880613641565b50813b151561351d565b8488528083528c882060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556134f4565b8a5163287ecaef60e21b8152600481018d90526001600160801b038a81166024830152919091166044820152606490fd5b60648b848c519163b34359d360e01b835260048301523360248301526044820152fd5b506136f18b61412e565b15613424565b60248a8a519063d2aabcd960e01b82526004820152fd5b6004875163630d074f60e11b8152fd5b602486865190634a5541ef60e01b82526004820152fd5b8060005260036020526001600160a01b0360406000205416908115611e52575090565b64ffffffffff804216826000526009602052604060002091825482828260a01c1610156137c65760c81c1611156137b45750600a6020526001604060002054116000146137ab576137a8906142db565b90565b6137a89061420a565b6001600160801b039150600201541690565b5050505050600090565b806000526009602052604060002060ff600182015460a01c166000146137f7575050600490565b805460f81c613850575460a01c64ffffffffff16421061384a5761381a81613758565b9060005260096020526001600160801b03806002604060002001541691161060001461384557600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613992575b5080613987575b613970579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84838720541694859283613938575b169283613922575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b83875260048852808720600181540190556138fe565b61395986600052600560205260406000206001600160a01b03198154169055565b8388526004895284882080546000190190556138f6565b602486885190630da9b01360e01b82526004820152fd5b508181161515613895565b905015153861388e565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036139ce57565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b805115612d595760200190565b8051821015612d595760209160051b010190565b90613a3b6001600160801b0360408401511660206101008501510151906144bb565b6001600160801b0381511660e084015164ffffffffff60c08601511682156141045780156140da57815180156140b0577f0000000000000000000000000000000000000000000000000000000000000000811161407f575064ffffffffff6040613aa4846139f8565b510151168110156140285750600090819082815184905b808210613f97575050505064ffffffffff421664ffffffffff8216811015613f575750506001600160801b0316808203613f20575050600754928360005260096020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036060830151166001840154750100000000000000000000000000000000000000000060808501511515918654937fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff0000000000000000000000000000000000000000000060a0890151151560b01b16921617171760018601556001600160a01b0384511678ffffffffff000000000000000000000000000000000000000060c086015160a01b169060e0860151937fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff000000000000000000000000000000000000000000000000006040613c578951996000198b0190613a05565b51015160c81b169560f01b16911617171717845560005b818110613e4e575050600185016007556001600160a01b03602083015116801561078d57613ca4866001600160a01b0392613857565b16613e1d57613ccf6001600160a01b036060840151166001600160801b038351169030903390614594565b6001600160801b0360208201511680613ded575b507f33eb09bbf19ea3fb22c760d5164234f8bf62ca07dcf5a437ad389e96b0bd644360206001600160a01b03845116926001600160a01b038286015116946001600160a01b0360608201511696613de2613dc360808401511515928c60a086015115156001600160a01b0361010060e089015194549864ffffffffff6040519a613d6c8c612943565b818160a01c168c5260c81c168c8b015201515116956001600160801b036040519a8b9a610140958c5233828d01528281511660408d015201511660608a0152608089015260a08801528060c0880152860190612899565b9260e08501906020908164ffffffffff91828151168552015116910152565b6101208301520390a4565b613e17906001600160a01b036060850151166001600160a01b036101008601515116903390614594565b38613ce3565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b86600052600a602052604060002090613e6b8160e0870151613a05565b518254680100000000000000008110156110eb5760018101808555811015612d5957600193600052602060002001906001600160801b03815116908254917fffffff00000000000000000000000000000000000000000000000000000000007cffffffffff000000000000000000000000000000000000000000000000604077ffffffffffffffff00000000000000000000000000000000602086015160801b1694015160c01b169316171717905501613c6e565b60449250604051917fd90b7e3900000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b9193509193613fbb906001600160801b03613fb28588613a05565b515116906141ef565b9364ffffffffff806040613fcf8685613a05565b51015116941680851115613feb57506001849301909291613abb565b8385606492604051927f9588ac09000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff6040614039846139f8565b5101516040517ff539a17c00000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f4757689b0000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f3952c64e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd572dbcb000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b038060408420541692833314938415614173575b5050821561416157505090565b90915061416e33926129e2565b161490565b60ff9294509060409181526006602052818120338252602052205416913880614154565b3d156141c2573d906141a8826129b2565b916141b66040519384612990565b82523d6000602084013e565b606090565b6137a8906141d48161465f565b90600052600960205260026040600020015460801c90612a06565b9190916001600160801b038080941691160191821161175a57565b64ffffffffff61423f600091838352600960205280806040852054818160a01c1693849160c81c1603169181421603166146da565b91808252600a602052604082208054156142c75790829167ffffffffffffffff9352614299602083205482845260096020526142946001600160801b03968760026040882001541696879360801c16906147ca565b614838565b9283136142af5750506142ab90614922565b1690565b60029350604092508152600960205220015460801c90565b602483634e487b7160e01b81526032600452fd5b64ffffffffff804216600083815260096020526040918282209083519161430183612973565b80549661012061438760026001600160a01b0394858c168852602088019b8b8160a01c168d528b8160c81c168b8a015260ff8160f01c16151560608a015260f81c1515608089015260ff600196600183015490811660a08b0152818160a01c16151560c08b0152818160a81c16151560e08b015260b01c16151561010089015201612dc3565b94019384528452600a60205261439e858520612df7565b91849680876143ac866139f8565b5101511692828288955b161061448557509161443a6142949284888161443f98976001600160801b039e8f6143e1898c613a05565b5151169d8e9a67ffffffffffffffff60206143fc8c84613a05565b5101511699848361440d8385613a05565b5101511696508015614479576144299293506000190190613a05565b5101511680925b03169203166146da565b6147ca565b9283136144585750506144528391614922565b16011690565b5160200151929392831692841683101591506144749050575090565b905090565b50505051168092614430565b8093986001600160801b03908161449c8c89613a05565b51511601169801928282808a6144b2888a613a05565b510151166143b6565b919091604051906144cb82612943565b600091828152826020820152936001600160801b03928383169182156145755767016345785d8a000080821161453e57506145078591846154ea565b166020870192818452111561452a5750908261452592511690612a06565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b509394505050506040519061458982612943565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff8411176110eb576146039260405261495e565b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b039290921660248301526044808301939093529181526146039161465a606483612990565b61495e565b8060005260096020526146786002604060002001612dc3565b816000526009602052604060002060ff600182015460a01c166000146146ab57506001600160801b039150602001511690565b5460f81c6146bd57506137a890613758565b6137a891506001600160801b036040818351169201511690612a06565b600160ff1b8082149081156147c0575b5061479657600081121561478d57614713816000035b60008412156147865783600003906149fa565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831161474f57600019911813156147495790565b60000390565b60449250604051917fd49c26b300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b83906149fa565b61471381614700565b60046040517f9fe2b450000000000000000000000000000000000000000000000000000000008152fd5b90508214386146ea565b806147e557506147e057670de0b6b3a764000090565b600090565b90670de0b6b3a764000080831461483257508061480a575050670de0b6b3a764000090565b670de0b6b3a7640000811461482e57614829906142946137a893614af4565b614c36565b5090565b91505090565b600160ff1b808214908115614918575b506148ee5760008112156148e557614871816000035b60008412156148de5783600003906154ea565b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83116148a757600019911813156147495790565b60449250604051917f120b5b4300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b83906154ea565b6148718161485e565b60046040517fa6070c25000000000000000000000000000000000000000000000000000000008152fd5b9050821438614848565b6000811261492d5790565b602490604051907f2463f3d50000000000000000000000000000000000000000000000000000000082526004820152fd5b6001600160a01b031690614989600080836020829551910182875af1614982614197565b9084615599565b9081519182151592836149d2575b5050506149a15750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312612fef576020015190811591821503612fec5750388080614997565b670de0b6b3a7640000916000198383099280830292838086109503948086039514614ab65782851015614a7a57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b505080925015614ac4570490565b634e487b7160e01b600052601260045260246000fd5b8015614ac4576ec097ce7bc90715b34b9f10000000000590565b80600080831315614c0557670de0b6b3a764000092838112614be257506001925b808305906001600160801b03821160071b91821c9167ffffffffffffffff831160061b92831c63ffffffff811160051b90811c61ffff811160041b90811c60ff811160031b90811c91600f831160021b92831c93600197600160038711811b96871c11961717171717171781810294811d90828214614bd657506706f05b59d3b20000905b848213614baa5750505050500290565b808391020590671bc16d674ec80000821215614bc9575b831d90614b9a565b8091950194831d90614bc1565b93505093925050020290565b6000199392508015614ac4576ec097ce7bc90715b34b9f10000000000591614b15565b602483604051907f059b101b0000000000000000000000000000000000000000000000000000000082526004820152fd5b6000811215614c655768033dd1780914b9711419811261384a57614c5c90600003614c36565b6137a890614ada565b680a688906bd8affffff81136154b957670de0b6b3a764000080604092831b05907780000000000000000000000000000000000000000000000067ff00000000000000831661539c575b66ff0000000000008316615294575b65ff00000000008316615194575b64ff00000000831661509c575b63ff0000008316614fac575b62ff00008316614ec4575b61ff008316614de4575b60ff8316614d0d575b02911c60bf031c90565b60808316614dd2575b838316614dc0575b60208316614dae575b60108316614d9c575b60088316614d8a575b60048316614d78575b60028316614d66575b6001831615614d03576801000000000000000102831c614d03565b6801000000000000000102831c614d4b565b6801000000000000000302831c614d42565b6801000000000000000602831c614d39565b6801000000000000000b02831c614d30565b6801000000000000001602831c614d27565b6801000000000000002c02831c614d1e565b6801000000000000005902831c614d16565b6180008316614eb2575b6140008316614ea0575b6120008316614e8e575b6110008316614e7c575b6108008316614e6a575b6104008316614e58575b6102008316614e46575b610100831615614cfa57680100000000000000b102831c614cfa565b6801000000000000016302831c614e2a565b680100000000000002c602831c614e20565b6801000000000000058c02831c614e16565b68010000000000000b1702831c614e0c565b6801000000000000162e02831c614e02565b68010000000000002c5d02831c614df8565b680100000000000058b902831c614dee565b628000008316614f9a575b624000008316614f88575b622000008316614f76575b621000008316614f64575b620800008316614f52575b620400008316614f40575b620200008316614f2e575b62010000831615614cf0576801000000000000b17202831c614cf0565b680100000000000162e402831c614f11565b6801000000000002c5c802831c614f06565b68010000000000058b9102831c614efb565b680100000000000b172102831c614ef0565b68010000000000162e4302831c614ee5565b680100000000002c5c8602831c614eda565b6801000000000058b90c02831c614ecf565b6380000000831661508a575b63400000008316615078575b63200000008316615066575b63100000008316615054575b63080000008316615042575b63040000008316615030575b6302000000831661501e575b6301000000831615614ce55768010000000000b1721802831c614ce5565b6801000000000162e43002831c615000565b68010000000002c5c86002831c614ff4565b680100000000058b90c002831c614fe8565b6801000000000b17217f02831c614fdc565b680100000000162e42ff02831c614fd0565b6801000000002c5c85fe02831c614fc4565b68010000000058b90bfc02831c614fb8565b6480000000008316615182575b6440000000008316615170575b642000000000831661515e575b641000000000831661514c575b640800000000831661513a575b6404000000008316615128575b6402000000008316615116575b640100000000831615614cd957680100000000b17217f802831c614cd9565b68010000000162e42ff102831c6150f7565b680100000002c5c85fe302831c6150ea565b6801000000058b90bfce02831c6150dd565b68010000000b17217fbb02831c6150d0565b6801000000162e42fff002831c6150c3565b68010000002c5c8601cc02831c6150b6565b680100000058b90c0b4902831c6150a9565b658000000000008316615282575b654000000000008316615270575b65200000000000831661525e575b65100000000000831661524c575b65080000000000831661523a575b650400000000008316615228575b650200000000008316615216575b65010000000000831615614ccc576801000000b17218355102831c614ccc565b680100000162e430e5a202831c6151f6565b6801000002c5c863b73f02831c6151e8565b68010000058b90cf1e6e02831c6151da565b680100000b1721bcfc9a02831c6151cc565b68010000162e43f4f83102831c6151be565b680100002c5c89d5ec6d02831c6151b0565b6801000058b91b5bc9ae02831c6151a2565b6680000000000000831661538a575b66400000000000008316615378575b66200000000000008316615366575b66100000000000008316615354575b66080000000000008316615342575b66040000000000008316615330575b6602000000000000831661531e575b6601000000000000831615614cbe5768010000b17255775c0402831c614cbe565b6801000162e525ee054702831c6152fd565b68010002c5cc37da949202831c6152ee565b680100058ba01fb9f96d02831c6152df565b6801000b175effdc76ba02831c6152d0565b680100162f3904051fa102831c6152c1565b6801002c605e2e8cec5002831c6152b2565b68010058c86da1c09ea202831c6152a3565b678000000000000000831661549a575b6740000000000000008316615488575b6720000000000000008316615476575b6710000000000000008316615464575b6708000000000000008316615452575b6704000000000000008316615440575b670200000000000000831661542e575b670100000000000000831615614caf57680100b1afa5abcbed6102831c614caf565b68010163da9fb33356d802831c61540c565b680102c9a3e778060ee702831c6153fc565b6801059b0d31585743ae02831c6153ec565b68010b5586cf9890f62a02831c6153dc565b6801172b83c7d517adce02831c6153cc565b6801306fe0a31b7152df02831c6153bc565b5077b504f333f9de6484800000000000000000000000000000006153ac565b602490604051907f0360d0280000000000000000000000000000000000000000000000000000000082526004820152fd5b9091906000198382098382029182808310920391808303921461558857670de0b6b3a7640000908183101561555157947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b906155d857508051156155ae57805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580615623575b6155e9575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b156155e156fea164736f6c6343000817000a"; bytes public constant BYTECODE_LOCKUP_LINEAR = - hex"60a034620003b757601f19906001600160401b0390601f620049a33881900382810186168401919085831185841017620002d0578085926040948552833981010312620003b75781516001600160a01b038082169490929091859003620003b757602080940151928316809303620003b7576200007b620003bc565b93601c85527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000081860152620000af620003bc565b96601188527029a0a116ab1916a627a1a5aaa816a624a760791b82890152306080528551848111620002d0576001968754908882811c92168015620003ac575b85831014620002af57818684931162000356575b508490868311600114620002f257600092620002e6575b5050600019600383901b1c191690871b1786555b8751938411620002d0576002548681811c91168015620002c5575b83821014620002af5783811162000263575b5081928411600114620001f65750508192939495600092620001ea575b5050600019600383901b1c191690831b176002555b60018060a01b03198381600054161760005560085416176008556040519160007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36007556145c69081620003dd8239608051816139480152f35b01519050388062000178565b839291921696600260005282600020926000905b8982106200024b575050838697989695961062000231575b505050811b016002556200018d565b015160001960f88460031b161c1916905538808062000222565b8088859682949686015181550195019301906200020a565b6002600052826000208480870160051c820192858810620002a5575b0160051c019087905b828110620002985750506200015b565b6000815501879062000288565b925081926200027f565b634e487b7160e01b600052602260045260246000fd5b90607f169062000149565b634e487b7160e01b600052604160045260246000fd5b0151905038806200011a565b90848a94169184600052866000209260005b888282106200033f575050841162000325575b505050811b0186556200012e565b015160001960f88460031b161c1916905538808062000317565b8385015186558d9790950194938401930162000304565b90915088600052846000208680850160051c820192878610620003a2575b918b91869594930160051c01915b8281106200039257505062000103565b600081558594508b910162000382565b9250819262000374565b91607f1691620000ef565b600080fd5b60408051919082016001600160401b03811183821017620002d05760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612f5f57508063027b674414612f3c57806306fdde0314612e77578063081812fc14612e58578063095ea7b314612d5f5780631400ecec14612cbf5780631c1cdd4c14612c5a5780631e99d56914612c3c57806323b872dd14612c2457806340e58ee5146129a6578063425d30dd1461295557806342842e0e1461290557806342966c681461272a57806344267570146127035780634857501f1461268d5780634869e12d146126525780634cc55e11146121c257806353b15727146120a35780636352211e146120735780636d0cee751461207357806370a082311461200357806375829def14611f70578063780a82c814611f235780637cad6cd114611e295780637de6b1db14611c025780638659c270146118b1578063894e9a0d146115915780638f69b993146114f55780639067b677146114a557806395d89b4114611396578063a22cb465146112d9578063a80fc07114611287578063ab167ccc14611138578063ad35efd4146110d6578063b256456914611085578063b88d4fde14610ff8578063b8a3be6614610fc3578063b971302a14610f74578063bc2be1be14610f24578063c156a11d14610a77578063c87b56dd1461095b578063cc364f4814610890578063d4dbd20b1461083e578063d511609f146107f2578063d975dfed146107a6578063e985e9c514610751578063ea5ead1914610729578063eac8f5b8146106d7578063f590c17614610675578063f851a4401461064f5763fdd46d601461025257600080fd5b3461064c57606036600319011261064c576004359061026f61308e565b916102786131eb565b9261028161393e565b818352600960209181835260ff600160408720015460a81c16156106355783855281835260ff600160408720015460a01c1661061d576001600160a01b03958682169283156105f3576001600160801b03938483169081156105db57878952600387528960408a2054169283821415806105cb575b6105a757610303896140b1565b87811684116105755750888a5280885260408a20968360028d8a541699015460801c0181811161056157988b9c8b9c9a937f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d936103958e96859f8f6040816103909360029352878a5220019182906001600160801b036001600160801b031983549260801b169116179055565b6134e2565b906103b181868401511692826040818351169201511690613225565b161115610532575b848c528252600160408c20015416946103d3818a886140dc565b604051908152a48033141580610528575b6104ba575b8333141590816104af575b816104a4575b5061042e575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b156104a057604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af1610488575b8080610400565b6104919061310a565b61049c578238610481565b8280fd5b8380fd5b9050831415386103fa565b843b151591506103f4565b803b1561052457604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1610510575b50506103e9565b6105199061310a565b610524578438610509565b8480fd5b50803b15156103e4565b848c5280835260408c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b9565b60248c634e487b7160e01b81526011600452fd5b60405163287ecaef60e21b8152600481018b90526001600160801b038781166024830152919091166044820152606490fd5b606489836040519163b34359d360e01b835260048301523360248301526044820152fd5b506105d58961399a565b156102f6565b6024886040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b60248460405190634a5541ef60e01b82526004820152fd5b6024846040519062b8e7e760e51b82526004820152fd5b80fd5b503461064c578060031936011261064c576001600160a01b036020915416604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057816040916020935260098352205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760016040836001600160a01b0393602095526009855220015416604051908152f35b503461064c57604036600319011261064c576004359061074761308e565b91610278816140b1565b503461064c57604036600319011261064c5761076b613078565b604061077561308e565b926001600160a01b0380931681526006602052209116600052602052602060ff604060002054166040519015158152f35b503461064c57602036600319011261064c5760ff6001604060043593848152600960205220015460a81c16156106c0576107e16020916140b1565b6001600160801b0360405191168152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057604082600292602094526009845220015460801c604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760036040836001600160801b0393602095526009855220015416604051908152f35b503461064c576020908160031936011261064c57600435916108b06134c3565b508282526009815260ff600160408420015460a81c16156109445760609282526009815264ffffffffff9182604082205460a01c1692600a835260408181842054169260098552205460c81c16916040519361090b8561313b565b8452830152604082015261094260405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b6024836040519062b8e7e760e51b82526004820152fd5b503461064c57602080600319360112610a675760043561097a81613697565b50826001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa928315610a6b5780936109ea575b50506109e6604051928284938452830190613053565b0390f35b909192503d8082843e6109fd81846131ad565b8201918381840312610a675780519067ffffffffffffffff821161049c570182601f82011215610a6757805191610a33836131cf565b93610a4160405195866131ad565b83855285848401011161064c575090610a5f91848085019101613030565b9038806109d0565b5080fd5b604051903d90823e3d90fd5b503461064c57604036600319011261064c57600435610a9461308e565b610a9c61393e565b81835260099060209082825260ff600160408720015460a81c161561063557838552600382526001600160a01b03918260408720541693843303610f0557610ae3866140b1565b906001600160801b039081831680158015610b83575b50505050505081811615610b6b5783610b11916137f9565b90811680610b315760248460405190637e27328960e01b82526004820152fd5b8203610b3b578380f35b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b60248560405190633250574960e11b82526004820152fd5b610b8b61393e565b898b5282865260ff600160408d20015460a81c1615610eee57898b5282865260ff600160408d20015460a01c16610ed65788156105f357610ebe57888a52600385528660408b205416918289141580610eae575b610e8a57610bec8a6140b1565b8481168311610e585750898b5280865260408b20938260028a87541696015460801c01818111610e445790610c538d9796959493928d8952838a52610390600260408b20019182906001600160801b036001600160801b031983549260801b169116179055565b90610c6f818a8401511692826040818351169201511690613225565b161115610e15575b8a86528652888a7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d888b600160408b2001541694610cb68186886140dc565b604051908152a48033141580610e0b575b610da1575b813314159081610d96575b81610d8b575b50610d1a575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790604051868152a1388080808080610af9565b803b1561049c57604051636fd110e960e01b8152600481018990523360248201526001600160a01b03881660448201526001600160801b0392909216606483015282908290608490829084905af1610d73575b80610ce3565b610d7c9061310a565b610d87578538610d6d565b8580fd5b905081141538610cdd565b823b15159150610cd7565b803b156104a057604051636fd110e960e01b8152600481018a90523360248201526001600160a01b03891660448201526001600160801b03841660648201528490818160848183875af1610df7575b5050610ccc565b610e009061310a565b6104a0578338610df0565b50803b1515610cc7565b8a86528087526040862060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055610c77565b60248d634e487b7160e01b81526011600452fd5b60405163287ecaef60e21b8152600481018c90526001600160801b038781166024830152919091166044820152606490fd5b60648a8a6040519163b34359d360e01b835260048301523360248301526044820152fd5b50610eb88a61399a565b15610bdf565b6024896040519063d2aabcd960e01b82526004820152fd5b60248a60405190634a5541ef60e01b82526004820152fd5b60248a6040519062b8e7e760e51b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff926020945260098452205460a01c16604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c0576040826001600160a01b03926020945260098452205416604051908152f35b503461064c57602036600319011261064c5760ff6001604060209360043581526009855220015460a81c166040519015158152f35b503461064c57608036600319011261064c57611012613078565b61101a61308e565b906064359067ffffffffffffffff82116104a057366023830112156104a05781600401359284611049856131cf565b9361105760405195866131ad565b8585523660248783010111610a6757856110829660246020930183880137850101526044359161352a565b80f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057600160408360ff93602095526009855220015460b01c166040519015158152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05761110f90613772565b60405190600581101561112457602092508152f35b602483634e487b7160e01b81526021600452fd5b503461064c5761014036600319011261064c5761115361393e565b61115b6134c3565b9064ffffffffff80421680845281611171613516565b1615611280578180611181613516565b8301165b16602085015260e43590828216820361127b5701166040830152600435916001600160a01b039182841680940361127b576024359083821680920361127b57604435906001600160801b03821680920361127b576064359085821680920361064c57506084359182151580930361127b5760a4359384151580950361127b57604051976112118961311e565b8852602088015260408701526060860152608085015260a084015260c083015260406101031936011261127b576040519161124b83613191565b61010435918216820361127b57826112739260209452610124358482015260e0820152613a03565b604051908152f35b600080fd5b8183611185565b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760026040836001600160801b0393602095526009855220015416604051908152f35b503461064c57604036600319011261064c576112f3613078565b6024359081151580920361127b576001600160a01b03169081156113655733835260066020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c578060031936011261064c5760405190806002549160018360011c926001851694851561149b575b60209586861081146114875785885287949392918790821561146557505060011461140b575b50506113f7925003836131ad565b6109e6604051928284938452830190613053565b90859250600282527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b85831061144d5750506113f7935082010138806113e9565b80548389018501528794508693909201918101611435565b92509350506113f794915060ff191682840152151560051b82010138806113e9565b602483634e487b7160e01b81526022600452fd5b93607f16936113c3565b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff926020945260098452205460c81c16604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05761152e90613772565b906005821015908161156f5760028314918215611583575b821561155a575b6020836040519015158152f35b90915061156f5750600460209114388061154d565b80634e487b7160e01b602492526021600452fd5b506003831491506000611546565b503461064c57602036600319011261064c57806101606040516115b381613157565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e082015282610100820152826101208201526115f66134c3565b61014082015201526004358152600960205260ff600160408320015460a81c1615611899576004358152600960205260408120906116c460026040519361163c85613174565b80546001600160a01b038116865264ffffffffff8160a01c16602087015264ffffffffff8160c81c16604087015260ff8160f01c161515606087015260f81c1515608086015260ff60018201546001600160a01b03811660a0880152818160a01c16151560c0880152818160a81c16151560e088015260b01c161515610100860152016134e2565b6101208301526116d5600435613772565b6005811015611885576101606101c093600264ffffffffff931461187a575b610120810151936001600160a01b0360a083015116946004358252600a60205284604083205416918560408501511690606085015115159761010086015115159260c08701511515916001600160a01b03604060e08a015115159560036020522054166001600160a01b038951169b8960808d8f9c60200151169101511515926040519b6117818d613157565b8c5260208c015260408b015260608a0152608089015260a088015260c087015260e0860152610100850152610120840152610140830152828201526040519384526001600160a01b0360208201511660208501528260408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a08501528260c08201511660c085015260e0810151151560e08501526101008101511515610100850152610120810151151561012085015261014081015160406001600160801b03918281511661014088015282602082015116858801520151166101808501520151166101a0820152f35b8360608201526116f4565b602482634e487b7160e01b81526021600452fd5b602460405162b8e7e760e51b81526004356004820152fd5b503461064c57602080600319360112610a675760043567ffffffffffffffff811161049c576118e49036906004016130d9565b91906118ee61393e565b83925b8084106118fc578480f35b61190784828461349d565b359361191161393e565b848652600980855260ff90600190828260408b20015460a81c1615611beb57878952808752604089208281015460a01c8416156119605760248960405190634a5541ef60e01b82526004820152fd5b9790919293949596975460f81c611bd3576119918160005260096020526001600160a01b0360406000205416331490565b15611bb35761199f816136ba565b818a528289526119b4600260408c20016134e2565b906001600160801b0395868351168783161015611b9b57838c52848b5260408c205460f01c1615611b835791818a611a0585898f9a9998966119fb8c998387935116613225565b9501511690613225565b8386528482527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5060408720916040835499600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c161785558b83169a8b15611b6a575b60038096019c88169c8d6001600160801b03198254161790556001600160a01b0392838092169b8c9789522054169889965260408d2001541694611aaf8b85886140dc565b604080518881526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78a604051838152a1813b611b13575b5050505050506001019291906118f1565b813b15610d8757856084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1611b56575b80808080611b02565b611b5f9061310a565b610524578438611b4d565b818601600160a01b60ff60a01b19825416179055611a6a565b602483604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b6024886040519062b8e7e760e51b82526004820152fd5b503461064c57602080600319360112610a675760043590611c2161393e565b8183526009815260ff600160408520015460a81c1615611e1257611c4482613772565b6005811015611dfe5760048103611c6d5760248360405190634a5541ef60e01b82526004820152fd5b60038103611c8d576024836040519063fe19f19f60e01b82526004820152fd5b600214611de657611cb48260005260096020526001600160a01b0360406000205416331490565b15611dc7578183526009815260ff604084205460f01c1615611daf57818352600981526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600383526001600160a01b03604083205416803b611d57575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561049c57816024818580947f450154640000000000000000000000000000000000000000000000000000000083528960048401525af1611d9b575b80611d28565b611da49061310a565b61049c578238611d95565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b503461064c57602036600319011261064c576004356001600160a01b039081811680910361049c5781835416338103611efa575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26007546000198101908111611ee65760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff9260209452600a8452205416604051908152f35b503461064c57602036600319011261064c57611f8a613078565b9080546001600160a01b0380821693338503611fdc576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b503461064c57602036600319011261064c576001600160a01b03612025613078565b168015612042578160409160209352600483522054604051908152f35b602482604051907f89c62b640000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c57602036600319011261064c576020612092600435613697565b6001600160a01b0360405191168152f35b503461064c5761016036600319011261064c576120be61393e565b604051906120cb8261311e565b6120d3613078565b82526120dd61308e565b60208301526120ea6131eb565b60408301526001600160a01b03906064358281168103610a67576060840152608435801515810361127b57608084015260a435801515810361127b5760a084015260603660c319011261064c57506040516121448161313b565b64ffffffffff60c435818116810361127b57825260e435818116810361127b57602083015261010435908116810361127b57604082015260c083015260406101231936011261127b576040519161219a83613191565b61012435918216820361127b57826112739260209452610144358482015260e0820152613a03565b503461064c57604036600319011261064c5767ffffffffffffffff60043581811161049c576121f59036906004016130d9565b90916024359081116104a05761220f9036906004016130d9565b61221761393e565b80830361261b57845b83811061222b578580f35b61223681858761349d565b359061224381868861349d565b35875260036020526001600160a01b0360408820541661226482858761349d565b35906001600160801b038216820361127b5761227e61393e565b838952600960205260ff600160408b20015460a81c161561063557838952600960205260ff600160408b20015460a01c1661061d5780156105f3576001600160801b038216156126035783895260036020526001600160a01b0360408a2054169182821415806125f3575b6125cf576122f6856140b1565b6001600160801b0381166001600160801b0383161161259f5750848a52600960205260408a20926001600160a01b038454169360026001600160801b03841691015460801c016001600160801b03811161056157906123878c959493928887526009602052610390600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b036123ab8160208401511692826040818351169201511690613225565b16111561256e575b86855260096020526001600160a01b036001604087200154166123e06001600160801b03841685836140dc565b83887f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206040516001600160801b0388168152a48033141580612564575b6124fa575b8333141590816124ef575b816124e4575b50612472575b505050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a101612220565b823b156104a057604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af16124cc575b808061243b565b6124d59061310a565b6124e05786386124c5565b8680fd5b905083141538612435565b843b1515915061242f565b803b1561052457604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1612550575b5050612424565b6125599061310a565b610524578438612549565b50803b151561241f565b86855260096020526040852060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556123b3565b60405163287ecaef60e21b8152600481018790526001600160801b03928316602482015291166044820152606490fd5b606485836040519163b34359d360e01b835260048301523360248301526044820152fd5b506125fd8561399a565b156122e9565b6024846040519063d2aabcd960e01b82526004820152fd5b82604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b503461064c57602036600319011261064c5760ff6001604060043593848152600960205220015460a81c16156106c0576107e1602091614138565b503461064c57602036600319011261064c5760043590818152600960205260ff600160408320015460a81c1615611e1257806126c883613772565b926005841015611885576002602094036126e9575b50506040519015158152f35b815260098352604090205460f01c60ff16905038806126dd565b503461064c578060031936011261064c5760206001600160a01b0360085416604051908152f35b503461064c57602080600319360112610a67576004359061274961393e565b8183526009815260ff600160408520015460a81c1615611e12578183526009815260ff600160408520015460a01c16156128d4576127868261399a565b15611dc75781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c161590816128ca575b50806128c2575b6128aa577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79083600052600383526040600020541691821592831561286f575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a1612857575080f35b60249060405190637e27328960e01b82526004820152fd5b61289085600052600560205260406000206001600160a01b03198154169055565b806000526004825260406000206000198154019055612805565b60248360405190630da9b01360e01b82526004820152fd5b5060006127c5565b90501515386127be565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c57612914366130a4565b60405191602083019383851067ffffffffffffffff86111761293f576110829460405285845261352a565b634e487b7160e01b600052604160045260246000fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057600160408360ff93602095526009855220015460a01c166040519015158152f35b503461064c576020908160031936011261064c57600435906129c661393e565b81815260099283815260ff600160408420015460a81c16156109445782825283815260408220600181015460a01c60ff1615612a145760248460405190634a5541ef60e01b82526004820152fd5b9284935460f81c611bd357612a3f8160005260096020526001600160a01b0360406000205416331490565b15611bb357612a4d816136ba565b93818452808352612a63600260408620016134e2565b916001600160801b0393848451168588161015611de65781865282815260ff604087205460f01c1615611daf57612ab1878683612aa78a9b838a9c9b9c5116613225565b9701511690613225565b908286528381526040862091825494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161784556003898316948515612c0a575b01988716988981546001600160801b0319161790556001600160a01b038096168097600385528760408b205416978893865260408b20600101541693612b3d8c84876140dc565b604080518981526001600160801b03938416602082015292909116908201528060608101037f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5091a4604051908382527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791a1823b612bb9578480f35b823b15610524576084928591604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1612bfb575b81818080808480f35b612c049061310a565b81612bf2565b60018101600160a01b60ff60a01b19825416179055612af6565b503461064c57611082612c36366130a4565b91613254565b503461064c578060031936011261064c576020600754604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057612c9390613772565b90600582101561156f5760208215838115612cb4575b506040519015158152f35b600191501482612ca9565b503461064c57602036600319011261064c5760043590818152600960205260ff600160408320015460a81c1615611e1257602091604082828152600985522060ff815460f01c1680612d4d575b612d24575b50506001600160801b0360405191168152f35b612d4692506001600160801b036002612d4092015416916136ba565b90613225565b3880612d11565b5060ff600182015460a01c1615612d0c565b503461064c57604036600319011261064c57612d79613078565b602435612d8581613697565b33151580612e45575b80612e1b575b612deb5781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a48252600560205260408220906001600160a01b031982541617905580f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116845260066020526040842033855260205260ff60408520541615612d94565b50336001600160a01b0382161415612d8e565b503461064c57602036600319011261064c576020612092600435613201565b503461064c578060031936011261064c576040519080600191600154928360011c9260018516948515612f32575b602095868610811461148757858852879493929187908215611465575050600114612ed85750506113f7925003836131ad565b90859250600182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b858310612f1a5750506113f7935082010138806113e9565b80548389018501528794508693909201918101612f02565b93607f1693612ea5565b503461064c578060031936011261064c57602060405167016345785d8a00008152f35b905034610a67576020366003190112610a67576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361049c57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115613006575b8115612fdc575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612fd5565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612fce565b60005b8381106130435750506000910152565b8181015183820152602001613033565b9060209161306c81518092818552858086019101613030565b601f01601f1916010190565b600435906001600160a01b038216820361127b57565b602435906001600160a01b038216820361127b57565b606090600319011261127b576001600160a01b0390600435828116810361127b5791602435908116810361127b579060443590565b9181601f8401121561127b5782359167ffffffffffffffff831161127b576020808501948460051b01011161127b57565b67ffffffffffffffff811161293f57604052565b610100810190811067ffffffffffffffff82111761293f57604052565b6060810190811067ffffffffffffffff82111761293f57604052565b610180810190811067ffffffffffffffff82111761293f57604052565b610140810190811067ffffffffffffffff82111761293f57604052565b6040810190811067ffffffffffffffff82111761293f57604052565b90601f8019910116810190811067ffffffffffffffff82111761293f57604052565b67ffffffffffffffff811161293f57601f01601f191660200190565b604435906001600160801b038216820361127b57565b61320a81613697565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161323e57565b634e487b7160e01b600052601160045260246000fd5b906001600160a01b03809116801561348557600091848352602091600383526040928284862054166009825260ff6001868820015460b01c1615908161347b575b5080613473575b61345c5786855260038152828486205416948733151593846133ac575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7945087613374575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a1831682036133465750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b61339582600052600560205260406000206001600160a01b03198154169055565b8783526004845286832080546000190190556132e2565b9192938091509061341b575b156133c657908783926132b9565b8488876133e3576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015613440575b806133b857508782526005835233848684205416146133b8565b5085825260068352848220338352835260ff8583205416613426565b602487855190630da9b01360e01b82526004820152fd5b50600161329c565b9050151538613295565b6024604051633250574960e11b815260006004820152fd5b91908110156134ad5760051b0190565b634e487b7160e01b600052603260045260246000fd5b604051906134d08261313b565b60006040838281528260208201520152565b906040516134ef8161313b565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b60c43564ffffffffff8116810361127b5790565b9190613537828285613254565b803b613544575b50505050565b6135a06001600160a01b03809216946040519384937f150b7a0200000000000000000000000000000000000000000000000000000000968786523360048701521660248501526044840152608060648401526084830190613053565b03906020816000938185885af190829082613636575b50506135ed57826135c5614081565b80519190826135e65760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000160361361e57503880808061353e565b60249060405190633250574960e11b82526004820152fd5b909192506020813d60201161368f575b81613653602093836131ad565b81010312610a675751907fffffffff000000000000000000000000000000000000000000000000000000008216820361064c57509038806135b6565b3d9150613646565b8060005260036020526001600160a01b0360406000205416908115612857575090565b600090808252600a60205264ffffffffff9182604082205416421061376c5760096020526040812092835490808260c81c1691824210156137565761370b9394955060a01c168091039042036142fb565b9082815260096020526001600160801b03926137318460026040852001541680946143db565b92831161373e5750501690565b60029350604092508152600960205220015460801c90565b505050505060026001600160801b039101541690565b91505090565b806000526009602052604060002060ff600182015460a01c16600014613799575050600490565b805460f81c6137f2575460a01c64ffffffffff1642106137ec576137bc816136ba565b9060005260096020526001600160801b0380600260406000200154169116106000146137e757600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613934575b5080613929575b613912579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef848387205416948592836138da575b1692836138c4575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b83875260048852808720600181540190556138a0565b6138fb86600052600560205260406000206001600160a01b03198154169055565b838852600489528488208054600019019055613898565b602486885190630da9b01360e01b82526004820152fd5b508181161515613837565b9050151538613830565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361397057565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b0380604084205416928333149384156139df575b505082156139cd57505090565b9091506139da3392613201565b161490565b60ff92945090604091815260066020528181203382526020522054169138806139c0565b90613a246001600160801b03604084015116602060e08501510151906141b3565b916001600160801b0383511660c082015190156140575764ffffffffff8151161561402d5764ffffffffff81511690604081019164ffffffffff8351169081811015613fed575050602081019064ffffffffff8251169081151580613fdb575b613f9a57505064ffffffffff90511664ffffffffff8251169081811015613f5a57505064ffffffffff8042169151169081811015613f1a575050600754926001600160801b0381511660405190613ada8261313b565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff604084015116906080860151151560a087015115159264ffffffffff6001600160a01b0389511696511660405196613b3c88613174565b87526020870152604086015260608501526000608085015260a0840152600060c0840152600160e08401526101008301526101208201528460005260096020526040600020906001600160a01b0381511678ffffffffff0000000000000000000000000000000000000000602083015160a01b16907dffffffffff00000000000000000000000000000000000000000000000000604084015160c81b167eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b16917fff000000000000000000000000000000000000000000000000000000000000006080860151151560f81b1693171717178255600182016001600160a01b0360a08301511681549074ff000000000000000000000000000000000000000060c0850151151560a01b1675ff00000000000000000000000000000000000000000060e0860151151560a81b16917fffffffffffffffffff000000000000000000000000000000000000000000000076ff00000000000000000000000000000000000000000000610100880151151560b01b1694161717171790556001600160801b03604060036101206002860194015194613d3484875116956001600160801b03199687825416178155856020890151166001600160801b036001600160801b031983549260801b169116179055565b01930151169082541617905564ffffffffff602060c084015101511680613efc575b50600184016007556001600160a01b03602083015116801561348557613d84856001600160a01b03926137f9565b16613ecb57613daf6001600160a01b036060840151166001600160801b03835116903090339061428c565b6001600160801b0360208201511680613e9c575b506001600160a01b038251167f44cb432df42caa86b7ec73644ab8aec922bc44c71c98fc330addc75b88adbc7c610140866001600160a01b0360208701511694613e936001600160a01b03606089015116976080810151151560a08201511515906001600160801b0360206001600160a01b0360e060c087015196015151169660405198895233828a01528281511660408a01520151166060870152608086015260a085015260c08401906040908164ffffffffff91828151168552826020820151166020860152015116910152565b610120820152a4565b613ec5906001600160a01b036060850151166001600160a01b0360e0860151511690339061428c565b38613dc3565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b600a60205260406000209064ffffffffff1982541617905538613d56565b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b516040517fb39831ea00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b508164ffffffffff8251161015613a84565b6040517f5057f08400000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517f62201b50000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b3d156140ac573d90614092826131cf565b916140a060405193846131ad565b82523d6000602084013e565b606090565b6140d9906140be81614138565b90600052600960205260026040600020015460801c90613225565b90565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b03929092166024830152604480830193909352918152614136916141316064836131ad565b61448a565b565b80600052600960205261415160026040600020016134e2565b816000526009602052604060002060ff600182015460a01c1660001461418457506001600160801b039150602001511690565b5460f81c61419657506140d9906136ba565b6140d991506001600160801b036040818351169201511690613225565b919091604051906141c382613191565b600091828152826020820152936001600160801b039283831691821561426d5767016345785d8a000080821161423657506141ff8591846143db565b16602087019281845211156142225750908261421d92511690613225565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b509394505050506040519061428182613191565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff84111761293f576141369260405261448a565b670de0b6b3a76400009160001983830992808302928380861095039480860395146143b7578285101561437b57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156143c5570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461447957670de0b6b3a7640000908183101561444257947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b6001600160a01b0316906144b5600080836020829551910182875af16144ae614081565b9084614526565b9081519182151592836144fe575b5050506144cd5750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312610a6757602001519081159182150361064c57503880806144c3565b90614565575080511561453b57805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b815115806145b0575b614576575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561456e56fea164736f6c6343000817000a"; + hex"60a034620003b757601f19906001600160401b0390601f620049a33881900382810186168401919085831185841017620002d0578085926040948552833981010312620003b75781516001600160a01b038082169490929091859003620003b757602080940151928316809303620003b7576200007b620003bc565b93601c85527f5361626c696572205632204c6f636b7570204c696e656172204e46540000000081860152620000af620003bc565b96601188527029a0a116ab1916a627a1a5aaa816a624a760791b82890152306080528551848111620002d0576001968754908882811c92168015620003ac575b85831014620002af57818684931162000356575b508490868311600114620002f257600092620002e6575b5050600019600383901b1c191690871b1786555b8751938411620002d0576002548681811c91168015620002c5575b83821014620002af5783811162000263575b5081928411600114620001f65750508192939495600092620001ea575b5050600019600383901b1c191690831b176002555b60018060a01b03198381600054161760005560085416176008556040519160007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a36007556145c69081620003dd8239608051816139480152f35b01519050388062000178565b839291921696600260005282600020926000905b8982106200024b575050838697989695961062000231575b505050811b016002556200018d565b015160001960f88460031b161c1916905538808062000222565b8088859682949686015181550195019301906200020a565b6002600052826000208480870160051c820192858810620002a5575b0160051c019087905b828110620002985750506200015b565b6000815501879062000288565b925081926200027f565b634e487b7160e01b600052602260045260246000fd5b90607f169062000149565b634e487b7160e01b600052604160045260246000fd5b0151905038806200011a565b90848a94169184600052866000209260005b888282106200033f575050841162000325575b505050811b0186556200012e565b015160001960f88460031b161c1916905538808062000317565b8385015186558d9790950194938401930162000304565b90915088600052846000208680850160051c820192878610620003a2575b918b91869594930160051c01915b8281106200039257505062000103565b600081558594508b910162000382565b9250819262000374565b91607f1691620000ef565b600080fd5b60408051919082016001600160401b03811183821017620002d05760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612f5f57508063027b674414612f3c57806306fdde0314612e77578063081812fc14612e58578063095ea7b314612d5f5780631400ecec14612cbf5780631c1cdd4c14612c5a5780631e99d56914612c3c57806323b872dd14612c2457806340e58ee5146129a6578063425d30dd1461295557806342842e0e1461290557806342966c681461272a57806344267570146127035780634857501f1461268d5780634869e12d146126525780634cc55e11146121c257806353b15727146120a35780636352211e146120735780636d0cee751461207357806370a082311461200357806375829def14611f70578063780a82c814611f235780637cad6cd114611e295780637de6b1db14611c025780638659c270146118b1578063894e9a0d146115915780638f69b993146114f55780639067b677146114a557806395d89b4114611396578063a22cb465146112d9578063a80fc07114611287578063ab167ccc14611138578063ad35efd4146110d6578063b256456914611085578063b88d4fde14610ff8578063b8a3be6614610fc3578063b971302a14610f74578063bc2be1be14610f24578063c156a11d14610a77578063c87b56dd1461095b578063cc364f4814610890578063d4dbd20b1461083e578063d511609f146107f2578063d975dfed146107a6578063e985e9c514610751578063ea5ead1914610729578063eac8f5b8146106d7578063f590c17614610675578063f851a4401461064f5763fdd46d601461025257600080fd5b3461064c57606036600319011261064c576004359061026f61308e565b916102786131eb565b9261028161393e565b818352600960209181835260ff600160408720015460a81c16156106355783855281835260ff600160408720015460a01c1661061d576001600160a01b03958682169283156105f3576001600160801b03938483169081156105db57878952600387528960408a2054169283821415806105cb575b6105a757610303896140b1565b87811684116105755750888a5280885260408a20968360028d8a541699015460801c0181811161056157988b9c8b9c9a937f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d936103958e96859f8f6040816103909360029352878a5220019182906001600160801b036001600160801b031983549260801b169116179055565b6134e2565b906103b181868401511692826040818351169201511690613225565b161115610532575b848c528252600160408c20015416946103d3818a886140dc565b604051908152a48033141580610528575b6104ba575b8333141590816104af575b816104a4575b5061042e575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b156104a057604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af1610488575b8080610400565b6104919061310a565b61049c578238610481565b8280fd5b8380fd5b9050831415386103fa565b843b151591506103f4565b803b1561052457604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1610510575b50506103e9565b6105199061310a565b610524578438610509565b8480fd5b50803b15156103e4565b848c5280835260408c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103b9565b60248c634e487b7160e01b81526011600452fd5b60405163287ecaef60e21b8152600481018b90526001600160801b038781166024830152919091166044820152606490fd5b606489836040519163b34359d360e01b835260048301523360248301526044820152fd5b506105d58961399a565b156102f6565b6024886040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b60248460405190634a5541ef60e01b82526004820152fd5b6024846040519062b8e7e760e51b82526004820152fd5b80fd5b503461064c578060031936011261064c576001600160a01b036020915416604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057816040916020935260098352205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760016040836001600160a01b0393602095526009855220015416604051908152f35b503461064c57604036600319011261064c576004359061074761308e565b91610278816140b1565b503461064c57604036600319011261064c5761076b613078565b604061077561308e565b926001600160a01b0380931681526006602052209116600052602052602060ff604060002054166040519015158152f35b503461064c57602036600319011261064c5760ff6001604060043593848152600960205220015460a81c16156106c0576107e16020916140b1565b6001600160801b0360405191168152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057604082600292602094526009845220015460801c604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760036040836001600160801b0393602095526009855220015416604051908152f35b503461064c576020908160031936011261064c57600435916108b06134c3565b508282526009815260ff600160408420015460a81c16156109445760609282526009815264ffffffffff9182604082205460a01c1692600a835260408181842054169260098552205460c81c16916040519361090b8561313b565b8452830152604082015261094260405180926040908164ffffffffff91828151168552826020820151166020860152015116910152565bf35b6024836040519062b8e7e760e51b82526004820152fd5b503461064c57602080600319360112610a675760043561097a81613697565b50826001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa928315610a6b5780936109ea575b50506109e6604051928284938452830190613053565b0390f35b909192503d8082843e6109fd81846131ad565b8201918381840312610a675780519067ffffffffffffffff821161049c570182601f82011215610a6757805191610a33836131cf565b93610a4160405195866131ad565b83855285848401011161064c575090610a5f91848085019101613030565b9038806109d0565b5080fd5b604051903d90823e3d90fd5b503461064c57604036600319011261064c57600435610a9461308e565b610a9c61393e565b81835260099060209082825260ff600160408720015460a81c161561063557838552600382526001600160a01b03918260408720541693843303610f0557610ae3866140b1565b906001600160801b039081831680158015610b83575b50505050505081811615610b6b5783610b11916137f9565b90811680610b315760248460405190637e27328960e01b82526004820152fd5b8203610b3b578380f35b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b60248560405190633250574960e11b82526004820152fd5b610b8b61393e565b898b5282865260ff600160408d20015460a81c1615610eee57898b5282865260ff600160408d20015460a01c16610ed65788156105f357610ebe57888a52600385528660408b205416918289141580610eae575b610e8a57610bec8a6140b1565b8481168311610e585750898b5280865260408b20938260028a87541696015460801c01818111610e445790610c538d9796959493928d8952838a52610390600260408b20019182906001600160801b036001600160801b031983549260801b169116179055565b90610c6f818a8401511692826040818351169201511690613225565b161115610e15575b8a86528652888a7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d888b600160408b2001541694610cb68186886140dc565b604051908152a48033141580610e0b575b610da1575b813314159081610d96575b81610d8b575b50610d1a575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790604051868152a1388080808080610af9565b803b1561049c57604051636fd110e960e01b8152600481018990523360248201526001600160a01b03881660448201526001600160801b0392909216606483015282908290608490829084905af1610d73575b80610ce3565b610d7c9061310a565b610d87578538610d6d565b8580fd5b905081141538610cdd565b823b15159150610cd7565b803b156104a057604051636fd110e960e01b8152600481018a90523360248201526001600160a01b03891660448201526001600160801b03841660648201528490818160848183875af1610df7575b5050610ccc565b610e009061310a565b6104a0578338610df0565b50803b1515610cc7565b8a86528087526040862060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055610c77565b60248d634e487b7160e01b81526011600452fd5b60405163287ecaef60e21b8152600481018c90526001600160801b038781166024830152919091166044820152606490fd5b60648a8a6040519163b34359d360e01b835260048301523360248301526044820152fd5b50610eb88a61399a565b15610bdf565b6024896040519063d2aabcd960e01b82526004820152fd5b60248a60405190634a5541ef60e01b82526004820152fd5b60248a6040519062b8e7e760e51b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff926020945260098452205460a01c16604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c0576040826001600160a01b03926020945260098452205416604051908152f35b503461064c57602036600319011261064c5760ff6001604060209360043581526009855220015460a81c166040519015158152f35b503461064c57608036600319011261064c57611012613078565b61101a61308e565b906064359067ffffffffffffffff82116104a057366023830112156104a05781600401359284611049856131cf565b9361105760405195866131ad565b8585523660248783010111610a6757856110829660246020930183880137850101526044359161352a565b80f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057600160408360ff93602095526009855220015460b01c166040519015158152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05761110f90613772565b60405190600581101561112457602092508152f35b602483634e487b7160e01b81526021600452fd5b503461064c5761014036600319011261064c5761115361393e565b61115b6134c3565b9064ffffffffff80421680845281611171613516565b1615611280578180611181613516565b8301165b16602085015260e43590828216820361127b5701166040830152600435916001600160a01b039182841680940361127b576024359083821680920361127b57604435906001600160801b03821680920361127b576064359085821680920361064c57506084359182151580930361127b5760a4359384151580950361127b57604051976112118961311e565b8852602088015260408701526060860152608085015260a084015260c083015260406101031936011261127b576040519161124b83613191565b61010435918216820361127b57826112739260209452610124358482015260e0820152613a03565b604051908152f35b600080fd5b8183611185565b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760026040836001600160801b0393602095526009855220015416604051908152f35b503461064c57604036600319011261064c576112f3613078565b6024359081151580920361127b576001600160a01b03169081156113655733835260066020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c578060031936011261064c5760405190806002549160018360011c926001851694851561149b575b60209586861081146114875785885287949392918790821561146557505060011461140b575b50506113f7925003836131ad565b6109e6604051928284938452830190613053565b90859250600282527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b85831061144d5750506113f7935082010138806113e9565b80548389018501528794508693909201918101611435565b92509350506113f794915060ff191682840152151560051b82010138806113e9565b602483634e487b7160e01b81526022600452fd5b93607f16936113c3565b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff926020945260098452205460c81c16604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05761152e90613772565b906005821015908161156f5760028314918215611583575b821561155a575b6020836040519015158152f35b90915061156f5750600460209114388061154d565b80634e487b7160e01b602492526021600452fd5b506003831491506000611546565b503461064c57602036600319011261064c57806101606040516115b381613157565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e082015282610100820152826101208201526115f66134c3565b61014082015201526004358152600960205260ff600160408320015460a81c1615611899576004358152600960205260408120906116c460026040519361163c85613174565b80546001600160a01b038116865264ffffffffff8160a01c16602087015264ffffffffff8160c81c16604087015260ff8160f01c161515606087015260f81c1515608086015260ff60018201546001600160a01b03811660a0880152818160a01c16151560c0880152818160a81c16151560e088015260b01c161515610100860152016134e2565b6101208301526116d5600435613772565b6005811015611885576101606101c093600264ffffffffff931461187a575b610120810151936001600160a01b0360a083015116946004358252600a60205284604083205416918560408501511690606085015115159761010086015115159260c08701511515916001600160a01b03604060e08a015115159560036020522054166001600160a01b038951169b8960808d8f9c60200151169101511515926040519b6117818d613157565b8c5260208c015260408b015260608a0152608089015260a088015260c087015260e0860152610100850152610120840152610140830152828201526040519384526001600160a01b0360208201511660208501528260408201511660408501526060810151151560608501526080810151151560808501526001600160a01b0360a08201511660a08501528260c08201511660c085015260e0810151151560e08501526101008101511515610100850152610120810151151561012085015261014081015160406001600160801b03918281511661014088015282602082015116858801520151166101808501520151166101a0820152f35b8360608201526116f4565b602482634e487b7160e01b81526021600452fd5b602460405162b8e7e760e51b81526004356004820152fd5b503461064c57602080600319360112610a675760043567ffffffffffffffff811161049c576118e49036906004016130d9565b91906118ee61393e565b83925b8084106118fc578480f35b61190784828461349d565b359361191161393e565b848652600980855260ff90600190828260408b20015460a81c1615611beb57878952808752604089208281015460a01c8416156119605760248960405190634a5541ef60e01b82526004820152fd5b9790919293949596975460f81c611bd3576119918160005260096020526001600160a01b0360406000205416331490565b15611bb35761199f816136ba565b818a528289526119b4600260408c20016134e2565b906001600160801b0395868351168783161015611b9b57838c52848b5260408c205460f01c1615611b835791818a611a0585898f9a9998966119fb8c998387935116613225565b9501511690613225565b8386528482527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5060408720916040835499600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c161785558b83169a8b15611b6a575b60038096019c88169c8d6001600160801b03198254161790556001600160a01b0392838092169b8c9789522054169889965260408d2001541694611aaf8b85886140dc565b604080518881526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78a604051838152a1813b611b13575b5050505050506001019291906118f1565b813b15610d8757856084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1611b56575b80808080611b02565b611b5f9061310a565b610524578438611b4d565b818601600160a01b60ff60a01b19825416179055611a6a565b602483604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b6024886040519062b8e7e760e51b82526004820152fd5b503461064c57602080600319360112610a675760043590611c2161393e565b8183526009815260ff600160408520015460a81c1615611e1257611c4482613772565b6005811015611dfe5760048103611c6d5760248360405190634a5541ef60e01b82526004820152fd5b60038103611c8d576024836040519063fe19f19f60e01b82526004820152fd5b600214611de657611cb48260005260096020526001600160a01b0360406000205416331490565b15611dc7578183526009815260ff604084205460f01c1615611daf57818352600981526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600383526001600160a01b03604083205416803b611d57575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b1561049c57816024818580947f450154640000000000000000000000000000000000000000000000000000000083528960048401525af1611d9b575b80611d28565b611da49061310a565b61049c578238611d95565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b503461064c57602036600319011261064c576004356001600160a01b039081811680910361049c5781835416338103611efa575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a26007546000198101908111611ee65760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c05760408264ffffffffff9260209452600a8452205416604051908152f35b503461064c57602036600319011261064c57611f8a613078565b9080546001600160a01b0380821693338503611fdc576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b503461064c57602036600319011261064c576001600160a01b03612025613078565b168015612042578160409160209352600483522054604051908152f35b602482604051907f89c62b640000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c57602036600319011261064c576020612092600435613697565b6001600160a01b0360405191168152f35b503461064c5761016036600319011261064c576120be61393e565b604051906120cb8261311e565b6120d3613078565b82526120dd61308e565b60208301526120ea6131eb565b60408301526001600160a01b03906064358281168103610a67576060840152608435801515810361127b57608084015260a435801515810361127b5760a084015260603660c319011261064c57506040516121448161313b565b64ffffffffff60c435818116810361127b57825260e435818116810361127b57602083015261010435908116810361127b57604082015260c083015260406101231936011261127b576040519161219a83613191565b61012435918216820361127b57826112739260209452610144358482015260e0820152613a03565b503461064c57604036600319011261064c5767ffffffffffffffff60043581811161049c576121f59036906004016130d9565b90916024359081116104a05761220f9036906004016130d9565b61221761393e565b80830361261b57845b83811061222b578580f35b61223681858761349d565b359061224381868861349d565b35875260036020526001600160a01b0360408820541661226482858761349d565b35906001600160801b038216820361127b5761227e61393e565b838952600960205260ff600160408b20015460a81c161561063557838952600960205260ff600160408b20015460a01c1661061d5780156105f3576001600160801b038216156126035783895260036020526001600160a01b0360408a2054169182821415806125f3575b6125cf576122f6856140b1565b6001600160801b0381166001600160801b0383161161259f5750848a52600960205260408a20926001600160a01b038454169360026001600160801b03841691015460801c016001600160801b03811161056157906123878c959493928887526009602052610390600260408920019182906001600160801b036001600160801b031983549260801b169116179055565b6001600160801b036123ab8160208401511692826040818351169201511690613225565b16111561256e575b86855260096020526001600160a01b036001604087200154166123e06001600160801b03841685836140dc565b83887f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206040516001600160801b0388168152a48033141580612564575b6124fa575b8333141590816124ef575b816124e4575b50612472575b505050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a101612220565b823b156104a057604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af16124cc575b808061243b565b6124d59061310a565b6124e05786386124c5565b8680fd5b905083141538612435565b843b1515915061242f565b803b1561052457604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1612550575b5050612424565b6125599061310a565b610524578438612549565b50803b151561241f565b86855260096020526040852060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556123b3565b60405163287ecaef60e21b8152600481018790526001600160801b03928316602482015291166044820152606490fd5b606485836040519163b34359d360e01b835260048301523360248301526044820152fd5b506125fd8561399a565b156122e9565b6024846040519063d2aabcd960e01b82526004820152fd5b82604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b503461064c57602036600319011261064c5760ff6001604060043593848152600960205220015460a81c16156106c0576107e1602091614138565b503461064c57602036600319011261064c5760043590818152600960205260ff600160408320015460a81c1615611e1257806126c883613772565b926005841015611885576002602094036126e9575b50506040519015158152f35b815260098352604090205460f01c60ff16905038806126dd565b503461064c578060031936011261064c5760206001600160a01b0360085416604051908152f35b503461064c57602080600319360112610a67576004359061274961393e565b8183526009815260ff600160408520015460a81c1615611e12578183526009815260ff600160408520015460a01c16156128d4576127868261399a565b15611dc75781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c161590816128ca575b50806128c2575b6128aa577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79083600052600383526040600020541691821592831561286f575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a1612857575080f35b60249060405190637e27328960e01b82526004820152fd5b61289085600052600560205260406000206001600160a01b03198154169055565b806000526004825260406000206000198154019055612805565b60248360405190630da9b01360e01b82526004820152fd5b5060006127c5565b90501515386127be565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064c57612914366130a4565b60405191602083019383851067ffffffffffffffff86111761293f576110829460405285845261352a565b634e487b7160e01b600052604160045260246000fd5b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057600160408360ff93602095526009855220015460a01c166040519015158152f35b503461064c576020908160031936011261064c57600435906129c661393e565b81815260099283815260ff600160408420015460a81c16156109445782825283815260408220600181015460a01c60ff1615612a145760248460405190634a5541ef60e01b82526004820152fd5b9284935460f81c611bd357612a3f8160005260096020526001600160a01b0360406000205416331490565b15611bb357612a4d816136ba565b93818452808352612a63600260408620016134e2565b916001600160801b0393848451168588161015611de65781865282815260ff604087205460f01c1615611daf57612ab1878683612aa78a9b838a9c9b9c5116613225565b9701511690613225565b908286528381526040862091825494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161784556003898316948515612c0a575b01988716988981546001600160801b0319161790556001600160a01b038096168097600385528760408b205416978893865260408b20600101541693612b3d8c84876140dc565b604080518981526001600160801b03938416602082015292909116908201528060608101037f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5091a4604051908382527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791a1823b612bb9578480f35b823b15610524576084928591604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1612bfb575b81818080808480f35b612c049061310a565b81612bf2565b60018101600160a01b60ff60a01b19825416179055612af6565b503461064c57611082612c36366130a4565b91613254565b503461064c578060031936011261064c576020600754604051908152f35b503461064c57602036600319011261064c57600435808252600960205260ff600160408420015460a81c16156106c057612c9390613772565b90600582101561156f5760208215838115612cb4575b506040519015158152f35b600191501482612ca9565b503461064c57602036600319011261064c5760043590818152600960205260ff600160408320015460a81c1615611e1257602091604082828152600985522060ff815460f01c1680612d4d575b612d24575b50506001600160801b0360405191168152f35b612d4692506001600160801b036002612d4092015416916136ba565b90613225565b3880612d11565b5060ff600182015460a01c1615612d0c565b503461064c57604036600319011261064c57612d79613078565b602435612d8581613697565b33151580612e45575b80612e1b575b612deb5781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a48252600560205260408220906001600160a01b031982541617905580f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116845260066020526040842033855260205260ff60408520541615612d94565b50336001600160a01b0382161415612d8e565b503461064c57602036600319011261064c576020612092600435613201565b503461064c578060031936011261064c576040519080600191600154928360011c9260018516948515612f32575b602095868610811461148757858852879493929187908215611465575050600114612ed85750506113f7925003836131ad565b90859250600182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b858310612f1a5750506113f7935082010138806113e9565b80548389018501528794508693909201918101612f02565b93607f1693612ea5565b503461064c578060031936011261064c57602060405167016345785d8a00008152f35b905034610a67576020366003190112610a67576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361049c57602092507f80ac58cd000000000000000000000000000000000000000000000000000000008114908115613006575b8115612fdc575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612fd5565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150612fce565b60005b8381106130435750506000910152565b8181015183820152602001613033565b9060209161306c81518092818552858086019101613030565b601f01601f1916010190565b600435906001600160a01b038216820361127b57565b602435906001600160a01b038216820361127b57565b606090600319011261127b576001600160a01b0390600435828116810361127b5791602435908116810361127b579060443590565b9181601f8401121561127b5782359167ffffffffffffffff831161127b576020808501948460051b01011161127b57565b67ffffffffffffffff811161293f57604052565b610100810190811067ffffffffffffffff82111761293f57604052565b6060810190811067ffffffffffffffff82111761293f57604052565b610180810190811067ffffffffffffffff82111761293f57604052565b610140810190811067ffffffffffffffff82111761293f57604052565b6040810190811067ffffffffffffffff82111761293f57604052565b90601f8019910116810190811067ffffffffffffffff82111761293f57604052565b67ffffffffffffffff811161293f57601f01601f191660200190565b604435906001600160801b038216820361127b57565b61320a81613697565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161323e57565b634e487b7160e01b600052601160045260246000fd5b906001600160a01b03809116801561348557600091848352602091600383526040928284862054166009825260ff6001868820015460b01c1615908161347b575b5080613473575b61345c5786855260038152828486205416948733151593846133ac575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7945087613374575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a1831682036133465750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b61339582600052600560205260406000206001600160a01b03198154169055565b8783526004845286832080546000190190556132e2565b9192938091509061341b575b156133c657908783926132b9565b8488876133e3576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015613440575b806133b857508782526005835233848684205416146133b8565b5085825260068352848220338352835260ff8583205416613426565b602487855190630da9b01360e01b82526004820152fd5b50600161329c565b9050151538613295565b6024604051633250574960e11b815260006004820152fd5b91908110156134ad5760051b0190565b634e487b7160e01b600052603260045260246000fd5b604051906134d08261313b565b60006040838281528260208201520152565b906040516134ef8161313b565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b60c43564ffffffffff8116810361127b5790565b9190613537828285613254565b803b613544575b50505050565b6135a06001600160a01b03809216946040519384937f150b7a0200000000000000000000000000000000000000000000000000000000968786523360048701521660248501526044840152608060648401526084830190613053565b03906020816000938185885af190829082613636575b50506135ed57826135c5614081565b80519190826135e65760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000160361361e57503880808061353e565b60249060405190633250574960e11b82526004820152fd5b909192506020813d60201161368f575b81613653602093836131ad565b81010312610a675751907fffffffff000000000000000000000000000000000000000000000000000000008216820361064c57509038806135b6565b3d9150613646565b8060005260036020526001600160a01b0360406000205416908115612857575090565b600090808252600a60205264ffffffffff9182604082205416421061376c5760096020526040812092835490808260c81c1691824210156137565761370b9394955060a01c168091039042036142fb565b9082815260096020526001600160801b03926137318460026040852001541680946143db565b92831161373e5750501690565b60029350604092508152600960205220015460801c90565b505050505060026001600160801b039101541690565b91505090565b806000526009602052604060002060ff600182015460a01c16600014613799575050600490565b805460f81c6137f2575460a01c64ffffffffff1642106137ec576137bc816136ba565b9060005260096020526001600160801b0380600260406000200154169116106000146137e757600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613934575b5080613929575b613912579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef848387205416948592836138da575b1692836138c4575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b83875260048852808720600181540190556138a0565b6138fb86600052600560205260406000206001600160a01b03198154169055565b838852600489528488208054600019019055613898565b602486885190630da9b01360e01b82526004820152fd5b508181161515613837565b9050151538613830565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361397057565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b0380604084205416928333149384156139df575b505082156139cd57505090565b9091506139da3392613201565b161490565b60ff92945090604091815260066020528181203382526020522054169138806139c0565b90613a246001600160801b03604084015116602060e08501510151906141b3565b916001600160801b0383511660c082015190156140575764ffffffffff8151161561402d5764ffffffffff81511690604081019164ffffffffff8351169081811015613fed575050602081019064ffffffffff8251169081151580613fdb575b613f9a57505064ffffffffff90511664ffffffffff8251169081811015613f5a57505064ffffffffff8042169151169081811015613f1a575050600754926001600160801b0381511660405190613ada8261313b565b815260006020820152600060408201526001600160a01b036060840151169060c08401519164ffffffffff604084015116906080860151151560a087015115159264ffffffffff6001600160a01b0389511696511660405196613b3c88613174565b87526020870152604086015260608501526000608085015260a0840152600060c0840152600160e08401526101008301526101208201528460005260096020526040600020906001600160a01b0381511678ffffffffff0000000000000000000000000000000000000000602083015160a01b16907dffffffffff00000000000000000000000000000000000000000000000000604084015160c81b167eff0000000000000000000000000000000000000000000000000000000000006060850151151560f01b16917fff000000000000000000000000000000000000000000000000000000000000006080860151151560f81b1693171717178255600182016001600160a01b0360a08301511681549074ff000000000000000000000000000000000000000060c0850151151560a01b1675ff00000000000000000000000000000000000000000060e0860151151560a81b16917fffffffffffffffffff000000000000000000000000000000000000000000000076ff00000000000000000000000000000000000000000000610100880151151560b01b1694161717171790556001600160801b03604060036101206002860194015194613d3484875116956001600160801b03199687825416178155856020890151166001600160801b036001600160801b031983549260801b169116179055565b01930151169082541617905564ffffffffff602060c084015101511680613efc575b50600184016007556001600160a01b03602083015116801561348557613d84856001600160a01b03926137f9565b16613ecb57613daf6001600160a01b036060840151166001600160801b03835116903090339061428c565b6001600160801b0360208201511680613e9c575b506001600160a01b038251167f44cb432df42caa86b7ec73644ab8aec922bc44c71c98fc330addc75b88adbc7c610140866001600160a01b0360208701511694613e936001600160a01b03606089015116976080810151151560a08201511515906001600160801b0360206001600160a01b0360e060c087015196015151169660405198895233828a01528281511660408a01520151166060870152608086015260a085015260c08401906040908164ffffffffff91828151168552826020820151166020860152015116910152565b610120820152a4565b613ec5906001600160a01b036060850151166001600160a01b0360e0860151511690339061428c565b38613dc3565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b600a60205260406000209064ffffffffff1982541617905538613d56565b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b6040517f9fee269100000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b516040517fb39831ea00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b508164ffffffffff8251161015613a84565b6040517f5057f08400000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b60046040517fd572dbcb000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b3d156140ac573d90614092826131cf565b916140a060405193846131ad565b82523d6000602084013e565b606090565b6140d9906140be81614138565b90600052600960205260026040600020015460801c90613225565b90565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b03929092166024830152604480830193909352918152614136916141316064836131ad565b61448a565b565b80600052600960205261415160026040600020016134e2565b816000526009602052604060002060ff600182015460a01c1660001461418457506001600160801b039150602001511690565b5460f81c61419657506140d9906136ba565b6140d991506001600160801b036040818351169201511690613225565b919091604051906141c382613191565b600091828152826020820152936001600160801b039283831691821561426d5767016345785d8a000080821161423657506141ff8591846143db565b16602087019281845211156142225750908261421d92511690613225565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b509394505050506040519061428182613191565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff84111761293f576141369260405261448a565b670de0b6b3a76400009160001983830992808302928380861095039480860395146143b7578285101561437b57908291096001821901821680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b82606492604051927f63a05778000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b5050809250156143c5570490565b634e487b7160e01b600052601260045260246000fd5b9091906000198382098382029182808310920391808303921461447957670de0b6b3a7640000908183101561444257947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b6001600160a01b0316906144b5600080836020829551910182875af16144ae614081565b9084614526565b9081519182151592836144fe575b5050506144cd5750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312610a6757602001519081159182150361064c57503880806144c3565b90614565575080511561453b57805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b815115806145b0575b614576575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561456e56fea164736f6c6343000817000a"; bytes public constant BYTECODE_LOCKUP_TRANCHED = - hex"60c034620003dc576001600160401b0390601f601f1962004dcf3881900383810183168501919086831186841017620002f557808692606094604052833981010312620003dc5782516001600160a01b038082169590929091869003620003dc5760209485810151938416809403620003dc57604001519362000081620003e1565b95601e87527f5361626c696572205632204c6f636b7570205472616e63686564204e4654000081880152620000b5620003e1565b9060118252705341422d56322d4c4f434b55502d54524160781b81830152306080528751858111620002f5576001988954908a82811c92168015620003d1575b84831014620002d45781868493116200037b575b50839086831160011462000317576000926200030b575b5050600019600383901b1c191690891b1788555b8151948511620002f557600254938885811c95168015620002ea575b82861014620002d457848487961162000277575b50819385116001146200020d57505060009262000201575b5050600019600383901b1c191690841b176002555b60018060a01b03198481600054161760005560085416176008556040519260007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360a0526007556149cd908162000402823960805181613dda015260a051818181612eb80152613e7a0152f35b0151905038806200017c565b88959392919316600260005283600020936000905b8282106200025d575050841162000243575b505050811b0160025562000191565b015160001960f88460031b161c1916905538808062000234565b8484015186558a9790950194938401939081019062000222565b9091929394506002600052826000208580880160051c820192858910620002ca575b9188978c9297969594930160051c01915b828110620002ba57505062000164565b600081558897508b9101620002aa565b9250819262000299565b634e487b7160e01b600052602260045260246000fd5b94607f169462000150565b634e487b7160e01b600052604160045260246000fd5b01519050388062000120565b90878c94169184600052856000209260005b878282106200036457505084116200034a575b505050811b01885562000134565b015160001960f88460031b161c191690553880806200033c565b8385015186558f9790950194938401930162000329565b9091508a600052836000208680850160051c820192868610620003c7575b918d91869594930160051c01915b828110620003b757505062000109565b600081558594508d9101620003a7565b9250819262000399565b91607f1691620000f5565b600080fd5b60408051919082016001600160401b03811183821017620002f55760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461321657508063027b6744146131f357806306fdde031461312e578063081812fc1461310f578063095ea7b3146130165780631400ecec14612f765780631c1cdd4c14612f115780631e99d56914612ef357806323b872dd14612edb5780632fe4304114612ea057806332fbe22b14612d4857806340e58ee514612aaa578063425d30dd14612a5957806342842e0e14612a1f57806342966c6814612844578063442675701461281d5780634857501f146127a75780634869e12d1461276c5780634cc55e11146122f05780636352211e146122c05780636d0cee75146122c057806370a082311461225057806375829def146121bd5780637cad6cd1146120c35780637de6b1db14611e9c5780637f5799f914611e415780638659c27014611ae7578063894e9a0d1461175b578063897f362b146114ab5780638f69b9931461140f5780639067b677146113bf57806395d89b41146112b0578063a22cb465146111f3578063a80fc071146111a1578063ad35efd41461113f578063b2564569146110ee578063b88d4fde14611061578063b8a3be661461102c578063b971302a14610fdd578063bc2be1be14610f8d578063c156a11d14610af6578063c87b56dd146109da578063cc364f4814610942578063d4dbd20b146108f0578063d511609f146108a4578063d975dfed14610858578063e985e9c514610803578063ea5ead1914610721578063eac8f5b8146106cf578063f590c1761461066d578063f851a440146106475763fdd46d601461025d57600080fd5b34610644576060366003190112610644576004359061027a613345565b91604435926001600160801b038085169182860361063f5761029a613dd0565b83855260099560209387855260ff600160408920015460a81c16156106285785875287855260ff600160408920015460a01c16610610576001600160a01b039081841680156105e65781156105ce57878952600387528260408a2054169283821415806105be575b61059a5761030f8961457d565b8781168411610568575097899a888b999a83809d5282825260408b209988828c54169b6002015460801c90610343916145a8565b858d5284845260408d20600201908282549160801b6fffffffffffffffffffffffffffffffff19169116178155610379906138ec565b908084830151169181808251169160400151166103959161352d565b161115927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d93610539575b848c528252600160408c20015416946103da818a8861470d565b604051908152a4803314158061052f575b6104c1575b8333141590816104b6575b816104ab575b50610435575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b156104a757604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af161048f575b8080610407565b6104989061344e565b6104a3578238610488565b8280fd5b8380fd5b905083141538610401565b843b151591506103fb565b803b1561052b57604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1610517575b50506103f0565b6105209061344e565b61052b578438610510565b8480fd5b50803b15156103eb565b848c5280835260408c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103c0565b60405163287ecaef60e21b8152600481018b90526001600160801b038781166024830152919091166044820152606490fd5b606489836040519163b34359d360e01b835260048301523360248301526044820152fd5b506105c8896144e4565b15610302565b6024886040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b60248660405190634a5541ef60e01b82526004820152fd5b6024866040519062b8e7e760e51b82526004820152fd5b600080fd5b80fd5b50346106445780600319360112610644576001600160a01b036020915416604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857816040916020935260098352205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760016040836001600160a01b0393602095526009855220015416604051908152f35b5034610644576040366003190112610644576004359061073f613345565b916107498161457d565b92610752613dd0565b81835260099360209185835260ff600160408720015460a81c16156107ec5783855285835260ff600160408720015460a01c166107d4576001600160a01b03918282169283156105e6576001600160801b03938483169081156105ce57878952600387528260408a2054169283821415806105be5761059a5761030f8961457d565b60248460405190634a5541ef60e01b82526004820152fd5b6024846040519062b8e7e760e51b82526004820152fd5b50346106445760403660031901126106445761081d61332f565b6040610827613345565b926001600160a01b0380931681526006602052209116600052602052602060ff604060002054166040519015158152f35b50346106445760203660031901126106445760ff6001604060043593848152600960205220015460a81c16156106b85761089360209161457d565b6001600160801b0360405191168152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857604082600292602094526009845220015460801c604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760036040836001600160801b0393602095526009855220015416604051908152f35b503461064457602036600319011261064457600435600060206040516109678161349b565b8281520152808252600960205260ff600160408420015460a81c16156106b857604082819281526009602052205464ffffffffff8251916109a78361349b565b818160a01c16835260c81c1660208201526109d8825180926020908164ffffffffff91828151168552015116910152565bf35b503461064457602080600319360112610ae6576004356109f981613aae565b50826001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa928315610aea578093610a69575b5050610a6560405192828493845283019061330a565b0390f35b909192503d8082843e610a7c81846134b7565b8201918381840312610ae65780519067ffffffffffffffff82116104a3570182601f82011215610ae657805191610ab2836134d9565b93610ac060405195866134b7565b838552858484010111610644575090610ade918480850191016132e7565b903880610a4f565b5080fd5b604051903d90823e3d90fd5b503461064457604036600319011261064457600435610b13613345565b610b1b613dd0565b81835260099060209082825260ff600160408720015460a81c16156107ec57838552600382526001600160a01b03918260408720541693843303610f6e57610b628661457d565b906001600160801b039081831680158015610c02575b50505050505081811615610bea5783610b9091613c8b565b90811680610bb05760248460405190637e27328960e01b82526004820152fd5b8203610bba578380f35b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b60248560405190633250574960e11b82526004820152fd5b610c0a613dd0565b898b5282865260ff600160408d20015460a81c1615610f5757898b5282865260ff600160408d20015460a01c16610f3f5788156105e657610f2757888a52600385528660408b205416918289141580610f17575b610ef357610c6b8a61457d565b8481168311610ec15750908a949392918a86528087526040862093610cd0610c9e8760028d89541698015460801c6145a8565b8d8952838a52600260408a200190836fffffffffffffffffffffffffffffffff1983549260801b1691161781556138ec565b90610cec818a840151169282604081835116920151169061352d565b161115610e92575b8a86528652888a7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d888b600160408b2001541694610d3381868861470d565b604051908152a48033141580610e88575b610e1e575b813314159081610e13575b81610e08575b50610d97575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790604051868152a1388080808080610b78565b803b156104a357604051636fd110e960e01b8152600481018990523360248201526001600160a01b03881660448201526001600160801b0392909216606483015282908290608490829084905af1610df0575b80610d60565b610df99061344e565b610e04578538610dea565b8580fd5b905081141538610d5a565b823b15159150610d54565b803b156104a757604051636fd110e960e01b8152600481018a90523360248201526001600160a01b03891660448201526001600160801b03841660648201528490818160848183875af1610e74575b5050610d49565b610e7d9061344e565b6104a7578338610e6d565b50803b1515610d44565b8a86528087526040862060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055610cf4565b60405163287ecaef60e21b8152600481018c90526001600160801b038781166024830152919091166044820152606490fd5b60648a8a6040519163b34359d360e01b835260048301523360248301526044820152fd5b50610f218a6144e4565b15610c5e565b6024896040519063d2aabcd960e01b82526004820152fd5b60248a60405190634a5541ef60e01b82526004820152fd5b60248a6040519062b8e7e760e51b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760408264ffffffffff926020945260098452205460a01c16604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b8576040826001600160a01b03926020945260098452205416604051908152f35b50346106445760203660031901126106445760ff6001604060209360043581526009855220015460a81c166040519015158152f35b50346106445760803660031901126106445761107b61332f565b611083613345565b906064359067ffffffffffffffff82116104a757366023830112156104a757816004013592846110b2856134d9565b936110c060405195866134b7565b8585523660248783010111610ae657856110eb96602460209301838801378501015260443591613941565b80f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857600160408360ff93602095526009855220015460b01c166040519015158152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85761117890613c04565b60405190600581101561118d57602092508152f35b602483634e487b7160e01b81526021600452fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760026040836001600160801b0393602095526009855220015416604051908152f35b50346106445760403660031901126106445761120d61332f565b6024359081151580920361063f576001600160a01b031690811561127f5733835260066020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064457806003193601126106445760405190806002549160018360011c92600185169485156113b5575b60209586861081146113a15785885287949392918790821561137f575050600114611325575b5050611311925003836134b7565b610a6560405192828493845283019061330a565b90859250600282527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b85831061136757505061131193508201013880611303565b8054838901850152879450869390920191810161134f565b925093505061131194915060ff191682840152151560051b8201013880611303565b602483634e487b7160e01b81526022600452fd5b93607f16936112dd565b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760408264ffffffffff926020945260098452205460c81c16604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85761144890613c04565b9060058210159081611489576002831491821561149d575b8215611474575b6020836040519015158152f35b90915061148957506004602091143880611467565b80634e487b7160e01b602492526021600452fd5b506003831491506000611460565b5034610644576020906003198281360112610ae6576004359167ffffffffffffffff91828411610ae65761012084360391820112610ae6576114eb613dd0565b60c48401359060221901811215610ae65783016004810135928311610ae65760248101908360061b80360383136104a757602490611528866137b7565b9561153660405197886134b7565b8652878601920101913683116104a757905b868383106117435750505050815190611560826137b7565b9261156e60405194856134b7565b828452601f1961157d846137b7565b0186835b82811061171f5750505064ffffffffff804216936001600160801b0392836115a882613ad1565b51511683808b6115b785613ad1565b51015116880116604051916115cb8361349b565b82528a8201526115da88613ad1565b526115e487613ad1565b5060019260015b8381106116b657505050505061160385600401613920565b9161161060248701613920565b9161161d6044880161385a565b6064880135926001600160a01b039081851680950361064457509288959261166e9895926116a3989561165560846116ae9d01613934565b948161166360a48c01613934565b976040519d8e613431565b168c52168c8b0152166040890152606088015215156080870152151560a086015260c085015260e084015260e4369101613805565b610100820152613e2c565b604051908152f35b8089838d8180826116db8d6116cc8e9a8d613ade565b51511696600019890190613ade565b51015116916116ea868a613ade565b510151160116604051916116fd8361349b565b82528d82015261170d828c613ade565b52611718818b613ade565b50016115eb565b60405161172b8161349b565b60008152600083820152828289010152018790611581565b60409161175036856137cf565b815201910190611548565b503461064457602036600319011261064457606061016060405161177e81613462565b83815283602082015283604082015283838201528360808201528360a08201528360c08201528360e082015283610100820152836101208201526040516117c48161347f565b84815284602082015284604082015261014082015201526004358152600960205260ff600160408320015460a81c1615611acf5760043581526009602052604081209060405191610140830183811067ffffffffffffffff821117611ab9576118b59160029160405280546001600160a01b038116865264ffffffffff8160a01c16602087015264ffffffffff8160c81c16604087015260ff8160f01c161515606087015260f81c1515608086015260ff60018201546001600160a01b03811660a0880152818160a01c16151560c0880152818160a81c16151560e088015260b01c161515610100860152016138ec565b6101208301526118c6600435613c04565b6005811015611aa557610160926119719260026119ad9314611a9a575b610120820151906001600160a01b0360a0840151169064ffffffffff60408501511660608501511515928561010081015115159460c082015115159360e0830151151595600435815260036020526001600160a01b036040822054166080604064ffffffffff60206001600160a01b038951169801511693600a602052209b01511515946040519d8e613462565b8d5260208d015260408c015260608b015260808a015260a089015260c088015260e087015261010086015261012085015261014084015261386e565b82820152610a65604051928392602084526001600160a01b0381511660208501526001600160a01b03602082015116604085015264ffffffffff604082015116606085015264ffffffffff60608201511660808501526080810151151560a085015260a0810151151560c08501526001600160a01b0360c08201511660e085015260e081015115156101008501526101008101511515610120850152610120810151151561014085015261014081015160406001600160801b03918281511685880152826020820151166101808801520151166101a085015201516101c0808401526101e08301906133d5565b8060608301526118e3565b602482634e487b7160e01b81526021600452fd5b634e487b7160e01b600052604160045260246000fd5b602460405162b8e7e760e51b81526004356004820152fd5b503461064457602080600319360112610ae65760043567ffffffffffffffff81116104a357611b1a9036906004016133a4565b9190611b24613dd0565b83925b808410611b32578480f35b611b3d848284613834565b3593611b47613dd0565b848652600980855260ff90600190828260408b20015460a81c1615611e2a57878952808752604089208281015460a01c841615611b965760248960405190634a5541ef60e01b82526004820152fd5b9790919293949596975460f81c611e1257611bc78160005260096020526001600160a01b0360406000205416331490565b15611df257611bd581613af2565b818a52828952611bea600260408c20016138ec565b906001600160801b0395868351168783161015611dda57838c52848b5260408c205460f01c1615611dc25791818a611c3b85898f9a999896611c318c99838793511661352d565b950151169061352d565b8386528482527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5060408720916040835499600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c161785558b83169a8b15611da9575b60038096019c88169c8d6fffffffffffffffffffffffffffffffff198254161790556001600160a01b0392838092169b8c9789522054169889965260408d2001541694611cee8b858861470d565b604080518881526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78a604051838152a1813b611d52575b505050505050600101929190611b27565b813b15610e0457856084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1611d95575b80808080611d41565b611d9e9061344e565b61052b578438611d8c565b818601600160a01b60ff60a01b19825416179055611ca0565b602483604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b6024886040519062b8e7e760e51b82526004820152fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857604082611e8892610a659452600a6020522061386e565b6040519182916020835260208301906133d5565b503461064457602080600319360112610ae65760043590611ebb613dd0565b8183526009815260ff600160408520015460a81c16156120ac57611ede82613c04565b60058110156120985760048103611f075760248360405190634a5541ef60e01b82526004820152fd5b60038103611f27576024836040519063fe19f19f60e01b82526004820152fd5b60021461208057611f4e8260005260096020526001600160a01b0360406000205416331490565b15612061578183526009815260ff604084205460f01c161561204957818352600981526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600383526001600160a01b03604083205416803b611ff1575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b156104a357816024818580947f450154640000000000000000000000000000000000000000000000000000000083528960048401525af1612035575b80611fc2565b61203e9061344e565b6104a357823861202f565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b5034610644576020366003190112610644576004356001600160a01b03908181168091036104a35781835416338103612194575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260075460001981019081116121805760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b5034610644576020366003190112610644576121d761332f565b9080546001600160a01b0380821693338503612229576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610644576020366003190112610644576001600160a01b0361227261332f565b16801561228f578160409160209352600483522054604051908152f35b602482604051907f89c62b640000000000000000000000000000000000000000000000000000000082526004820152fd5b50346106445760203660031901126106445760206122df600435613aae565b6001600160a01b0360405191168152f35b50346106445760403660031901126106445767ffffffffffffffff6004358181116104a3576123239036906004016133a4565b90916024359081116104a75761233d9036906004016133a4565b612345613dd0565b80830361273557845b838110612359578580f35b612364818587613834565b3590612371818688613834565b35875260036020526001600160a01b0360408820541661239a612395838688613834565b61385a565b906123a3613dd0565b838952600960205260ff600160408b20015460a81c16156107ec57838952600960205260ff600160408b20015460a01c166107d45780156105e6576001600160801b0382161561271d5783895260036020526001600160a01b0360408a20541691828214158061270d575b6126e95761241b8561457d565b6001600160801b0381166001600160801b038316116126b9575090899291858452600960205260408420926124a16001600160a01b03855416946002809101546001600160801b036fffffffffffffffffffffffffffffffff1961248387608094851c6145a8565b938c8b52600960205260408b2001938454931b1691161781556138ec565b6001600160801b036124c5816020840151169282604081835116920151169061352d565b161115612688575b86855260096020526001600160a01b036001604087200154166124fa6001600160801b038416858361470d565b83887f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206040516001600160801b0388168152a4803314158061267e575b612614575b833314159081612609575b816125fe575b5061258c575b505050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161234e565b823b156104a757604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af16125e6575b8080612555565b6125ef9061344e565b6125fa5786386125df565b8680fd5b90508314153861254f565b843b15159150612549565b803b1561052b57604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af161266a575b505061253e565b6126739061344e565b61052b578438612663565b50803b1515612539565b86855260096020526040852060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556124cd565b60405163287ecaef60e21b8152600481018790526001600160801b03928316602482015291166044820152606490fd5b606485836040519163b34359d360e01b835260048301523360248301526044820152fd5b50612717856144e4565b1561240e565b6024846040519063d2aabcd960e01b82526004820152fd5b82604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346106445760203660031901126106445760ff6001604060043593848152600960205220015460a81c16156106b857610893602091614767565b50346106445760203660031901126106445760043590818152600960205260ff600160408320015460a81c16156120ac57806127e283613c04565b926005841015611aa557600260209403612803575b50506040519015158152f35b815260098352604090205460f01c60ff16905038806127f7565b503461064457806003193601126106445760206001600160a01b0360085416604051908152f35b503461064457602080600319360112610ae65760043590612863613dd0565b8183526009815260ff600160408520015460a81c16156120ac578183526009815260ff600160408520015460a01c16156129ee576128a0826144e4565b156120615781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c161590816129e4575b50806129dc575b6129c4577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790836000526003835260406000205416918215928315612989575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a1612971575080f35b60249060405190637e27328960e01b82526004820152fd5b6129aa85600052600560205260406000206001600160a01b03198154169055565b80600052600482526040600020600019815401905561291f565b60248360405190630da9b01360e01b82526004820152fd5b5060006128df565b90501515386128d8565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064457612a2e3661336f565b60405191602083019383851067ffffffffffffffff861117611ab9576110eb94604052858452613941565b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857600160408360ff93602095526009855220015460a01c166040519015158152f35b503461064457602090816003193601126106445760043590612aca613dd0565b81815260099283815260ff600160408420015460a81c1615612d315782825283815260408220600181015460a01c60ff1615612b185760248460405190634a5541ef60e01b82526004820152fd5b9284935460f81c611e1257612b438160005260096020526001600160a01b0360406000205416331490565b15611df257612b5181613af2565b93818452808352612b67600260408620016138ec565b916001600160801b03938484511685881610156120805781865282815260ff604087205460f01c161561204957612bb5878683612bab8a9b838a9c9b9c511661352d565b970151169061352d565b908286528381526040862091825494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161784556003898316948515612d17575b01988716988981546fffffffffffffffffffffffffffffffff19161790556001600160a01b038096168097600385528760408b205416978893865260408b20600101541693612c4a8c848761470d565b604080518981526001600160801b03938416602082015292909116908201528060608101037f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5091a4604051908382527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791a1823b612cc6578480f35b823b1561052b576084928591604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1612d08575b81818080808480f35b612d119061344e565b81612cff565b60018101600160a01b60ff60a01b19825416179055612bfa565b6024836040519062b8e7e760e51b82526004820152fd5b5034610644576003199060203683018113610ae6576004359167ffffffffffffffff93848411610ae65761014090843603011261064457612d87613dd0565b60405193612d9485613431565b612da08460040161335b565b8552612dae6024850161335b565b6020860152612dbf604485016134f5565b604086015260648401356001600160a01b03811681036104a3576060860152612dea60848501613424565b6080860152612dfb60a48501613424565b60a0860152612e0c60c485016137a5565b60c086015260e4840135908111610ae65783019136602384011215610ae6576004830135612e39816137b7565b93612e4760405195866134b7565b8185526024602086019260061b820101933685116106445750602401905b838210612e875760206116ae886116a3898960e0840152610104369101613805565b82604091612e9536856137cf565b815201910190612e65565b503461064457806003193601126106445760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5034610644576110eb612eed3661336f565b9161355c565b50346106445780600319360112610644576020600754604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857612f4a90613c04565b9060058210156114895760208215838115612f6b575b506040519015158152f35b600191501482612f60565b50346106445760203660031901126106445760043590818152600960205260ff600160408320015460a81c16156120ac57602091604082828152600985522060ff815460f01c1680613004575b612fdb575b50506001600160801b0360405191168152f35b612ffd92506001600160801b036002612ff79201541691613af2565b9061352d565b3880612fc8565b5060ff600182015460a01c1615612fc3565b50346106445760403660031901126106445761303061332f565b60243561303c81613aae565b331515806130fc575b806130d2575b6130a25781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a48252600560205260408220906001600160a01b031982541617905580f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116845260066020526040842033855260205260ff6040852054161561304b565b50336001600160a01b0382161415613045565b50346106445760203660031901126106445760206122df600435613509565b50346106445780600319360112610644576040519080600191600154928360011c92600185169485156131e9575b60209586861081146113a15785885287949392918790821561137f57505060011461318f575050611311925003836134b7565b90859250600182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8583106131d157505061131193508201013880611303565b805483890185015287945086939092019181016131b9565b93607f169361315c565b5034610644578060031936011261064457602060405167016345785d8a00008152f35b905034610ae6576020366003190112610ae6576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036104a357602092507f80ac58cd0000000000000000000000000000000000000000000000000000000081149081156132bd575b8115613293575b5015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150143861328c565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150613285565b60005b8381106132fa5750506000910152565b81810151838201526020016132ea565b90602091613323815180928185528580860191016132e7565b601f01601f1916010190565b600435906001600160a01b038216820361063f57565b602435906001600160a01b038216820361063f57565b35906001600160a01b038216820361063f57565b606090600319011261063f576001600160a01b0390600435828116810361063f5791602435908116810361063f579060443590565b9181601f8401121561063f5782359167ffffffffffffffff831161063f576020808501948460051b01011161063f57565b90815180825260208080930193019160005b8281106133f5575050505090565b835180516001600160801b0316865282015164ffffffffff1685830152604090940193928101926001016133e7565b3590811515820361063f57565b610120810190811067ffffffffffffffff821117611ab957604052565b67ffffffffffffffff8111611ab957604052565b610180810190811067ffffffffffffffff821117611ab957604052565b6060810190811067ffffffffffffffff821117611ab957604052565b6040810190811067ffffffffffffffff821117611ab957604052565b90601f8019910116810190811067ffffffffffffffff821117611ab957604052565b67ffffffffffffffff8111611ab957601f01601f191660200190565b35906001600160801b038216820361063f57565b61351281613aae565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161354657565b634e487b7160e01b600052601160045260246000fd5b906001600160a01b03809116801561378d57600091848352602091600383526040928284862054166009825260ff6001868820015460b01c16159081613783575b508061377b575b6137645786855260038152828486205416948733151593846136b4575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce794508761367c575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a18316820361364e5750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b61369d82600052600560205260406000206001600160a01b03198154169055565b8783526004845286832080546000190190556135ea565b91929380915090613723575b156136ce57908783926135c1565b8488876136eb576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015613748575b806136c057508782526005835233848684205416146136c0565b5085825260068352848220338352835260ff858320541661372e565b602487855190630da9b01360e01b82526004820152fd5b5060016135a4565b905015153861359d565b6024604051633250574960e11b815260006004820152fd5b359064ffffffffff8216820361063f57565b67ffffffffffffffff8111611ab95760051b60200190565b919082604091031261063f576040516137e78161349b565b60206138008183956137f8816134f5565b8552016137a5565b910152565b919082604091031261063f5760405161381d8161349b565b602080829461382b8161335b565b84520135910152565b91908110156138445760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160801b038116810361063f5790565b90815461387a816137b7565b9260409361388b60405191826134b7565b82815280946020809201926000526020600020906000935b8585106138b257505050505050565b600184819284516138c28161349b565b64ffffffffff87546001600160801b038116835260801c16838201528152019301940193916138a3565b906040516138f98161347f565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b356001600160a01b038116810361063f5790565b35801515810361063f5790565b919061394e82828561355c565b803b61395b575b50505050565b6139b76001600160a01b03809216946040519384937f150b7a020000000000000000000000000000000000000000000000000000000096878652336004870152166024850152604484015260806064840152608483019061330a565b03906020816000938185885af190829082613a4d575b5050613a0457826139dc61454d565b80519190826139fd5760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff000000000000000000000000000000000000000000000000000000001603613a35575038808080613955565b60249060405190633250574960e11b82526004820152fd5b909192506020813d602011613aa6575b81613a6a602093836134b7565b81010312610ae65751907fffffffff000000000000000000000000000000000000000000000000000000008216820361064457509038806139cd565b3d9150613a5d565b8060005260036020526001600160a01b0360406000205416908115612971575090565b8051156138445760200190565b80518210156138445760209160051b010190565b64ffffffffff80421691600090808252602091600a602052613b166040822061386e565b9185856020613b2486613ad1565b5101511611613bfb5781526009602052604081208585825460c81c161115613be557506001600160801b039485613b5a84613ad1565b5151169583519260019360011015613bd15750949392919084602060408501510151169581866001985b161115613b95575050505050505090565b909181879881613ba98798999a8598613ade565b5151160116970191868087613bbe8689613ade565b5101511697829392919796959498613b84565b80634e487b7160e01b602492526032600452fd5b600201546001600160801b031695945050505050565b50935050505090565b806000526009602052604060002060ff600182015460a01c16600014613c2b575050600490565b805460f81c613c84575460a01c64ffffffffff164210613c7e57613c4e81613af2565b9060005260096020526001600160801b038060026040600020015416911610600014613c7957600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613dc6575b5080613dbb575b613da4579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84838720541694859283613d6c575b169283613d56575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b8387526004885280872060018154019055613d32565b613d8d86600052600560205260406000206001600160a01b03198154169055565b838852600489528488208054600019019055613d2a565b602486885190630da9b01360e01b82526004820152fd5b508181161515613cc9565b9050151538613cc2565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003613e0257565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b90613e4e6001600160801b0360408401511660206101008501510151906145c3565b6001600160801b0381511660e084015164ffffffffff60c08601511682156144ba5781518015614490577f0000000000000000000000000000000000000000000000000000000000000000811161445f575064ffffffffff6020613eb184613ad1565b510151168110156144085750600090819082815184905b808210614377575050505064ffffffffff421664ffffffffff82168110156143375750506001600160801b0316808203614300575050600754928360005260096020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036060830151166001840154750100000000000000000000000000000000000000000060808501511515918654937fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff0000000000000000000000000000000000000000000060a0890151151560b01b16921617171760018601556001600160a01b0384511678ffffffffff000000000000000000000000000000000000000060c086015160a01b169060e0860151937fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff0000000000000000000000000000000000000000000000000060206140648951996000198b0190613ade565b51015160c81b169560f01b16911617171717845560005b81811061425b575050600185016007556001600160a01b03602083015116801561378d576140b1866001600160a01b0392613c8b565b1661422a576140dc6001600160a01b036060840151166001600160801b03835116903090339061469c565b6001600160801b03602082015116806141fa575b507ffeb1cb9ce021c8bd5fb1eb836e6284c68866fa32d1d844238de19955238f807660206001600160a01b03845116926001600160a01b038286015116946001600160a01b03606082015116966141ef6141d060808401511515928c60a086015115156001600160a01b0361010060e089015194549864ffffffffff6040519a6141798c61349b565b818160a01c168c5260c81c168c8b015201515116956001600160801b036040519a8b9a610140958c5233828d01528281511660408d015201511660608a0152608089015260a08801528060c08801528601906133d5565b9260e08501906020908164ffffffffff91828151168552015116910152565b6101208301520390a4565b614224906001600160a01b036060850151166001600160a01b03610100860151511690339061469c565b386140f0565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b86600052600a6020526040600020906142788160e0870151613ade565b51825468010000000000000000811015611ab9576001810180855581101561384457600193600052602060002001906001600160801b038151167fffffffffffffffffffffff00000000000000000000000000000000000000000074ffffffffff000000000000000000000000000000006020855494015160801b169216171790550161407b565b60449250604051917f6375ff1300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b919350919361439b906001600160801b036143928588613ade565b515116906145a8565b9364ffffffffff8060206143af8685613ade565b510151169416808511156143cb57506001849301909291613ec8565b8385606492604051927fd97494c6000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff602061441984613ad1565b5101516040517ff1fb2cc500000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f73627f740000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f7ea4ccdf000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b038060408420541692833314938415614529575b5050821561451757505090565b9091506145243392613509565b161490565b60ff929450906040918152600660205281812033825260205220541691388061450a565b3d15614578573d9061455e826134d9565b9161456c60405193846134b7565b82523d6000602084013e565b606090565b6145a59061458a81614767565b90600052600960205260026040600020015460801c9061352d565b90565b9190916001600160801b038080941691160191821161354657565b919091604051906145d38261349b565b600091828152826020820152936001600160801b039283831691821561467d5767016345785d8a0000808211614646575061460f85918461487e565b16602087019281845211156146325750908261462d9251169061352d565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50939450505050604051906146918261349b565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611ab95761470b926040526147e2565b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b0392909216602483015260448083019390935291815261470b916147626064836134b7565b6147e2565b80600052600960205261478060026040600020016138ec565b816000526009602052604060002060ff600182015460a01c166000146147b357506001600160801b039150602001511690565b5460f81c6147c557506145a590613af2565b6145a591506001600160801b03604081835116920151169061352d565b6001600160a01b03169061480d600080836020829551910182875af161480661454d565b908461492d565b908151918215159283614856575b5050506148255750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312610ae6576020015190811591821503610644575038808061481b565b9091906000198382098382029182808310920391808303921461491c57670de0b6b3a764000090818310156148e557947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b9061496c575080511561494257805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b815115806149b7575b61497d575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561497556fea164736f6c6343000817000a"; + hex"60c034620003dc576001600160401b0390601f601f1962004dff3881900383810183168501919086831186841017620002f557808692606094604052833981010312620003dc5782516001600160a01b038082169590929091869003620003dc5760209485810151938416809403620003dc57604001519362000081620003e1565b95601e87527f5361626c696572205632204c6f636b7570205472616e63686564204e4654000081880152620000b5620003e1565b9060118252705341422d56322d4c4f434b55502d54524160781b81830152306080528751858111620002f5576001988954908a82811c92168015620003d1575b84831014620002d45781868493116200037b575b50839086831160011462000317576000926200030b575b5050600019600383901b1c191690891b1788555b8151948511620002f557600254938885811c95168015620002ea575b82861014620002d457848487961162000277575b50819385116001146200020d57505060009262000201575b5050600019600383901b1c191690841b176002555b60018060a01b03198481600054161760005560085416176008556040519260007fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808180a360a0526007556149fd908162000402823960805181613dda015260a051818181612eb80152613e800152f35b0151905038806200017c565b88959392919316600260005283600020936000905b8282106200025d575050841162000243575b505050811b0160025562000191565b015160001960f88460031b161c1916905538808062000234565b8484015186558a9790950194938401939081019062000222565b9091929394506002600052826000208580880160051c820192858910620002ca575b9188978c9297969594930160051c01915b828110620002ba57505062000164565b600081558897508b9101620002aa565b9250819262000299565b634e487b7160e01b600052602260045260246000fd5b94607f169462000150565b634e487b7160e01b600052604160045260246000fd5b01519050388062000120565b90878c94169184600052856000209260005b878282106200036457505084116200034a575b505050811b01885562000134565b015160001960f88460031b161c191690553880806200033c565b8385015186558f9790950194938401930162000329565b9091508a600052836000208680850160051c820192868610620003c7575b918d91869594930160051c01915b828110620003b757505062000109565b600081558594508d9101620003a7565b9250819262000399565b91607f1691620000f5565b600080fd5b60408051919082016001600160401b03811183821017620002f55760405256fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461321657508063027b6744146131f357806306fdde031461312e578063081812fc1461310f578063095ea7b3146130165780631400ecec14612f765780631c1cdd4c14612f115780631e99d56914612ef357806323b872dd14612edb5780632fe4304114612ea057806332fbe22b14612d4857806340e58ee514612aaa578063425d30dd14612a5957806342842e0e14612a1f57806342966c6814612844578063442675701461281d5780634857501f146127a75780634869e12d1461276c5780634cc55e11146122f05780636352211e146122c05780636d0cee75146122c057806370a082311461225057806375829def146121bd5780637cad6cd1146120c35780637de6b1db14611e9c5780637f5799f914611e415780638659c27014611ae7578063894e9a0d1461175b578063897f362b146114ab5780638f69b9931461140f5780639067b677146113bf57806395d89b41146112b0578063a22cb465146111f3578063a80fc071146111a1578063ad35efd41461113f578063b2564569146110ee578063b88d4fde14611061578063b8a3be661461102c578063b971302a14610fdd578063bc2be1be14610f8d578063c156a11d14610af6578063c87b56dd146109da578063cc364f4814610942578063d4dbd20b146108f0578063d511609f146108a4578063d975dfed14610858578063e985e9c514610803578063ea5ead1914610721578063eac8f5b8146106cf578063f590c1761461066d578063f851a440146106475763fdd46d601461025d57600080fd5b34610644576060366003190112610644576004359061027a613345565b91604435926001600160801b038085169182860361063f5761029a613dd0565b83855260099560209387855260ff600160408920015460a81c16156106285785875287855260ff600160408920015460a01c16610610576001600160a01b039081841680156105e65781156105ce57878952600387528260408a2054169283821415806105be575b61059a5761030f896145ad565b8781168411610568575097899a888b999a83809d5282825260408b209988828c54169b6002015460801c90610343916145d8565b858d5284845260408d20600201908282549160801b6fffffffffffffffffffffffffffffffff19169116178155610379906138ec565b908084830151169181808251169160400151166103959161352d565b161115927f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d93610539575b848c528252600160408c20015416946103da818a8861473d565b604051908152a4803314158061052f575b6104c1575b8333141590816104b6575b816104ab575b50610435575b837ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78688604051908152a180f35b823b156104a757604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af161048f575b8080610407565b6104989061344e565b6104a3578238610488565b8280fd5b8380fd5b905083141538610401565b843b151591506103fb565b803b1561052b57604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af1610517575b50506103f0565b6105209061344e565b61052b578438610510565b8480fd5b50803b15156103eb565b848c5280835260408c2060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556103c0565b60405163287ecaef60e21b8152600481018b90526001600160801b038781166024830152919091166044820152606490fd5b606489836040519163b34359d360e01b835260048301523360248301526044820152fd5b506105c889614514565b15610302565b6024886040519063d2aabcd960e01b82526004820152fd5b60046040517fc61a0e9e000000000000000000000000000000000000000000000000000000008152fd5b60248660405190634a5541ef60e01b82526004820152fd5b6024866040519062b8e7e760e51b82526004820152fd5b600080fd5b80fd5b50346106445780600319360112610644576001600160a01b036020915416604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857816040916020935260098352205460f81c6040519015158152f35b6024906040519062b8e7e760e51b82526004820152fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760016040836001600160a01b0393602095526009855220015416604051908152f35b5034610644576040366003190112610644576004359061073f613345565b91610749816145ad565b92610752613dd0565b81835260099360209185835260ff600160408720015460a81c16156107ec5783855285835260ff600160408720015460a01c166107d4576001600160a01b03918282169283156105e6576001600160801b03938483169081156105ce57878952600387528260408a2054169283821415806105be5761059a5761030f896145ad565b60248460405190634a5541ef60e01b82526004820152fd5b6024846040519062b8e7e760e51b82526004820152fd5b50346106445760403660031901126106445761081d61332f565b6040610827613345565b926001600160a01b0380931681526006602052209116600052602052602060ff604060002054166040519015158152f35b50346106445760203660031901126106445760ff6001604060043593848152600960205220015460a81c16156106b8576108936020916145ad565b6001600160801b0360405191168152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857604082600292602094526009845220015460801c604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760036040836001600160801b0393602095526009855220015416604051908152f35b503461064457602036600319011261064457600435600060206040516109678161349b565b8281520152808252600960205260ff600160408420015460a81c16156106b857604082819281526009602052205464ffffffffff8251916109a78361349b565b818160a01c16835260c81c1660208201526109d8825180926020908164ffffffffff91828151168552015116910152565bf35b503461064457602080600319360112610ae6576004356109f981613aae565b50826001600160a01b0360085416916044604051809481937fe9dc637500000000000000000000000000000000000000000000000000000000835230600484015260248301525afa928315610aea578093610a69575b5050610a6560405192828493845283019061330a565b0390f35b909192503d8082843e610a7c81846134b7565b8201918381840312610ae65780519067ffffffffffffffff82116104a3570182601f82011215610ae657805191610ab2836134d9565b93610ac060405195866134b7565b838552858484010111610644575090610ade918480850191016132e7565b903880610a4f565b5080fd5b604051903d90823e3d90fd5b503461064457604036600319011261064457600435610b13613345565b610b1b613dd0565b81835260099060209082825260ff600160408720015460a81c16156107ec57838552600382526001600160a01b03918260408720541693843303610f6e57610b62866145ad565b906001600160801b039081831680158015610c02575b50505050505081811615610bea5783610b9091613c8b565b90811680610bb05760248460405190637e27328960e01b82526004820152fd5b8203610bba578380f35b6040516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b60248560405190633250574960e11b82526004820152fd5b610c0a613dd0565b898b5282865260ff600160408d20015460a81c1615610f5757898b5282865260ff600160408d20015460a01c16610f3f5788156105e657610f2757888a52600385528660408b205416918289141580610f17575b610ef357610c6b8a6145ad565b8481168311610ec15750908a949392918a86528087526040862093610cd0610c9e8760028d89541698015460801c6145d8565b8d8952838a52600260408a200190836fffffffffffffffffffffffffffffffff1983549260801b1691161781556138ec565b90610cec818a840151169282604081835116920151169061352d565b161115610e92575b8a86528652888a7f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d888b600160408b2001541694610d3381868861473d565b604051908152a48033141580610e88575b610e1e575b813314159081610e13575b81610e08575b50610d97575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790604051868152a1388080808080610b78565b803b156104a357604051636fd110e960e01b8152600481018990523360248201526001600160a01b03881660448201526001600160801b0392909216606483015282908290608490829084905af1610df0575b80610d60565b610df99061344e565b610e04578538610dea565b8580fd5b905081141538610d5a565b823b15159150610d54565b803b156104a757604051636fd110e960e01b8152600481018a90523360248201526001600160a01b03891660448201526001600160801b03841660648201528490818160848183875af1610e74575b5050610d49565b610e7d9061344e565b6104a7578338610e6d565b50803b1515610d44565b8a86528087526040862060018101600160a01b60ff60a01b1982541617905560ff60f01b198154169055610cf4565b60405163287ecaef60e21b8152600481018c90526001600160801b038781166024830152919091166044820152606490fd5b60648a8a6040519163b34359d360e01b835260048301523360248301526044820152fd5b50610f218a614514565b15610c5e565b6024896040519063d2aabcd960e01b82526004820152fd5b60248a60405190634a5541ef60e01b82526004820152fd5b60248a6040519062b8e7e760e51b82526004820152fd5b60405163216caf0d60e01b815260048101879052336024820152604490fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760408264ffffffffff926020945260098452205460a01c16604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b8576040826001600160a01b03926020945260098452205416604051908152f35b50346106445760203660031901126106445760ff6001604060209360043581526009855220015460a81c166040519015158152f35b50346106445760803660031901126106445761107b61332f565b611083613345565b906064359067ffffffffffffffff82116104a757366023830112156104a757816004013592846110b2856134d9565b936110c060405195866134b7565b8585523660248783010111610ae657856110eb96602460209301838801378501015260443591613941565b80f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857600160408360ff93602095526009855220015460b01c166040519015158152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85761117890613c04565b60405190600581101561118d57602092508152f35b602483634e487b7160e01b81526021600452fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760026040836001600160801b0393602095526009855220015416604051908152f35b50346106445760403660031901126106445761120d61332f565b6024359081151580920361063f576001600160a01b031690811561127f5733835260066020526040832082600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a380f35b602482604051907f5b08ba180000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064457806003193601126106445760405190806002549160018360011c92600185169485156113b5575b60209586861081146113a15785885287949392918790821561137f575050600114611325575b5050611311925003836134b7565b610a6560405192828493845283019061330a565b90859250600282527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b85831061136757505061131193508201013880611303565b8054838901850152879450869390920191810161134f565b925093505061131194915060ff191682840152151560051b8201013880611303565b602483634e487b7160e01b81526022600452fd5b93607f16936112dd565b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85760408264ffffffffff926020945260098452205460c81c16604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b85761144890613c04565b9060058210159081611489576002831491821561149d575b8215611474575b6020836040519015158152f35b90915061148957506004602091143880611467565b80634e487b7160e01b602492526021600452fd5b506003831491506000611460565b5034610644576020906003198281360112610ae6576004359167ffffffffffffffff91828411610ae65761012084360391820112610ae6576114eb613dd0565b60c48401359060221901811215610ae65783016004810135928311610ae65760248101908360061b80360383136104a757602490611528866137b7565b9561153660405197886134b7565b8652878601920101913683116104a757905b868383106117435750505050815190611560826137b7565b9261156e60405194856134b7565b828452601f1961157d846137b7565b0186835b82811061171f5750505064ffffffffff804216936001600160801b0392836115a882613ad1565b51511683808b6115b785613ad1565b51015116880116604051916115cb8361349b565b82528a8201526115da88613ad1565b526115e487613ad1565b5060019260015b8381106116b657505050505061160385600401613920565b9161161060248701613920565b9161161d6044880161385a565b6064880135926001600160a01b039081851680950361064457509288959261166e9895926116a3989561165560846116ae9d01613934565b948161166360a48c01613934565b976040519d8e613431565b168c52168c8b0152166040890152606088015215156080870152151560a086015260c085015260e084015260e4369101613805565b610100820152613e2c565b604051908152f35b8089838d8180826116db8d6116cc8e9a8d613ade565b51511696600019890190613ade565b51015116916116ea868a613ade565b510151160116604051916116fd8361349b565b82528d82015261170d828c613ade565b52611718818b613ade565b50016115eb565b60405161172b8161349b565b60008152600083820152828289010152018790611581565b60409161175036856137cf565b815201910190611548565b503461064457602036600319011261064457606061016060405161177e81613462565b83815283602082015283604082015283838201528360808201528360a08201528360c08201528360e082015283610100820152836101208201526040516117c48161347f565b84815284602082015284604082015261014082015201526004358152600960205260ff600160408320015460a81c1615611acf5760043581526009602052604081209060405191610140830183811067ffffffffffffffff821117611ab9576118b59160029160405280546001600160a01b038116865264ffffffffff8160a01c16602087015264ffffffffff8160c81c16604087015260ff8160f01c161515606087015260f81c1515608086015260ff60018201546001600160a01b03811660a0880152818160a01c16151560c0880152818160a81c16151560e088015260b01c161515610100860152016138ec565b6101208301526118c6600435613c04565b6005811015611aa557610160926119719260026119ad9314611a9a575b610120820151906001600160a01b0360a0840151169064ffffffffff60408501511660608501511515928561010081015115159460c082015115159360e0830151151595600435815260036020526001600160a01b036040822054166080604064ffffffffff60206001600160a01b038951169801511693600a602052209b01511515946040519d8e613462565b8d5260208d015260408c015260608b015260808a015260a089015260c088015260e087015261010086015261012085015261014084015261386e565b82820152610a65604051928392602084526001600160a01b0381511660208501526001600160a01b03602082015116604085015264ffffffffff604082015116606085015264ffffffffff60608201511660808501526080810151151560a085015260a0810151151560c08501526001600160a01b0360c08201511660e085015260e081015115156101008501526101008101511515610120850152610120810151151561014085015261014081015160406001600160801b03918281511685880152826020820151166101808801520151166101a085015201516101c0808401526101e08301906133d5565b8060608301526118e3565b602482634e487b7160e01b81526021600452fd5b634e487b7160e01b600052604160045260246000fd5b602460405162b8e7e760e51b81526004356004820152fd5b503461064457602080600319360112610ae65760043567ffffffffffffffff81116104a357611b1a9036906004016133a4565b9190611b24613dd0565b83925b808410611b32578480f35b611b3d848284613834565b3593611b47613dd0565b848652600980855260ff90600190828260408b20015460a81c1615611e2a57878952808752604089208281015460a01c841615611b965760248960405190634a5541ef60e01b82526004820152fd5b9790919293949596975460f81c611e1257611bc78160005260096020526001600160a01b0360406000205416331490565b15611df257611bd581613af2565b818a52828952611bea600260408c20016138ec565b906001600160801b0395868351168783161015611dda57838c52848b5260408c205460f01c1615611dc25791818a611c3b85898f9a999896611c318c99838793511661352d565b950151169061352d565b8386528482527f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5060408720916040835499600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c161785558b83169a8b15611da9575b60038096019c88169c8d6fffffffffffffffffffffffffffffffff198254161790556001600160a01b0392838092169b8c9789522054169889965260408d2001541694611cee8b858861473d565b604080518881526001600160801b0392831660208201529290911690820152606090a47ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce78a604051838152a1813b611d52575b505050505050600101929190611b27565b813b15610e0457856084928195604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1611d95575b80808080611d41565b611d9e9061344e565b61052b578438611d8c565b818601600160a01b60ff60a01b19825416179055611ca0565b602483604051906339c6dc7360e21b82526004820152fd5b602484604051906322cad1af60e11b82526004820152fd5b60405163216caf0d60e01b81526004810191909152336024820152604490fd5b6024906040519063fe19f19f60e01b82526004820152fd5b6024886040519062b8e7e760e51b82526004820152fd5b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857604082611e8892610a659452600a6020522061386e565b6040519182916020835260208301906133d5565b503461064457602080600319360112610ae65760043590611ebb613dd0565b8183526009815260ff600160408520015460a81c16156120ac57611ede82613c04565b60058110156120985760048103611f075760248360405190634a5541ef60e01b82526004820152fd5b60038103611f27576024836040519063fe19f19f60e01b82526004820152fd5b60021461208057611f4e8260005260096020526001600160a01b0360406000205416331490565b15612061578183526009815260ff604084205460f01c161561204957818352600981526040832060ff60f01b19815416905582604051837f0eb069207093cd3e51cd1370d2d369770057fbe29947e577e5fb428c6c6fc78f8380a2600383526001600160a01b03604083205416803b611ff1575b5050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791604051908152a180f35b803b156104a357816024818580947f450154640000000000000000000000000000000000000000000000000000000083528960048401525af1612035575b80611fc2565b61203e9061344e565b6104a357823861202f565b602482604051906339c6dc7360e21b82526004820152fd5b60405163216caf0d60e01b815260048101839052336024820152604490fd5b602482604051906322cad1af60e11b82526004820152fd5b602484634e487b7160e01b81526021600452fd5b6024826040519062b8e7e760e51b82526004820152fd5b5034610644576020366003190112610644576004356001600160a01b03908181168091036104a35781835416338103612194575060085491816001600160a01b03198416176008556040519216825260208201527fa2548bd4b805e907c1558a47b5858324fe8bb4a2e1ddfca647eecbf65610eebc60403392a260075460001981019081116121805760407f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c91815190600182526020820152a180f35b602482634e487b7160e01b81526011600452fd5b6040516331b339a960e21b81526001600160a01b03919091166004820152336024820152604490fd5b5034610644576020366003190112610644576121d761332f565b9080546001600160a01b0380821693338503612229576001600160a01b03199394501691829116178255337fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf808380a380f35b6040516331b339a960e21b81526001600160a01b0386166004820152336024820152604490fd5b5034610644576020366003190112610644576001600160a01b0361227261332f565b16801561228f578160409160209352600483522054604051908152f35b602482604051907f89c62b640000000000000000000000000000000000000000000000000000000082526004820152fd5b50346106445760203660031901126106445760206122df600435613aae565b6001600160a01b0360405191168152f35b50346106445760403660031901126106445767ffffffffffffffff6004358181116104a3576123239036906004016133a4565b90916024359081116104a75761233d9036906004016133a4565b612345613dd0565b80830361273557845b838110612359578580f35b612364818587613834565b3590612371818688613834565b35875260036020526001600160a01b0360408820541661239a612395838688613834565b61385a565b906123a3613dd0565b838952600960205260ff600160408b20015460a81c16156107ec57838952600960205260ff600160408b20015460a01c166107d45780156105e6576001600160801b0382161561271d5783895260036020526001600160a01b0360408a20541691828214158061270d575b6126e95761241b856145ad565b6001600160801b0381166001600160801b038316116126b9575090899291858452600960205260408420926124a16001600160a01b03855416946002809101546001600160801b036fffffffffffffffffffffffffffffffff1961248387608094851c6145d8565b938c8b52600960205260408b2001938454931b1691161781556138ec565b6001600160801b036124c5816020840151169282604081835116920151169061352d565b161115612688575b86855260096020526001600160a01b036001604087200154166124fa6001600160801b038416858361473d565b83887f40b88e5c41c5a97ffb7b6ef88a0a2d505aa0c634cf8a0275cb236ea7dd87ed4d60206040516001600160801b0388168152a4803314158061267e575b612614575b833314159081612609575b816125fe575b5061258c575b505050507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce76020600193604051908152a10161234e565b823b156104a757604051636fd110e960e01b8152600481018790523360248201526001600160a01b039290921660448301526001600160801b031660648201529082908290608490829084905af16125e6575b8080612555565b6125ef9061344e565b6125fa5786386125df565b8680fd5b90508314153861254f565b843b15159150612549565b803b1561052b57604051636fd110e960e01b8152600481018890523360248201526001600160a01b03841660448201526001600160801b03831660648201528590818160848183875af161266a575b505061253e565b6126739061344e565b61052b578438612663565b50803b1515612539565b86855260096020526040852060018101600160a01b60ff60a01b1982541617905560ff60f01b1981541690556124cd565b60405163287ecaef60e21b8152600481018790526001600160801b03928316602482015291166044820152606490fd5b606485836040519163b34359d360e01b835260048301523360248301526044820152fd5b5061271785614514565b1561240e565b6024846040519063d2aabcd960e01b82526004820152fd5b82604491604051917faec9344000000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50346106445760203660031901126106445760ff6001604060043593848152600960205220015460a81c16156106b857610893602091614797565b50346106445760203660031901126106445760043590818152600960205260ff600160408320015460a81c16156120ac57806127e283613c04565b926005841015611aa557600260209403612803575b50506040519015158152f35b815260098352604090205460f01c60ff16905038806127f7565b503461064457806003193601126106445760206001600160a01b0360085416604051908152f35b503461064457602080600319360112610ae65760043590612863613dd0565b8183526009815260ff600160408520015460a81c16156120ac578183526009815260ff600160408520015460a01c16156129ee576128a082614514565b156120615781600052600381526001600160a01b0380604060002054166009835260ff60016040600020015460b01c161590816129e4575b50806129dc575b6129c4577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790836000526003835260406000205416918215928315612989575b846000526003825260406000206001600160a01b03198154169055846000604051927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4848152a1612971575080f35b60249060405190637e27328960e01b82526004820152fd5b6129aa85600052600560205260406000206001600160a01b03198154169055565b80600052600482526040600020600019815401905561291f565b60248360405190630da9b01360e01b82526004820152fd5b5060006128df565b90501515386128d8565b602482604051907f817cd6390000000000000000000000000000000000000000000000000000000082526004820152fd5b503461064457612a2e3661336f565b60405191602083019383851067ffffffffffffffff861117611ab9576110eb94604052858452613941565b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857600160408360ff93602095526009855220015460a01c166040519015158152f35b503461064457602090816003193601126106445760043590612aca613dd0565b81815260099283815260ff600160408420015460a81c1615612d315782825283815260408220600181015460a01c60ff1615612b185760248460405190634a5541ef60e01b82526004820152fd5b9284935460f81c611e1257612b438160005260096020526001600160a01b0360406000205416331490565b15611df257612b5181613af2565b93818452808352612b67600260408620016138ec565b916001600160801b03938484511685881610156120805781865282815260ff604087205460f01c161561204957612bb5878683612bab8a9b838a9c9b9c511661352d565b970151169061352d565b908286528381526040862091825494600160f81b7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87161784556003898316948515612d17575b01988716988981546fffffffffffffffffffffffffffffffff19161790556001600160a01b038096168097600385528760408b205416978893865260408b20600101541693612c4a8c848761473d565b604080518981526001600160801b03938416602082015292909116908201528060608101037f5edb27d6c1a327513b90a792050debf074b7194444885e3144d4decc5caaaa5091a4604051908382527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce791a1823b612cc6578480f35b823b1561052b576084928591604051978896879563c6f5ed0f60e01b875260048701526024860152604485015260648401525af1612d08575b81818080808480f35b612d119061344e565b81612cff565b60018101600160a01b60ff60a01b19825416179055612bfa565b6024836040519062b8e7e760e51b82526004820152fd5b5034610644576003199060203683018113610ae6576004359167ffffffffffffffff93848411610ae65761014090843603011261064457612d87613dd0565b60405193612d9485613431565b612da08460040161335b565b8552612dae6024850161335b565b6020860152612dbf604485016134f5565b604086015260648401356001600160a01b03811681036104a3576060860152612dea60848501613424565b6080860152612dfb60a48501613424565b60a0860152612e0c60c485016137a5565b60c086015260e4840135908111610ae65783019136602384011215610ae6576004830135612e39816137b7565b93612e4760405195866134b7565b8185526024602086019260061b820101933685116106445750602401905b838210612e875760206116ae886116a3898960e0840152610104369101613805565b82604091612e9536856137cf565b815201910190612e65565b503461064457806003193601126106445760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5034610644576110eb612eed3661336f565b9161355c565b50346106445780600319360112610644576020600754604051908152f35b503461064457602036600319011261064457600435808252600960205260ff600160408420015460a81c16156106b857612f4a90613c04565b9060058210156114895760208215838115612f6b575b506040519015158152f35b600191501482612f60565b50346106445760203660031901126106445760043590818152600960205260ff600160408320015460a81c16156120ac57602091604082828152600985522060ff815460f01c1680613004575b612fdb575b50506001600160801b0360405191168152f35b612ffd92506001600160801b036002612ff79201541691613af2565b9061352d565b3880612fc8565b5060ff600182015460a01c1615612fc3565b50346106445760403660031901126106445761303061332f565b60243561303c81613aae565b331515806130fc575b806130d2575b6130a25781906001600160a01b03809416938491167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258680a48252600560205260408220906001600160a01b031982541617905580f35b60246040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152336004820152fd5b506001600160a01b038116845260066020526040842033855260205260ff6040852054161561304b565b50336001600160a01b0382161415613045565b50346106445760203660031901126106445760206122df600435613509565b50346106445780600319360112610644576040519080600191600154928360011c92600185169485156131e9575b60209586861081146113a15785885287949392918790821561137f57505060011461318f575050611311925003836134b7565b90859250600182527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8583106131d157505061131193508201013880611303565b805483890185015287945086939092019181016131b9565b93607f169361315c565b5034610644578060031936011261064457602060405167016345785d8a00008152f35b905034610ae6576020366003190112610ae6576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036104a357602092507f80ac58cd0000000000000000000000000000000000000000000000000000000081149081156132bd575b8115613293575b5015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150143861328c565b7f5b5e139f0000000000000000000000000000000000000000000000000000000081149150613285565b60005b8381106132fa5750506000910152565b81810151838201526020016132ea565b90602091613323815180928185528580860191016132e7565b601f01601f1916010190565b600435906001600160a01b038216820361063f57565b602435906001600160a01b038216820361063f57565b35906001600160a01b038216820361063f57565b606090600319011261063f576001600160a01b0390600435828116810361063f5791602435908116810361063f579060443590565b9181601f8401121561063f5782359167ffffffffffffffff831161063f576020808501948460051b01011161063f57565b90815180825260208080930193019160005b8281106133f5575050505090565b835180516001600160801b0316865282015164ffffffffff1685830152604090940193928101926001016133e7565b3590811515820361063f57565b610120810190811067ffffffffffffffff821117611ab957604052565b67ffffffffffffffff8111611ab957604052565b610180810190811067ffffffffffffffff821117611ab957604052565b6060810190811067ffffffffffffffff821117611ab957604052565b6040810190811067ffffffffffffffff821117611ab957604052565b90601f8019910116810190811067ffffffffffffffff821117611ab957604052565b67ffffffffffffffff8111611ab957601f01601f191660200190565b35906001600160801b038216820361063f57565b61351281613aae565b5060005260056020526001600160a01b036040600020541690565b6001600160801b03918216908216039190821161354657565b634e487b7160e01b600052601160045260246000fd5b906001600160a01b03809116801561378d57600091848352602091600383526040928284862054166009825260ff6001868820015460b01c16159081613783575b508061377b575b6137645786855260038152828486205416948733151593846136b4575b7ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce794508761367c575b808352600484528683206001815401905581835260038452868320816001600160a01b0319825416179055877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88519480a4878152a18316820361364e5750505050565b516364283d7b60e01b81526001600160a01b0392831660048201526024810193909352166044820152606490fd5b61369d82600052600560205260406000206001600160a01b03198154169055565b8783526004845286832080546000190190556135ea565b91929380915090613723575b156136ce57908783926135c1565b8488876136eb576024915190637e27328960e01b82526004820152fd5b90517f177e802f0000000000000000000000000000000000000000000000000000000081523360048201526024810191909152604490fd5b503386148015613748575b806136c057508782526005835233848684205416146136c0565b5085825260068352848220338352835260ff858320541661372e565b602487855190630da9b01360e01b82526004820152fd5b5060016135a4565b905015153861359d565b6024604051633250574960e11b815260006004820152fd5b359064ffffffffff8216820361063f57565b67ffffffffffffffff8111611ab95760051b60200190565b919082604091031261063f576040516137e78161349b565b60206138008183956137f8816134f5565b8552016137a5565b910152565b919082604091031261063f5760405161381d8161349b565b602080829461382b8161335b565b84520135910152565b91908110156138445760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160801b038116810361063f5790565b90815461387a816137b7565b9260409361388b60405191826134b7565b82815280946020809201926000526020600020906000935b8585106138b257505050505050565b600184819284516138c28161349b565b64ffffffffff87546001600160801b038116835260801c16838201528152019301940193916138a3565b906040516138f98161347f565b6040819360018154916001600160801b0392838116865260801c6020860152015416910152565b356001600160a01b038116810361063f5790565b35801515810361063f5790565b919061394e82828561355c565b803b61395b575b50505050565b6139b76001600160a01b03809216946040519384937f150b7a020000000000000000000000000000000000000000000000000000000096878652336004870152166024850152604484015260806064840152608483019061330a565b03906020816000938185885af190829082613a4d575b5050613a0457826139dc61457d565b80519190826139fd5760248260405190633250574960e11b82526004820152fd5b9050602001fd5b7fffffffff000000000000000000000000000000000000000000000000000000001603613a35575038808080613955565b60249060405190633250574960e11b82526004820152fd5b909192506020813d602011613aa6575b81613a6a602093836134b7565b81010312610ae65751907fffffffff000000000000000000000000000000000000000000000000000000008216820361064457509038806139cd565b3d9150613a5d565b8060005260036020526001600160a01b0360406000205416908115612971575090565b8051156138445760200190565b80518210156138445760209160051b010190565b64ffffffffff80421691600090808252602091600a602052613b166040822061386e565b9185856020613b2486613ad1565b5101511611613bfb5781526009602052604081208585825460c81c161115613be557506001600160801b039485613b5a84613ad1565b5151169583519260019360011015613bd15750949392919084602060408501510151169581866001985b161115613b95575050505050505090565b909181879881613ba98798999a8598613ade565b5151160116970191868087613bbe8689613ade565b5101511697829392919796959498613b84565b80634e487b7160e01b602492526032600452fd5b600201546001600160801b031695945050505050565b50935050505090565b806000526009602052604060002060ff600182015460a01c16600014613c2b575050600490565b805460f81c613c84575460a01c64ffffffffff164210613c7e57613c4e81613af2565b9060005260096020526001600160801b038060026040600020015416911610600014613c7957600190565b600290565b50600090565b5050600390565b916000828152602090600382526001600160a01b036040958187842054166009855260ff6001898620015460b01c16159081613dc6575b5080613dbb575b613da4579480967ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79596828552600386527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84838720541694859283613d6c575b169283613d56575b84875260038852808720846001600160a01b0319825416179055519580a4948152a1565b8387526004885280872060018154019055613d32565b613d8d86600052600560205260406000206001600160a01b03198154169055565b838852600489528488208054600019019055613d2a565b602486885190630da9b01360e01b82526004820152fd5b508181161515613cc9565b9050151538613cc2565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003613e0257565b60046040517fa1c0d6e5000000000000000000000000000000000000000000000000000000008152fd5b90613e4e6001600160801b0360408401511660206101008501510151906145f3565b6001600160801b0381511660e084015164ffffffffff60c08601511682156144ea5780156144c05781518015614496577f00000000000000000000000000000000000000000000000000000000000000008111614465575064ffffffffff6020613eb784613ad1565b5101511681101561440e5750600090819082815184905b80821061437d575050505064ffffffffff421664ffffffffff821681101561433d5750506001600160801b0316808203614306575050600754928360005260096020526040600020916001600160801b0381511660028401906fffffffffffffffffffffffffffffffff198254161790556001600160a01b036060830151166001840154750100000000000000000000000000000000000000000060808501511515918654937fffffffffffffffffff0000ff000000000000000000000000000000000000000076ff0000000000000000000000000000000000000000000060a0890151151560b01b16921617171760018601556001600160a01b0384511678ffffffffff000000000000000000000000000000000000000060c086015160a01b169060e0860151937fff000000000000000000000000000000000000000000000000000000000000007eff0000000000000000000000000000000000000000000000000000000000007dffffffffff00000000000000000000000000000000000000000000000000602061406a8951996000198b0190613ade565b51015160c81b169560f01b16911617171717845560005b818110614261575050600185016007556001600160a01b03602083015116801561378d576140b7866001600160a01b0392613c8b565b16614230576140e26001600160a01b036060840151166001600160801b0383511690309033906146cc565b6001600160801b0360208201511680614200575b507ffeb1cb9ce021c8bd5fb1eb836e6284c68866fa32d1d844238de19955238f807660206001600160a01b03845116926001600160a01b038286015116946001600160a01b03606082015116966141f56141d660808401511515928c60a086015115156001600160a01b0361010060e089015194549864ffffffffff6040519a61417f8c61349b565b818160a01c168c5260c81c168c8b015201515116956001600160801b036040519a8b9a610140958c5233828d01528281511660408d015201511660608a0152608089015260a08801528060c08801528601906133d5565b9260e08501906020908164ffffffffff91828151168552015116910152565b6101208301520390a4565b61422a906001600160a01b036060850151166001600160a01b0361010086015151169033906146cc565b386140f6565b60246040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152fd5b86600052600a60205260406000209061427e8160e0870151613ade565b51825468010000000000000000811015611ab9576001810180855581101561384457600193600052602060002001906001600160801b038151167fffffffffffffffffffffff00000000000000000000000000000000000000000074ffffffffff000000000000000000000000000000006020855494015160801b1692161717905501614081565b60449250604051917f6375ff1300000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b6040517f210aec0e00000000000000000000000000000000000000000000000000000000815264ffffffffff918216600482015291166024820152604490fd5b91935091936143a1906001600160801b036143988588613ade565b515116906145d8565b9364ffffffffff8060206143b58685613ade565b510151169416808511156143d157506001849301909291613ece565b8385606492604051927fd97494c6000000000000000000000000000000000000000000000000000000008452600484015260248301526044820152fd5b64ffffffffff602061441f84613ad1565b5101516040517ff1fb2cc500000000000000000000000000000000000000000000000000000000815264ffffffffff938416600482015291169091166024820152604490fd5b602490604051907f73627f740000000000000000000000000000000000000000000000000000000082526004820152fd5b60046040517f7ea4ccdf000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd572dbcb000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6095d3bc000000000000000000000000000000000000000000000000000000008152fd5b60009080825260036020526001600160a01b038060408420541692833314938415614559575b5050821561454757505090565b9091506145543392613509565b161490565b60ff929450906040918152600660205281812033825260205220541691388061453a565b3d156145a8573d9061458e826134d9565b9161459c60405193846134b7565b82523d6000602084013e565b606090565b6145d5906145ba81614797565b90600052600960205260026040600020015460801c9061352d565b90565b9190916001600160801b038080941691160191821161354657565b919091604051906146038261349b565b600091828152826020820152936001600160801b03928383169182156146ad5767016345785d8a0000808211614676575061463f8591846148ae565b16602087019281845211156146625750908261465d9251169061352d565b168252565b80634e487b7160e01b602492526001600452fd5b60449250604051917f4fea5c1a00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b50939450505050604051906146c18261349b565b808252602082015290565b9290604051927f23b872dd0000000000000000000000000000000000000000000000000000000060208501526001600160a01b03809216602485015216604483015260648201526064815260a081019181831067ffffffffffffffff841117611ab95761473b92604052614812565b565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b0392909216602483015260448083019390935291815261473b916147926064836134b7565b614812565b8060005260096020526147b060026040600020016138ec565b816000526009602052604060002060ff600182015460a01c166000146147e357506001600160801b039150602001511690565b5460f81c6147f557506145d590613af2565b6145d591506001600160801b03604081835116920151169061352d565b6001600160a01b03169061483d600080836020829551910182875af161483661457d565b908461495d565b908151918215159283614886575b5050506148555750565b602490604051907f5274afe70000000000000000000000000000000000000000000000000000000082526004820152fd5b819293509060209181010312610ae6576020015190811591821503610644575038808061484b565b9091906000198382098382029182808310920391808303921461494c57670de0b6b3a7640000908183101561491557947faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066994950990828211900360ee1b910360121c170290565b60449086604051917f5173648d00000000000000000000000000000000000000000000000000000000835260048301526024820152fd5b5050670de0b6b3a764000090049150565b9061499c575080511561497257805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b815115806149e7575b6149ad575090565b6024906001600160a01b03604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b156149a556fea164736f6c6343000817000a"; bytes public constant BYTECODE_NFT_DESCRIPTOR = hex"6080806040523461001757615f2090816200001d8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c63e9dc63751461002757600080fd5b346143a65760403660031901126143a6576001600160a01b0360043516600435036143a6576100566080614951565b60006080819052606060a081905260c082905260e0819052610120819052610140819052610160819052610180919091526101a0526004356001600160a01b03166101008190526100a690614a61565b61012052610100516040517feac8f5b80000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156143b3576000916148c0575b506001600160a01b03610117911680608052614c30565b60a052610100516040517fa80fc0710000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143b3576fffffffffffffffffffffffffffffffff916000916148a1575b501660c052610100516040517fad35efd40000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143b357600090614864575b6101e59150614d7d565b61014052610100516040517f4869e12d0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156143b357600091614835575b5060c0516fffffffffffffffffffffffffffffffff16801561481f576fffffffffffffffffffffffffffffffff61271081930216041661010060800152610287600435614e79565b6101206080015260405160208101904682526bffffffffffffffffffffffff1960043560601b1660408201526024356054820152605481526102c88161496e565b519020610405602963ffffffff6103156102ee8261016861ffff8860101c16061661570a565b91601e604660ff61030b8460146050848d60081c1606011661570a565b981606011661570a565b6040519485927f68736c28000000000000000000000000000000000000000000000000000000006020850152610355815180926020602488019101614909565b83017f2c000000000000000000000000000000000000000000000000000000000000006024820152610391825180936020602585019101614909565b7f252c000000000000000000000000000000000000000000000000000000000000602583830101526103cf8351809460206027868601019101614909565b01017f252900000000000000000000000000000000000000000000000000000000000060278201520360098101845201826149fa565b61043d6fffffffffffffffffffffffffffffffff6040608001511660ff6104366001600160a01b0360805116615091565b16906151fa565b6104516001600160a01b0360805116614a61565b60a051610100516040517fbc2be1be0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa80156143b357602491600091614800575b5060206001600160a01b03608080015116604051938480927f9067b677000000000000000000000000000000000000000000000000000000008252823560048301525afa80156143b357610513926000916147d1575b5064ffffffffff8091169116615545565b610120516101805190929161059d602161053a6064610533818706615a17565b950461570a565b6040519481610553879351809260208087019101614909565b82016105688251809360208085019101614909565b017f250000000000000000000000000000000000000000000000000000000000000060208201520360018101855201836149fa565b610100608001519260c060800151956101206080015197604051996105c18b614951565b8a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152604051806101c081011067ffffffffffffffff6101c083011117614402576101c0810160405260608152600060208201526000604082015260608082015260006080820152606060a0820152600060c0820152600060e08201526060610100820152600061012082015260006101408201526060610160820152600061018082015260006101a082015260a082015161069160c0840151845190615b23565b9061097861015c604051926106a5846149de565b600884527f50726f677265737300000000000000000000000000000000000000000000000060208501526106e86040516106de8161498a565b60008152866159eb565b156147c9576090945b6106fa8661570a565b916040519586938493661e339034b21e9160c91b6020860152610946835195869261072c846027840160208901614909565b6d11103334b6361e9111b33333111f60911b602785840101526c1e3932b1ba103bb4b23a341e9160991b603585840101526107738551809660206042888701019101614909565b7f22206865696768743d22313030222066696c6c2d6f7061636974793d222e3033828501860160428101919091527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e882015286519661087991889160f990910190602001614909565b661e17ba32bc3a1f60c91b8285018601870160f98101919091527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b61014082015287519761091491899161015190910190602001614909565b661e17ba32bc3a1f60c91b6101518888888887010101010152602061015888888885519c8d9701010101019101614909565b631e17b39f60e11b90860190910190910190910190910161015881019190915281900361013c810190915201826149fa565b6101008301526101208201526028610100830151604051906109998261498a565b60008252610c3f61015c604051926109b0846149de565b600684527f537461747573000000000000000000000000000000000000000000000000000060208501526109e384615e1f565b6109ec82615e9d565b808211156147c15750945b610a0287870161570a565b91604051958693661e339034b21e9160c91b60208601528151610a2c816027880160208601614909565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610a6f825180936020604285019101614909565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610b6b82518093602060f985019101614909565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610bfa82518093602061015185019101614909565b01661e17ba32bc3a1f60c91b610151820152610c2182518093602061015885019101614909565b01631e17b39f60e11b6101588201520361013c8101845201826149fa565b610160840152016101808201526028602083015160405190610c608261498a565b60008252610caa61015c60405192610c77846149de565b600684527f416d6f756e74000000000000000000000000000000000000000000000000000060208501526109e384615e1f565b8352016020820152610fe560808301516030604051610cc88161498a565b60008152610f6f61015c60405194610cdf866149de565b600886527f4475726174696f6e0000000000000000000000000000000000000000000000006020870152610d1286615e1f565b610d1b82615e9d565b808211156147b95750935b610d326028860161570a565b91604051978893661e339034b21e9160c91b60208601528151610d5c816027880160208601614909565b85016d11103334b6361e9111b33333111f60911b60278201526c1e3932b1ba103bb4b23a341e9160991b6035820152610d9f825180936020604285019101614909565b017f22206865696768743d22313030222066696c6c2d6f7061636974793d222e303360428201527f222072783d223135222072793d22313522207374726f6b653d2223666666222060628201527f7374726f6b652d6f7061636974793d222e3122207374726f6b652d77696474686082820152651e911a11179f60d11b60a28201527f3c7465787420783d2232302220793d2233342220666f6e742d66616d696c793d60a88201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f7370616365222060c8820152703337b73a16b9b4bd329e911919383c111f60791b60e8820152610e9b82518093602060f985019101614909565b01661e17ba32bc3a1f60c91b60f98201527f3c7465787420783d2232302220793d2237322220666f6e742d66616d696c793d6101008201527f2227436f7572696572204e6577272c417269616c2c6d6f6e6f73706163652220610120820152703337b73a16b9b4bd329e91191b383c111f60791b610140820152610f2a82518093602061015185019101614909565b01661e17ba32bc3a1f60c91b610151820152610f5182518093602061015885019101614909565b01631e17b39f60e11b6101588201520361013c8101865201846149fa565b8260a08601526028810160c0860152602085015190610120860151809161018088015192839185010101605881016080890152605719906103e8030160011c8061014089015201601081016101a088015201602081016040870152010160e0840152610100830151610160840151845191615190565b6060820152604051908161010081011067ffffffffffffffff6101008401111761440257610100820160405260c782527f3c726563742077696474683d223130302522206865696768743d22313030252260208301527f2066696c7465723d2275726c28234e6f69736529222f3e3c7265637420783d2260408301527f37302220793d223730222077696474683d2238363022206865696768743d223860608301527f3630222066696c6c3d2223666666222066696c6c2d6f7061636974793d222e3060808301527f33222072783d223435222072793d22343522207374726f6b653d22236666662260a08301527f207374726f6b652d6f7061636974793d222e3122207374726f6b652d7769647460c08301527f683d2234222f3e0000000000000000000000000000000000000000000000000060e08301528251916101008401519160608101519460405161113b816149a6565b603381527f3c636972636c652069643d22476c6f772220723d22353030222066696c6c3d2260208201527f75726c282352616469616c476c6f7729222f3e0000000000000000000000000060408201526040519661119888614951565b61011c88527f3c66696c7465722069643d224e6f697365223e3c6665466c6f6f6420783d223060208901527f2220793d2230222077696474683d223130302522206865696768743d2231303060408901527f252220666c6f6f642d636f6c6f723d2268736c283233302c3231252c3131252960608901527f2220666c6f6f642d6f7061636974793d22312220726573756c743d22666c6f6f60808901527f6446696c6c222f3e3c666554757262756c656e6365206261736546726571756560a08901527f6e63793d222e3422206e756d4f6374617665733d22332220726573756c743d2260c08901527f4e6f6973652220747970653d226672616374616c4e6f697365222f3e3c66654260e08901527f6c656e6420696e3d224e6f6973652220696e323d22666c6f6f6446696c6c22206101008901527f6d6f64653d22736f66742d6c69676874222f3e3c2f66696c7465723e0000000061012089015260405197886103a081011067ffffffffffffffff6103a08b011117614402576103a0890160405261037b89527f3c706174682069643d224c6f676f222066696c6c3d2223666666222066696c6c60208a01527f2d6f7061636974793d222e312220643d226d3133332e3535392c3132342e303360408a01527f34632d2e3031332c322e3431322d312e3035392c342e3834382d322e3932332c60608a01527f362e3430322d322e3535382c312e3831392d352e3136382c332e3433392d372e60808a01527f3838382c342e3939362d31342e34342c382e3236322d33312e3034372c31322e60a08a01527f3536352d34372e3637342c31322e3536392d382e3835382e3033362d31372e3860c08a01527f33382d312e3237322d32362e3332382d332e3636332d392e3830362d322e373660e08a01527f362d31392e3038372d372e3131332d32372e3536322d31322e3737382d31332e6101008a01527f3834322d382e3032352c392e3436382d32382e3630362c31362e3135332d33356101208a01527f2e323635683063322e3033352d312e3833382c342e3235322d332e3534362c366101408a01527f2e3436332d352e323234683063362e3432392d352e3635352c31362e3231382d6101608a01527f322e3833352c32302e3335382c342e31372c342e3134332c352e3035372c382e6101808a01527f3831362c392e3634392c31332e39322c31332e373334682e30333763352e37336101a08a01527f362c362e3436312c31352e3335372d322e3235332c392e33382d382e34382c306101c08a01527f2c302d332e3531352d332e3531352d332e3531352d332e3531352d31312e34396101e08a01527f2d31312e3437382d35322e3635362d35322e3636342d36342e3833372d36342e6102008a01527f3833376c2e3034392d2e303337632d312e3732352d312e3630362d322e3731396102208a01527f2d332e3834372d322e3735312d362e3230346830632d2e3034362d322e3337356102408a01527f2c312e3036322d342e3538322c322e3732362d362e32323968306c2e3138352d6102608a01527f2e3134386830632e3039392d2e3036322c2e3232322d2e3134382c2e33372d2e6102808a01527f323539683063322e30362d312e3336322c332e3935312d322e3632312c362e306102a08a01527f34342d332e3834324335372e3736332d332e3437332c39372e37362d322e33346102c08a01527f312c3132382e3633372c31382e3333326331362e3637312c392e3934362d32366102e08a01527f2e3334342c35342e3831332d33382e3635312c34302e3139392d362e3239392d6103008a01527f362e3039362d31382e3036332d31372e3734332d31392e3636382d31382e38316103208a01527f312d362e3031362d342e3034372d31332e3036312c342e3737362d372e3735326103408a01527f2c392e3735316c36382e3235342c36382e33373163312e3732342c312e3630316103608a01527f2c322e3731342c332e38342c322e3733382c362e3139325a222f3e00000000006103808a0152604051978860a081011067ffffffffffffffff60a08b01111761440257611c76611cd79160a08b0160405260758b527f3c706174682069643d22466c6f6174696e6754657874222066696c6c3d226e6f60208c01527f6e652220643d224d31323520343568373530733830203020383020383076373560408c01527f307330203830202d3830203830682d373530732d38302030202d3830202d383060608c01527f762d3735307330202d3830203830202d3830222f3e000000000000000000000060808c015261182d615aea565b906040517f3c72616469616c4772616469656e742069643d2252616469616c476c6f77223e6020820152611cd260d87f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d22000093846040850152805161195f60b886602085019361189f81605e840187614909565b8101997f222073746f702d6f7061636974793d222e36222f3e0000000000000000000000605e8c01527f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d229a8b6073820152611904825180936020609385019101614909565b017f222073746f702d6f7061636974793d2230222f3e00000000000000000000000060938201527f3c2f72616469616c4772616469656e743e00000000000000000000000000000060a78201520360988101885201866149fa565b611967615aea565b90604051967f3c6c696e6561724772616469656e742069643d2253616e64546f70222078313d60208901527f223025222079313d223025223e000000000000000000000000000000000000006040890152604d88015282516119cd81606b8a0184614909565b8701917f222f3e00000000000000000000000000000000000000000000000000000000009283606b82015289606e820152611a12825180936020608e85019101614909565b019082608e830152611a5660a2897f3c2f6c696e6561724772616469656e743e0000000000000000000000000000009485609182015203608281018b5201896149fa565b611b9c610108611a64615aea565b6040519b8c917f3c6c696e6561724772616469656e742069643d2253616e64426f74746f6d222060208401527f78313d2231303025222079313d2231303025223e00000000000000000000000060408401527f3c73746f70206f66667365743d22313025222073746f702d636f6c6f723d22006054840152611af0815180926020607387019101614909565b8201908760738301526076820152875190611b0f826096830188614909565b018660968201527f3c616e696d617465206174747269627574654e616d653d22783122206475723d60998201527f2236732220726570656174436f756e743d22696e646566696e6974652220766160b98201527f6c7565733d223330253b3630253b313230253b3630253b3330253b222f3e000060d98201528560f78201520360e881018c52018a6149fa565b611ba4615aea565b906040519a8b957f3c6c696e6561724772616469656e742069643d22486f7572676c61737353747260208801527f6f6b6522206772616469656e745472616e73666f726d3d22726f74617465283960408801527f302922206772616469656e74556e6974733d227573657253706163654f6e557360608801527f65223e000000000000000000000000000000000000000000000000000000000060808801527f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2200608388015251809260a2880190614909565b84018360a28201527f3c73746f70206f66667365743d22383025222073746f702d636f6c6f723d220060a5820152611cb882518093602060c485019101614909565b019160c483015260c78201520360b88101875201856149fa565b615190565b92611ce9611ce3614d0b565b896159eb565b97881561479e575b50604051611cfe816149c2565b609081527f3c7061746820643d224d2035302c3336302061203330302c333030203020312c60208201527f31203630302c302061203330302c333030203020312c31202d3630302c30222060408201527f66696c6c3d2223666666222066696c6c2d6f7061636974793d222e303222207360608201527f74726f6b653d2275726c2823486f7572676c6173735374726f6b65292220737460808201527f726f6b652d77696474683d2234222f3e0000000000000000000000000000000060a082015260405193846102c081011067ffffffffffffffff6102c087011117614402576102c0850160405261029885527f3c7061746820643d226d3536362c3136312e323031762d35332e39323463302d60208601527f31392e3338322d32322e3531332d33372e3536332d36332e3339382d35312e3160408601527f39382d34302e3735362d31332e3539322d39342e3934362d32312e3037392d3160608601527f35322e3538372d32312e303739732d3131312e3833382c372e3438372d31353260808601527f2e3630322c32312e303739632d34302e3839332c31332e3633362d36332e343160a08601527f332c33312e3831362d36332e3431332c35312e3139387635332e39323463302c60c08601527f31372e3138312c31372e3730342c33332e3432372c35302e3232332c34362e3360e08601527f3934763238342e383039632d33322e3531392c31322e39362d35302e3232332c6101008601527f32392e3230362d35302e3232332c34362e3339347635332e39323463302c31396101208601527f2e3338322c32322e35322c33372e3536332c36332e3431332c35312e3139382c6101408601527f34302e3736332c31332e3539322c39342e3935342c32312e3037392c3135322e6101608601527f3630322c32312e303739733131312e3833312d372e3438372c3135322e3538376101808601527f2d32312e3037396334302e3838362d31332e3633362c36332e3339382d33312e6101a08601527f3831362c36332e3339382d35312e313938762d35332e39323463302d31372e316101c08601527f39362d31372e3730342d33332e3433352d35302e3232332d34362e34303156326101e08601527f30372e3630336333322e3531392d31322e3936372c35302e3232332d32392e326102008601527f30362c35302e3232332d34362e3430315a6d2d3334372e3436322c35372e37396102208601527f336c3133302e3935392c3133312e3032372d3133302e3935392c3133312e30316102408601527f33563231382e3939345a6d3236322e3932342e303232763236322e3031386c2d6102608601527f3133302e3933372d3133312e3030362c3133302e3933372d3133312e3031335a6102808601527f222066696c6c3d2223313631383232223e3c2f706174683e00000000000000006102a0860152896000146145795760405161212c8161498a565b60008152995b1561441857604051806101e081011067ffffffffffffffff6101e083011117614402576101e081016040526101b181527f3c7061746820643d226d3438312e34362c3438312e35347638312e3031632d3260208201527f2e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e332c60408201527f382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d353360608201527f2e362c302d3130312e32342d362e33332d3133312e34372d31362e3136762d3860808201527f316c34362e332d34362e3331683137302e33336c34362e32392c34362e33315a60a08201527f222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7061746860c08201527f20643d226d3433352e31372c3433352e323363302c312e31372d2e34362c322e60e08201527f33322d312e33332c332e34342d372e31312c392e30382d34312e39332c31352e6101008201527f39382d38332e38312c31352e3938732d37362e372d362e392d38332e38322d316101208201527f352e3938632d2e38372d312e31322d312e33332d322e32372d312e33332d332e6101408201527f3434762d2e30346c382e33342d382e33352e30312d2e30316331332e37322d366101608201527f2e35312c34322e39352d31312e30322c37362e382d31312e30327336322e39376101808201527f2c342e34392c37362e37322c31316c382e34322c382e34325a222066696c6c3d6101a08201527f2275726c282353616e64546f7029222f3e0000000000000000000000000000006101c0820152995b60405196876107e081011067ffffffffffffffff6107e08a01111761440257613b3f9c612dfa6036602d9960819f97631e17b39f60e11b8d7f3c2f646566733e000000000000000000000000000000000000000000000000009a612ecb9f6107e0016040526107a782527f3c672066696c6c3d226e6f6e6522207374726f6b653d2275726c2823486f757260208301527f676c6173735374726f6b652922207374726f6b652d6c696e656361703d22726f60408301527f756e6422207374726f6b652d6d697465726c696d69743d22313022207374726f60608301527f6b652d77696474683d2234223e3c7061746820643d226d3536352e3634312c3160808301527f30372e323863302c392e3533372d352e35362c31382e3632392d31352e36373660a08301527f2c32362e393733682d2e303233632d392e3230342c372e3539362d32322e313960c08301527f342c31342e3536322d33382e3139372c32302e3539322d33392e3530342c313460e08301527f2e3933362d39372e3332352c32342e3335352d3136312e3733332c32342e33356101008301527f352d39302e34382c302d3136372e3934382d31382e3538322d3139392e3935336101208301527f2d34342e393438682d2e303233632d31302e3131352d382e3334342d31352e366101408301527f37362d31372e3433372d31352e3637362d32362e3937332c302d33392e3733356101608301527f2c39362e3535342d37312e3932312c3231352e3635322d37312e3932317332316101808301527f352e3632392c33322e3138352c3231352e3632392c37312e3932315a222f3e3c6101a08301527f7061746820643d226d3133342e33362c3136312e32303363302c33392e3733356101c08301527f2c39362e3535342c37312e3932312c3231352e3635322c37312e3932317332316101e08301527f352e3632392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c6102008301527f696e652078313d223133342e3336222079313d223136312e323033222078323d6102208301527f223133342e3336222079323d223130372e3238222f3e3c6c696e652078313d226102408301527f3536352e3634222079313d223136312e323033222078323d223536352e3634226102608301527f2079323d223130372e3238222f3e3c6c696e652078313d223138342e353834226102808301527f2079313d223230362e383233222078323d223138342e353835222079323d22356102a08301527f33372e353739222f3e3c6c696e652078313d223231382e313831222079313d226102c08301527f3231382e313138222078323d223231382e313831222079323d223536322e35336102e08301527f37222f3e3c6c696e652078313d223438312e383138222079313d223231382e316103008301527f3432222078323d223438312e383139222079323d223536322e343238222f3e3c6103208301527f6c696e652078313d223531352e343135222079313d223230372e3335322220786103408301527f323d223531352e343136222079323d223533372e353739222f3e3c70617468206103608301527f643d226d3138342e35382c3533372e353863302c352e34352c342e32372c31306103808301527f2e36352c31322e30332c31352e3432682e303263352e35312c332e33392c31326103a08301527f2e37392c362e35352c32312e35352c392e34322c33302e32312c392e392c37386103c08301527f2e30322c31362e32382c3133312e38332c31362e32382c34392e34312c302c396103e08301527f332e37362d352e33382c3132342e30362d31332e39322c322e372d2e37362c356104008301527f2e32392d312e35342c372e37352d322e33352c382e37372d322e38372c31362e6104208301527f30352d362e30342c32312e35362d392e3433683063372e37362d342e37372c316104408301527f322e30342d392e39372c31322e30342d31352e3432222f3e3c7061746820643d6104608301527f226d3138342e3538322c3439322e363536632d33312e3335342c31322e3438356104808301527f2d35302e3232332c32382e35382d35302e3232332c34362e3134322c302c392e6104a08301527f3533362c352e3536342c31382e3632372c31352e3637372c32362e393639682e6104c08301527f30323263382e3530332c372e3030352c32302e3231332c31332e3436332c33346104e08301527f2e3532342c31392e3135392c392e3939392c332e3939312c32312e3236392c376105008301527f2e3630392c33332e3539372c31302e3738382c33362e34352c392e3430372c386105208301527f322e3138312c31352e3030322c3133312e3833352c31352e3030327339352e336105408301527f36332d352e3539352c3133312e3830372d31352e3030326331302e3834372d326105608301527f2e37392c32302e3836372d352e3932362c32392e3932342d392e3334392c312e6105808301527f3234342d2e3436372c322e3437332d2e3934322c332e3637332d312e3432342c6105a08301527f31342e3332362d352e3639362c32362e3033352d31322e3136312c33342e35326105c08301527f342d31392e313733682e3032326331302e3131342d382e3334322c31352e36376105e08301527f372d31372e3433332c31352e3637372d32362e3936392c302d31372e3536322d6106008301527f31382e3836392d33332e3636352d35302e3232332d34362e3135222f3e3c70616106208301527f746820643d226d3133342e33362c3539322e373263302c33392e3733352c39366106408301527f2e3535342c37312e3932312c3231352e3635322c37312e393231733231352e366106608301527f32392d33322e3138362c3231352e3632392d37312e393231222f3e3c6c696e656106808301527f2078313d223133342e3336222079313d223539322e3732222078323d223133346106a08301527f2e3336222079323d223533382e373937222f3e3c6c696e652078313d223536356106c08301527f2e3634222079313d223539322e3732222078323d223536352e3634222079323d6106e08301527f223533382e373937222f3e3c706f6c796c696e6520706f696e74733d223438316107008301527f2e383232203438312e393031203438312e373938203438312e383737203438316107208301527f2e373735203438312e383534203335302e303135203335302e303236203231386107408301527f2e313835203231382e313239222f3e3c706f6c796c696e6520706f696e74733d6107608301527f223231382e313835203438312e393031203231382e323331203438312e3835346107808301527f203335302e303135203335302e303236203438312e383232203231382e3135326107a08301527f222f3e3c2f673e000000000000000000000000000000000000000000000000006107c0830152604051998a957f3c672069643d22486f7572676c617373223e00000000000000000000000000006020880152603295612d968151809260208a8c019101614909565b8701612dab8251809360208a85019101614909565b01612dbf8251809360208985019101614909565b01612dd38251809360208885019101614909565b01612de78251809360208785019101614909565b01918201520360168101865201846149fa565b6040519e8f9788977f3c646566733e000000000000000000000000000000000000000000000000000060208a0152612e3f6026998260208c9451948593019101614909565b8901612e548251809360208c85019101614909565b01612e688251809360208b85019101614909565b01612e7c8251809360208a85019101614909565b01612e908251809360208985019101614909565b01612ea48251809360208885019101614909565b01612eb88251809360208785019101614909565b019182015203600d8101895201876149fa565b61375e604c60e0830151610120840151936134ba6130ed6060604084015193015196612ef78186615d63565b946130e861012b604051612f0a816149de565b600581527f2d3130302500000000000000000000000000000000000000000000000000000060208201526040519889917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152612f74815180926020603787019101614909565b7f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666683820160378101919091527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201528251926130b891849161012090910190602001614909565b6a1e17ba32bc3a2830ba341f60a91b90830190910161012081019190915281900361010b810190915201876149fa565b615d63565b956132cc61012b604051613100816149de565b600281527f30250000000000000000000000000000000000000000000000000000000000006020820152604051998a917f3c74657874506174682073746172744f66667365743d22000000000000000000602084015261316a815180926020603787019101614909565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e0000000000000000006101098201526132a782518093602061012085019101614909565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b81018a5201886149fa565b6132d68184615dcb565b926134b561012b6040516132e9816149de565b600481527f2d3530250000000000000000000000000000000000000000000000000000000060208201526040519687917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613353815180926020603787019101614909565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261349082518093602061012085019101614909565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101875201856149fa565b615dcb565b9061369961012b6040516134cd816149de565b600381527f353025000000000000000000000000000000000000000000000000000000000060208201526040519485917f3c74657874506174682073746172744f66667365743d220000000000000000006020840152613537815180926020603787019101614909565b82017f2220687265663d2223466c6f6174696e6754657874222066696c6c3d2223666660378201527f662220666f6e742d66616d696c793d2227436f7572696572204e6577272c417260578201527f69616c2c6d6f6e6f7370616365222066696c6c2d6f7061636974793d222e3822607782015271103337b73a16b9b4bd329e91191b383c111f60711b60978201527f3c616e696d6174652061646469746976653d2273756d2220617474726962757460a98201527f654e616d653d2273746172744f66667365742220626567696e3d22307322206460c98201527f75723d22353073222066726f6d3d2230252220726570656174436f756e743d2260e98201527f696e646566696e6974652220746f3d2231303025222f3e00000000000000000061010982015261367482518093602061012085019101614909565b016a1e17ba32bc3a2830ba341f60a91b6101208201520361010b8101855201836149fa565b6040519586937f3c7465787420746578742d72656e646572696e673d226f7074696d697a65537060208601527f656564223e00000000000000000000000000000000000000000000000000000060408601526136ff815180926020604589019101614909565b8401613715825180936020604585019101614909565b0161372a825180936020604585019101614909565b0161373f825180936020604585019101614909565b01661e17ba32bc3a1f60c91b604582015203602c8101845201826149fa565b613a3e61019a6101408401516101a08501519061379f61379961379361378d60e060408b01519a01519461570a565b9461570a565b9761570a565b9161570a565b956040519687937f3c75736520687265663d2223476c6f77222066696c6c2d6f7061636974793d2260208601527f2e39222f3e00000000000000000000000000000000000000000000000000000060408601527f3c75736520687265663d2223476c6f772220783d22313030302220793d22313060458601527f3030222066696c6c2d6f7061636974793d222e39222f3e00000000000000000060658601527f3c75736520687265663d22234c6f676f2220783d223137302220793d22313730607c8601527f22207472616e73666f726d3d227363616c65282e3629222f3e3c757365206872609c8601527f65663d2223486f7572676c6173732220783d223135302220793d22393022207460bc8601527f72616e73666f726d3d22726f746174652831302922207472616e73666f726d2d60dc8601527f6f726967696e3d2235303020353030222f3e000000000000000000000000000060fc8601527f3c75736520687265663d222350726f67726573732220783d220000000000000061010e8601526101279061393a815180926020858a019101614909565b8501937f2220793d22373930222f3e00000000000000000000000000000000000000000080948180948801527f3c75736520687265663d22235374617475732220783d22000000000000000000610132880152610149966139a48251809360208b85019101614909565b01958601527f3c75736520687265663d2223416d6f756e742220783d2200000000000000000061015486015261016b946139e78251809360208985019101614909565b01938401527f3c75736520687265663d22234475726174696f6e2220783d220000000000000061017684015261018f92613a2a8251809360208785019101614909565b01918201520361017a8101855201836149fa565b6040519586937f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060208601527f30302f737667222077696474683d223130303022206865696768743d2231303060408601527f30222076696577426f783d2230203020313030302031303030223e00000000006060860152613aca815180926020607b89019101614909565b8401613ae0825180936020607b85019101614909565b01613af5825180936020607b85019101614909565b01613b0a825180936020607b85019101614909565b017f3c2f7376673e0000000000000000000000000000000000000000000000000000607b8201520360618101845201826149fa565b6101605260a051610100516040517fb971302a0000000000000000000000000000000000000000000000000000000081526024803560048301529091602091839182906001600160a01b03165afa9081156143b3576000916143bf575b506089613bab613ccd92614a61565b9260c0608001516040519485927f5b7b2274726169745f74797065223a224173736574222c2276616c7565223a226020850152613bf2815180926020604088019101614909565b8301907f227d2c7b2274726169745f74797065223a2253656e646572222c2276616c756560408301527f223a22000000000000000000000000000000000000000000000000000000000091826060820152613c57825180936020606385019101614909565b01907f227d2c7b2274726169745f74797065223a22537461747573222c2276616c756560638301526083820152613c98825180936020608685019101614909565b017f227d5d000000000000000000000000000000000000000000000000000000000060868201520360698101845201826149fa565b6101a05160a051610120516080519193929091613cf2906001600160a01b0316614a61565b91613cfe60243561570a565b92602460206001600160a01b03608080015116604051928380927fb2564569000000000000000000000000000000000000000000000000000000008252823560048301525afa9081156143b357600091614369575b50936142dd9661406560e361426c966094966142769a9661417b9a6000146142e157604051613d81816149c2565b609b81527fe29aa0efb88f205741524e494e473a205472616e7366657272696e672074686560208201527f204e4654206d616b657320746865206e6577206f776e6572207468652072656360408201527f697069656e74206f66207468652073747265616d2e205468652066756e64732060608201527f617265206e6f74206175746f6d61746963616c6c792077697468647261776e2060808201527f666f72207468652070726576696f757320726563697069656e742e000000000060a0820152915b60405197889461400160208701997f54686973204e465420726570726573656e74732061207061796d656e742073748b527f7265616d20696e2061205361626c696572205632200000000000000000000000604089015282516020840190613eb18160558c0184614909565b8901947f20636f6e74726163742e20546865206f776e6572206f662074686973204e465460558701527f2063616e207769746864726177207468652073747265616d656420617373657460758701527f732c207768696368206172652064656e6f6d696e6174656420696e2000000000609587015282516020840196613f3b8260b183018a614909565b017f2e5c6e5c6e2d2053747265616d2049443a20000000000000000000000000000060b1820152613f7682518093602060c385019101614909565b01613faf7f5c6e2d2000000000000000000000000000000000000000000000000000000000958660c384015251809360c7840190614909565b01947f20416464726573733a2000000000000000000000000000000000000000000000958660c7820152613fed82518093602060d185019101614909565b019260d184015251809360d5840190614909565b019060d582015261401c82518093602060df85019101614909565b017f5c6e5c6e0000000000000000000000000000000000000000000000000000000060df8201526140568251809360208785019101614909565b010360c38101855201836149fa565b6101a051906141d661407860243561570a565b916140f7602d604051809560208201976a029b0b13634b2b9102b19160ad1b89526140ad815180926020602b87019101614909565b82017f2023000000000000000000000000000000000000000000000000000000000000602b8201526140e88251809360208785019101614909565b0103600d8101865201846149fa565b610160516141049061585b565b94604051998a977f7b2261747472696275746573223a00000000000000000000000000000000000060208a0152614145815180926020602e8d019101614909565b8801917f2c226465736372697074696f6e223a2200000000000000000000000000000000602e840152518093603e840190614909565b01917f222c2265787465726e616c5f75726c223a2268747470733a2f2f7361626c6965603e8401527f722e636f6d222c226e616d65223a220000000000000000000000000000000000605e840152518093606d840190614909565b017f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b6261606d8201527f736536342c000000000000000000000000000000000000000000000000000000608d820152614237825180936020609285019101614909565b017f227d00000000000000000000000000000000000000000000000000000000000060928201520360748101845201826149fa565b60e081905261585b565b6142c9603d60405180937f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208301526142b98151809260208686019101614909565b810103601d8101845201826149fa565b60405191829160208352602083019061492c565b0390f35b6040516142ed8161496e565b605b81527fe29d95494e464f3a2054686973204e4654206973206e6f6e2d7472616e73666560208201527f7261626c652e2049742063616e6e6f7420626520736f6c64206f72207472616e60408201527f7366657272656420746f20616e6f74686572206163636f756e742e0000000000606082015291613e45565b90506020959195813d6020116143ab575b81614387602093836149fa565b810103126143a657519384151585036143a657909490936142dd613d53565b600080fd5b3d915061437a565b6040513d6000823e3d90fd5b90506020813d6020116143fa575b816143da602093836149fa565b810103126143a657516001600160a01b03811681036143a6576089613b9c565b3d91506143cd565b634e487b7160e01b600052604160045260246000fd5b6040518061012081011067ffffffffffffffff6101208301111761440257610120810160405260f881527f3c7061746820643d226d3438312e34362c3530342e3130317635382e3434396360208201527f2d322e33352e37372d342e38322c312e35312d372e33392c322e32332d33302e60408201527f332c382e35342d37342e36352c31332e39322d3132342e30362c31332e39322d60608201527f35332e362c302d3130312e32342d362e33332d3133312e34372d31362e31367660808201527f2d35382e343339683236322e39325a222066696c6c3d2275726c282353616e6460a08201527f426f74746f6d29222f3e3c656c6c697073652063783d22333530222063793d2260c08201527f3530342e313031222072783d223133312e343632222072793d2232382e31303860e08201527f222066696c6c3d2275726c282353616e64546f7029222f3e00000000000000006101008201529961237f565b604051806101c081011067ffffffffffffffff6101c083011117614402576101c0810160405261019981527f3c706f6c79676f6e20706f696e74733d22333530203335302e3032362034313560208201527f2e3033203238342e39373820323835203238342e39373820333530203335302e60408201527f303236222066696c6c3d2275726c282353616e64426f74746f6d29222f3e3c7060608201527f61746820643d226d3431362e3334312c3238312e39373563302c2e3931342d2e60808201527f3335342c312e3830392d312e3033352c322e36382d352e3534322c372e30373660a08201527f2d33322e3636312c31322e34352d36352e32382c31322e34352d33322e36323460c08201527f2c302d35392e3733382d352e3337342d36352e32382d31322e34352d2e36383160e08201527f2d2e3837322d312e3033352d312e3736372d312e3033352d322e36382c302d2e6101008201527f3931342e3335342d312e3830382c312e3033352d322e3637362c352e3534322d6101208201527f372e3037362c33322e3635362d31322e34352c36352e32382d31322e34352c336101408201527f322e3631392c302c35392e3733382c352e3337342c36352e32382c31322e34356101608201527f2e3638312e3836372c312e3033352c312e3736322c312e3033352c322e3637366101808201527f5a222066696c6c3d2275726c282353616e64546f7029222f3e000000000000006101a082015299612132565b6147b29198506147ac614d44565b906159eb565b9638611cf1565b905093610d26565b9050946109f7565b60d0946106f1565b6147f3915060203d6020116147f9575b6147eb81836149fa565b810190614a44565b38610502565b503d6147e1565b614819915060203d6020116147f9576147eb81836149fa565b386104ac565b634e487b7160e01b600052601260045260246000fd5b614857915060203d60201161485d575b61484f81836149fa565b810190614a1c565b3861023f565b503d614845565b506020813d602011614899575b8161487e602093836149fa565b810103126143a6575160058110156143a6576101e5906101db565b3d9150614871565b6148ba915060203d60201161485d5761484f81836149fa565b38610181565b90506020813d602011614901575b816148db602093836149fa565b810103126143a657516001600160a01b03811681036143a6576001600160a01b03610100565b3d91506148ce565b60005b83811061491c5750506000910152565b818101518382015260200161490c565b9060209161494581518092818552858086019101614909565b601f01601f1916010190565b610140810190811067ffffffffffffffff82111761440257604052565b6080810190811067ffffffffffffffff82111761440257604052565b6020810190811067ffffffffffffffff82111761440257604052565b6060810190811067ffffffffffffffff82111761440257604052565b60c0810190811067ffffffffffffffff82111761440257604052565b6040810190811067ffffffffffffffff82111761440257604052565b90601f8019910116810190811067ffffffffffffffff82111761440257604052565b908160209103126143a657516fffffffffffffffffffffffffffffffff811681036143a65790565b908160209103126143a6575164ffffffffff811681036143a65790565b6001600160a01b03168060405191614a78836149a6565b602a8352602083016040368237835115614b6c5760309053825160019060011015614b6c57607860218501536029905b808211614af1575050614ab9575090565b604490604051907fe22e27eb000000000000000000000000000000000000000000000000000000008252600482015260146024820152fd5b9091600f81166010811015614b57577f3031323334353637383961626364656600000000000000000000000000000000901a614b2d84876159da565b5360041c918015614b42576000190190614aa8565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b634e487b7160e01b600052603260045260246000fd5b67ffffffffffffffff811161440257601f01601f191660200190565b3d15614bc9573d90614baf82614b82565b91614bbd60405193846149fa565b82523d6000602084013e565b606090565b6020818303126143a65780519067ffffffffffffffff82116143a6570181601f820112156143a6578051614c0181614b82565b92614c0f60405194856149fa565b818452602082840101116143a657614c2d9160208085019101614909565b90565b6000809160405160208101906395d89b4160e01b825260048152614c53816149de565b51915afa614c5f614b9e565b90158015614cff575b614cc55780602080614c7f93518301019101614bce565b601e815111600014614c2d5750604051614c98816149de565b600b81527f4c6f6e672053796d626f6c000000000000000000000000000000000000000000602082015290565b50604051614cd2816149de565b600581527f4552433230000000000000000000000000000000000000000000000000000000602082015290565b50604081511115614c68565b60405190614d18826149de565b600782527f536574746c6564000000000000000000000000000000000000000000000000006020830152565b60405190614d51826149de565b600882527f4465706c657465640000000000000000000000000000000000000000000000006020830152565b6005811015614e635760048103614d975750614c2d614d44565b60038103614dd95750604051614dac816149de565b600881527f43616e63656c6564000000000000000000000000000000000000000000000000602082015290565b60018103614e1b5750604051614dee816149de565b600981527f53747265616d696e670000000000000000000000000000000000000000000000602082015290565b600203614e2a57614c2d614d0b565b604051614e36816149de565b600781527f50656e64696e6700000000000000000000000000000000000000000000000000602082015290565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b031660408051916395d89b4160e01b8352600083600481845afa92831561508657600093615063575b50815192614eb6846149de565b60118452614eeb6020947f5341422d56322d4c4f434b55502d4c494e00000000000000000000000000000086820152826159eb565b15614f295750507f4c6f636b7570204c696e65617200000000000000000000000000000000000000905191614f1f836149de565b600d835282015290565b614f668351614f37816149de565b601181527f5341422d56322d4c4f434b55502d44594e00000000000000000000000000000086820152826159eb565b15614fa45750507f4c6f636b75702044796e616d6963000000000000000000000000000000000000905191614f9a836149de565b600e835282015290565b614fe18351614fb2816149de565b601181527f5341422d56322d4c4f434b55502d54524100000000000000000000000000000086820152826159eb565b1561501f5750507f4c6f636b7570205472616e636865640000000000000000000000000000000000905191615015836149de565b600f835282015290565b61505f9083519384937f814a8a2e00000000000000000000000000000000000000000000000000000000855260048501526024840152604483019061492c565b0390fd5b61507f91933d8091833e61507781836149fa565b810190614bce565b9138614ea9565b82513d6000823e3d90fd5b60405160208101907f313ce567000000000000000000000000000000000000000000000000000000008252600481526150c9816149de565b6000928392839251915afa6150dc614b9e565b9080615113575b1561510f5760208180518101031261510b57602001519060ff82168203615108575090565b80fd5b5080fd5b5090565b5060208151146150e3565b6040519061512b826149de565b600482527f2667743b000000000000000000000000000000000000000000000000000000006020830152565b60405190615164826149de565b600482527f266c743b000000000000000000000000000000000000000000000000000000006020830152565b906151f89294936040519586926020946151b281518092888089019101614909565b84016151c682518093888085019101614909565b016151d982518093878085019101614909565b016151ec82518093868085019101614909565b010380855201836149fa565b565b801561550a57600091806154e5575090505b600190808281101561527657505050615223615157565b614c2d602260405183615240829551809260208086019101614909565b81017f203100000000000000000000000000000000000000000000000000000000000060208201520360028101845201826149fa565b66038d7ea4c6800011156154885760409081519060a0820182811067ffffffffffffffff821117614402578084526152ad8161498a565b6000815282528251906152bf826149de565b8482526020917f4b00000000000000000000000000000000000000000000000000000000000000838201528284015283516152f9816149de565b8581527f4d0000000000000000000000000000000000000000000000000000000000000083820152848401528351615330816149de565b8581527f42000000000000000000000000000000000000000000000000000000000000008382015260608401528351615368816149de565b8581527f5400000000000000000000000000000000000000000000000000000000000000838201526080840152600091856000965b61545c575b508451946153af866149de565b600790600787527f2623383830353b0000000000000000000000000000000000000000000000000083880152519560005b828110615449575050505061542a615430917f2000000000000000000000000000000000000000000000000000000000000000602787015260088652615425866149de565b61570a565b91615a17565b916005851015614b6c57614c2d9460051b015192615190565b81810184015188820185015283016153e0565b9591926103e89081851061547f57508680916064600a870406950493019661539d565b939296506153a2565b505061549261511e565b614c2d6028604051836154af829551809260208086019101614909565b81017f203939392e39395400000000000000000000000000000000000000000000000060208201520360088101845201826149fa565b600a0a9182156154f657500461520c565b80634e487b7160e01b602492526012600452fd5b5050604051615518816149de565b600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b62015180910304806155ad575061555a615157565b614c2d602660405183615577829551809260208086019101614909565b81017f203120446179000000000000000000000000000000000000000000000000000060208201520360068101845201826149fa565b61270f811161567c576001810361563957614c2d60206156016040516155d2816149de565b600481527f2044617900000000000000000000000000000000000000000000000000000000838201529361570a565b60405193816156198693518092868087019101614909565b820161562d82518093868085019101614909565b010380845201826149fa565b614c2d602061560160405161564d816149de565b600581527f2044617973000000000000000000000000000000000000000000000000000000838201529361570a565b5061568561511e565b614c2d602a604051836156a2829551809260208086019101614909565b81017f2039393939204461797300000000000000000000000000000000000000000000602082015203600a8101845201826149fa565b906156e282614b82565b6156ef60405191826149fa565b8281528092615700601f1991614b82565b0190602036910137565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008082101561584d575b506d04ee2d6d415b85acef81000000008083101561583e575b50662386f26fc100008083101561582f575b506305f5e10080831015615820575b5061271080831015615811575b506064821015615801575b600a809210156157f7575b6001908160216157a2600187016156d8565b95860101905b6157b4575b5050505090565b600019019083907f30313233343536373839616263646566000000000000000000000000000000008282061a8353049182156157f2579190826157a8565b6157ad565b9160010191615790565b9190606460029104910191615785565b6004919392049101913861577a565b6008919392049101913861576d565b6010919392049101913861575e565b6020919392049101913861574c565b604093508104915038615733565b8051156159c65760405161586e816149a6565b604081527f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040820152815191600292600281018091116159b05760038091047f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681036159b05761590d906002959492951b6156d8565b936020850193839284518501935b84811061595d57505050505060039051068060011461594a5760021461593f575090565b603d90600019015390565b50603d9081600019820153600119015390565b8360049197929394959701918251600190603f9082828260121c16880101518453828282600c1c16880101518385015382828260061c16880101518885015316850101518682015301959392919061591b565b634e487b7160e01b600052601160045260246000fd5b506040516159d38161498a565b6000815290565b908151811015614b6c570160200190565b9081518151908181149384615a01575050505090565b60209293945082012092012014388080806157ad565b80615a2957506040516159d38161498a565b600a811015615a8e57615a3b9061570a565b614c2d602260405180937f2e300000000000000000000000000000000000000000000000000000000000006020830152615a7e8151809260208686019101614909565b81010360028101845201826149fa565b615a979061570a565b614c2d602160405180937f2e000000000000000000000000000000000000000000000000000000000000006020830152615ada8151809260208686019101614909565b81010360018101845201826149fa565b60405190615af7826149de565b601082527f68736c283233302c3231252c31312529000000000000000000000000000000006020830152565b8015615d5557615b31615aea565b906127109081039081116159b057614c2d91615b4f6101369261570a565b6040519485927f3c672066696c6c3d226e6f6e65223e000000000000000000000000000000000060208501527f3c636972636c652063783d22313636222063793d2235302220723d2232322220602f8501527f7374726f6b653d22000000000000000000000000000000000000000000000000604f850152615bdb815180926020605788019101614909565b83017f22207374726f6b652d77696474683d223130222f3e000000000000000000000060578201527f3c636972636c652063783d22313636222063793d2235302220706174684c656e606c8201527f6774683d2231303030302220723d22323222207374726f6b653d220000000000608c820152615c6382518093602060a785019101614909565b017f22207374726f6b652d6461736861727261793d22313030303022207374726f6b60a78201527f652d646173686f66667365743d2200000000000000000000000000000000000060c7820152615cc482518093602060d585019101614909565b017f22207374726f6b652d6c696e656361703d22726f756e6422207374726f6b652d60d58201527f77696474683d223522207472616e73666f726d3d22726f74617465282d39302960f58201527f22207472616e73666f726d2d6f726967696e3d22313636203530222f3e000000610115820152631e17b39f60e11b610132820152036101168101845201826149fa565b50506040516159d38161498a565b60306151f8919392936040519481615d85879351809260208087019101614909565b820164010714051160dd1b60208201526a029b0b13634b2b9102b19160ad1b6025820152615dbc8251809360208785019101614909565b010360108101855201836149fa565b60256151f8919392936040519481615ded879351809260208087019101614909565b820164010714051160dd1b6020820152615e108251809360208785019101614909565b010360058101855201836149fa565b60009080518015615e9557906000916000915b818310615e4457505050600d02900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615e7787856159da565b511614615e8d575b600d01936001019190615e32565b849350615e7f565b505050600090565b60009080518015615e9557906000916000915b818310615ec25750505060041b900390565b909193603b60f81b7fff00000000000000000000000000000000000000000000000000000000000000615ef587856159da565b511614615f0b575b601001936001019190615eb0565b849350615efd56fea164736f6c6343000817000a"; diff --git a/src/interfaces/ISablierV2LockupDynamic.sol b/src/interfaces/ISablierV2LockupDynamic.sol index d789e4692..39e8216a0 100644 --- a/src/interfaces/ISablierV2LockupDynamic.sol +++ b/src/interfaces/ISablierV2LockupDynamic.sol @@ -118,8 +118,8 @@ interface ISablierV2LockupDynamic is ISablierV2Lockup { /// - Must not be delegate called. /// - `params.totalAmount` must be greater than zero. /// - If set, `params.broker.fee` must not be greater than `MAX_BROKER_FEE`. + /// - `params.startTime` must be greater than zero and less than the first segment's timestamp /// - `params.segments` must have at least one segment, but not more than `MAX_SEGMENT_COUNT`. - /// - `params.startTime` must be less than the first segment's timestamp. /// - The segment timestamps must be arranged in ascending order. /// - The last segment timestamp (i.e. the stream's end time) must be in the future. /// - The sum of the segment amounts must equal the deposit amount. diff --git a/src/interfaces/ISablierV2LockupLinear.sol b/src/interfaces/ISablierV2LockupLinear.sol index c13ba8638..645ef9f65 100644 --- a/src/interfaces/ISablierV2LockupLinear.sol +++ b/src/interfaces/ISablierV2LockupLinear.sol @@ -113,10 +113,8 @@ interface ISablierV2LockupLinear is ISablierV2Lockup { /// - Must not be delegate called. /// - `params.totalAmount` must be greater than zero. /// - If set, `params.broker.fee` must not be greater than `MAX_BROKER_FEE`. - /// - `params.range.start` must be greater than zero. - /// - `params.range.start` must be less than `params.range.end`. - /// - If set, `params.range.cliff` must be greater than `params.range.start`. - /// - If set, `params.range.cliff` must be less than `params.range.end`. + /// - `params.range.start` must be greater than zero and less than `params.range.end`. + /// - If set, `params.range.cliff` must be greater than `params.range.start` and less than `params.range.end`. /// - `params.range.end` must be in the future. /// - `params.recipient` must not be the zero address. /// - `msg.sender` must have allowed this contract to spend at least `params.totalAmount` assets. diff --git a/src/interfaces/ISablierV2LockupTranched.sol b/src/interfaces/ISablierV2LockupTranched.sol index bdbd8a98e..64a7a89bd 100644 --- a/src/interfaces/ISablierV2LockupTranched.sol +++ b/src/interfaces/ISablierV2LockupTranched.sol @@ -115,8 +115,8 @@ interface ISablierV2LockupTranched is ISablierV2Lockup { /// - Must not be delegate called. /// - `params.totalAmount` must be greater than zero. /// - If set, `params.broker.fee` must not be greater than `MAX_BROKER_FEE`. + /// - `params.startTime` must be greater than zero and less than the first tranche's timestamp /// - `params.tranches` must have at least one tranche, but not more than `MAX_TRANCHE_COUNT`. - /// - `params.startTime` must be less than the first tranche's timestamp. /// - The tranche timestamps must be arranged in ascending order. /// - The last tranche timestamp (i.e. the stream's end time) must be in the future. /// - The sum of the tranche amounts must equal the deposit amount. diff --git a/src/libraries/Errors.sol b/src/libraries/Errors.sol index cf2b1b5e3..fc2554f35 100644 --- a/src/libraries/Errors.sol +++ b/src/libraries/Errors.sol @@ -39,6 +39,9 @@ library Errors { /// @notice Thrown when trying to withdraw an amount greater than the withdrawable amount. error SablierV2Lockup_Overdraw(uint256 streamId, uint128 amount, uint128 withdrawableAmount); + /// @notice Thrown when trying to create a stream with a zero start time. + error SablierV2Lockup_StartTimeZero(); + /// @notice Thrown when trying to cancel or renounce a canceled stream. error SablierV2Lockup_StreamCanceled(uint256 streamId); @@ -110,9 +113,6 @@ library Errors { /// @notice Thrown when trying to create a stream with a start time greater than the end time. error SablierV2LockupLinear_StartTimeNotLessThanEndTime(uint40 startTime, uint40 endTime); - /// @notice Thrown when trying to create a stream with a start time equal to zero. - error SablierV2LockupLinear_StartTimeZero(); - /*////////////////////////////////////////////////////////////////////////// SABLIER-V2-NFT-DESCRIPTOR //////////////////////////////////////////////////////////////////////////*/ diff --git a/src/libraries/Helpers.sol b/src/libraries/Helpers.sol index b3823d3c7..ff64f4ffb 100644 --- a/src/libraries/Helpers.sol +++ b/src/libraries/Helpers.sol @@ -60,6 +60,11 @@ library Helpers { revert Errors.SablierV2Lockup_DepositAmountZero(); } + // Checks: the start time is not zero. + if (startTime == 0) { + revert Errors.SablierV2Lockup_StartTimeZero(); + } + // Checks: the segment count is not zero. uint256 segmentCount = segments.length; if (segmentCount == 0) { @@ -84,7 +89,7 @@ library Helpers { // Checks: the start time is not zero. if (range.start == 0) { - revert Errors.SablierV2LockupLinear_StartTimeZero(); + revert Errors.SablierV2Lockup_StartTimeZero(); } // Checks: the start time is strictly less than the end time. @@ -124,6 +129,11 @@ library Helpers { revert Errors.SablierV2Lockup_DepositAmountZero(); } + // Checks: the start time is not zero. + if (startTime == 0) { + revert Errors.SablierV2Lockup_StartTimeZero(); + } + // Checks: the tranche count is not zero. uint256 trancheCount = tranches.length; if (trancheCount == 0) { diff --git a/test/fork/LockupDynamic.t.sol b/test/fork/LockupDynamic.t.sol index 3cb8057e4..4e5d66ff7 100644 --- a/test/fork/LockupDynamic.t.sol +++ b/test/fork/LockupDynamic.t.sol @@ -110,7 +110,7 @@ abstract contract LockupDynamic_Fork_Test is Fork_Test { checkUsers(params.sender, params.recipient, params.broker.account, address(lockupDynamic)); vm.assume(params.segments.length != 0); params.broker.fee = _bound(params.broker.fee, 0, MAX_BROKER_FEE); - params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); + params.startTime = boundUint40(params.startTime, 1, defaults.START_TIME()); // Fuzz the segment timestamps. fuzzSegmentTimestamps(params.segments, params.startTime); diff --git a/test/fork/LockupTranched.t.sol b/test/fork/LockupTranched.t.sol index 114cbefb0..048411356 100644 --- a/test/fork/LockupTranched.t.sol +++ b/test/fork/LockupTranched.t.sol @@ -110,7 +110,7 @@ abstract contract LockupTranched_Fork_Test is Fork_Test { checkUsers(params.sender, params.recipient, params.broker.account, address(lockupTranched)); vm.assume(params.tranches.length != 0); params.broker.fee = _bound(params.broker.fee, 0, MAX_BROKER_FEE); - params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); + params.startTime = boundUint40(params.startTime, 1, defaults.START_TIME()); // Fuzz the tranche timestamps. fuzzTrancheTimestamps(params.tranches, params.startTime); diff --git a/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.t.sol b/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.t.sol index 7ca13f5ae..effd678a9 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.t.sol +++ b/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.t.sol @@ -48,11 +48,22 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is createDefaultStreamWithTotalAmount(totalAmount); } + function test_RevertWhen_StartTimeZero() + external + whenNotDelegateCalled + whenRecipientNonZeroAddress + whenDepositAmountNotZero + { + vm.expectRevert(Errors.SablierV2Lockup_StartTimeZero.selector); + createDefaultStreamWithStartTime(0); + } + function test_RevertWhen_SegmentCountZero() external whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero { LockupDynamic.Segment[] memory segments; vm.expectRevert(Errors.SablierV2LockupDynamic_SegmentCountZero.selector); @@ -64,6 +75,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero { uint256 segmentCount = defaults.MAX_COUNT() + 1; @@ -79,6 +91,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh { @@ -94,6 +107,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -120,6 +134,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -146,6 +161,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -175,6 +191,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -192,6 +209,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -229,6 +247,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -249,6 +268,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -272,6 +292,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -290,6 +311,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow diff --git a/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.tree b/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.tree index 34623142c..020277763 100644 --- a/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.tree +++ b/test/integration/concrete/lockup-dynamic/create-with-timestamps/createWithTimestamps.tree @@ -8,46 +8,49 @@ createWithTimestamps.t.sol ├── when the deposit amount is zero │ └── it should revert └── when the deposit amount is not zero - ├── when the segment count is zero + ├── when the start time is zero │ └── it should revert - └── when the segment count is not zero - ├── when the segment count is too high + └── when the start time is not zero + ├── when the segment count is zero │ └── it should revert - └── when the segment count is not too high - ├── when the segment amounts sum overflows + └── when the segment count is not zero + ├── when the segment count is too high │ └── it should revert - └── when the segment amounts sum does not overflow - ├── when the start time is greater than the first segment timestamp + └── when the segment count is not too high + ├── when the segment amounts sum overflows │ └── it should revert - ├── when the start time is equal to the first segment timestamp - │ └── it should revert - └── when the start time is less than the first segment timestamp - ├── when the segment timestamps are not ordered + └── when the segment amounts sum does not overflow + ├── when the start time is greater than the first segment timestamp + │ └── it should revert + ├── when the start time is equal to the first segment timestamp │ └── it should revert - └── when the segment timestamps are ordered - ├── when the end time is not in the future + └── when the start time is less than the first segment timestamp + ├── when the segment timestamps are not ordered │ └── it should revert - └── when the end time is in the future - ├── when the deposit amount is not equal to the segment amounts sum + └── when the segment timestamps are ordered + ├── when the end time is not in the future │ └── it should revert - └── when the deposit amount is equal to the segment amounts sum - ├── when the broker fee is too high + └── when the end time is in the future + ├── when the deposit amount is not equal to the segment amounts sum │ └── it should revert - └── when the broker fee is not too high - ├── when the asset is not a contract + └── when the deposit amount is equal to the segment amounts sum + ├── when the broker fee is too high │ └── it should revert - └── when the asset is a contract - ├── when the asset misses the ERC-20 return value - │ ├── it should create the stream - │ ├── it should bump the next stream id - │ ├── it should mint the NFT - │ ├── it should emit a {MetadataUpdate} event - │ ├── it should perform the ERC-20 transfers - │ └── it should emit a {CreateLockupDynamicStream} event - └── when the asset does not miss the ERC-20 return value - ├── it should create the stream - ├── it should bump the next stream id - ├── it should mint the NFT - ├── it should emit a {MetadataUpdate} event - ├── it should perform the ERC-20 transfers - └── it should emit a {CreateLockupDynamicStream} event + └── when the broker fee is not too high + ├── when the asset is not a contract + │ └── it should revert + └── when the asset is a contract + ├── when the asset misses the ERC-20 return value + │ ├── it should create the stream + │ ├── it should bump the next stream id + │ ├── it should mint the NFT + │ ├── it should emit a {MetadataUpdate} event + │ ├── it should perform the ERC-20 transfers + │ └── it should emit a {CreateLockupDynamicStream} event + └── when the asset does not miss the ERC-20 return value + ├── it should create the stream + ├── it should bump the next stream id + ├── it should mint the NFT + ├── it should emit a {MetadataUpdate} event + ├── it should perform the ERC-20 transfers + └── it should emit a {CreateLockupDynamicStream} event diff --git a/test/integration/concrete/lockup-linear/create-with-timestamps/createWithTimestamps.t.sol b/test/integration/concrete/lockup-linear/create-with-timestamps/createWithTimestamps.t.sol index 00dae75bb..4f90ab135 100644 --- a/test/integration/concrete/lockup-linear/create-with-timestamps/createWithTimestamps.t.sol +++ b/test/integration/concrete/lockup-linear/create-with-timestamps/createWithTimestamps.t.sol @@ -46,11 +46,16 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is createDefaultStreamWithTotalAmount(0); } - function test_RevertWhen_StartTimeZero() external whenNotDelegateCalled whenRecipientNonZeroAddress { + function test_RevertWhen_StartTimeZero() + external + whenNotDelegateCalled + whenRecipientNonZeroAddress + whenDepositAmountNotZero + { uint40 cliffTime = defaults.CLIFF_TIME(); uint40 endTime = defaults.END_TIME(); - vm.expectRevert(Errors.SablierV2LockupLinear_StartTimeZero.selector); + vm.expectRevert(Errors.SablierV2Lockup_StartTimeZero.selector); createDefaultStreamWithRange(LockupLinear.Range({ start: 0, cliff: cliffTime, end: endTime })); } @@ -62,6 +67,8 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is external whenNotDelegateCalled whenRecipientNonZeroAddress + whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeZero { uint40 startTime = defaults.END_TIME(); @@ -80,6 +87,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeZero { createDefaultStreamWithRange( @@ -112,6 +120,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeGreaterThanZero { uint40 startTime = defaults.CLIFF_TIME(); @@ -130,6 +139,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeGreaterThanZero whenStartTimeNotGreaterThanCliffTime { @@ -149,6 +159,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeGreaterThanZero whenStartTimeNotGreaterThanCliffTime whenCliffTimeLessThanEndTime @@ -165,6 +176,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeGreaterThanZero whenStartTimeNotGreaterThanCliffTime whenCliffTimeLessThanEndTime @@ -182,6 +194,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeGreaterThanZero whenStartTimeNotGreaterThanCliffTime whenCliffTimeLessThanEndTime @@ -198,6 +211,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeGreaterThanZero whenStartTimeNotGreaterThanCliffTime whenCliffTimeLessThanEndTime @@ -212,6 +226,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Concrete_Test is external whenNotDelegateCalled whenDepositAmountNotZero + whenStartTimeNotZero whenCliffTimeGreaterThanZero whenStartTimeNotGreaterThanCliffTime whenCliffTimeLessThanEndTime diff --git a/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.t.sol b/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.t.sol index aabc6eada..09f7524ad 100644 --- a/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.t.sol +++ b/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.t.sol @@ -49,11 +49,22 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is createDefaultStreamWithTotalAmount(totalAmount); } + function test_RevertWhen_StartTimeZero() + external + whenNotDelegateCalled + whenRecipientNonZeroAddress + whenDepositAmountNotZero + { + vm.expectRevert(Errors.SablierV2Lockup_StartTimeZero.selector); + createDefaultStreamWithStartTime(0); + } + function test_RevertWhen_TrancheCountZero() external whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero { LockupTranched.Tranche[] memory tranches; vm.expectRevert(Errors.SablierV2LockupTranched_TrancheCountZero.selector); @@ -65,6 +76,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero { uint256 trancheCount = defaults.MAX_COUNT() + 1; @@ -80,6 +92,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh { @@ -95,6 +108,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -121,6 +135,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -147,6 +162,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -176,6 +192,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -193,6 +210,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -230,6 +248,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -250,6 +269,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -273,6 +293,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -291,6 +312,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Concrete_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow diff --git a/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.tree b/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.tree index 81617ee76..4ffd8d5a5 100644 --- a/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.tree +++ b/test/integration/concrete/lockup-tranched/create-with-timestamps/createWithTimestamps.tree @@ -8,46 +8,49 @@ createWithTimestamps.t.sol ├── when the deposit amount is zero │ └── it should revert └── when the deposit amount is not zero - ├── when the tranche count is zero + ├── when the start time is zero │ └── it should revert - └── when the tranche count is not zero - ├── when the tranche count is too high + └── when the start time is not zero + ├── when the tranche count is zero │ └── it should revert - └── when the tranche count is not too high - ├── when the tranche amounts sum overflows + └── when the tranche count is not zero + ├── when the tranche count is too high │ └── it should revert - └── when the tranche amounts sum does not overflow - ├── when the start time is greater than the first tranche timestamp + └── when the tranche count is not too high + ├── when the tranche amounts sum overflows │ └── it should revert - ├── when the start time is equal to the first tranche timestamp - │ └── it should revert - └── when the start time is less than the first tranche timestamp - ├── when the tranche timestamps are not ordered + └── when the tranche amounts sum does not overflow + ├── when the start time is greater than the first tranche timestamp + │ └── it should revert + ├── when the start time is equal to the first tranche timestamp │ └── it should revert - └── when the tranche timestamps are ordered - ├── when the end time is not in the future + └── when the start time is less than the first tranche timestamp + ├── when the tranche timestamps are not ordered │ └── it should revert - └── when the end time is in the future - ├── when the deposit amount is not equal to the tranche amounts sum + └── when the tranche timestamps are ordered + ├── when the end time is not in the future │ └── it should revert - └── when the deposit amount is equal to the tranche amounts sum - ├── when the broker fee is too high + └── when the end time is in the future + ├── when the deposit amount is not equal to the tranche amounts sum │ └── it should revert - └── when the broker fee is not too high - ├── when the asset is not a contract + └── when the deposit amount is equal to the tranche amounts sum + ├── when the broker fee is too high │ └── it should revert - └── when the asset is a contract - ├── when the asset misses the ERC-20 return value - │ ├── it should create the stream - │ ├── it should bump the next stream id - │ ├── it should mint the NFT - │ ├── it should emit a {MetadataUpdate} event - │ ├── it should perform the ERC-20 transfers - │ └── it should emit a {CreateLockupTranchedStream} event - └── when the asset does not miss the ERC-20 return value - ├── it should create the stream - ├── it should bump the next stream id - ├── it should mint the NFT - ├── it should emit a {MetadataUpdate} event - ├── it should perform the ERC-20 transfers - └── it should emit a {CreateLockupTranchedStream} event + └── when the broker fee is not too high + ├── when the asset is not a contract + │ └── it should revert + └── when the asset is a contract + ├── when the asset misses the ERC-20 return value + │ ├── it should create the stream + │ ├── it should bump the next stream id + │ ├── it should mint the NFT + │ ├── it should emit a {MetadataUpdate} event + │ ├── it should perform the ERC-20 transfers + │ └── it should emit a {CreateLockupTranchedStream} event + └── when the asset does not miss the ERC-20 return value + ├── it should create the stream + ├── it should bump the next stream id + ├── it should mint the NFT + ├── it should emit a {MetadataUpdate} event + ├── it should perform the ERC-20 transfers + └── it should emit a {CreateLockupTranchedStream} event diff --git a/test/integration/fuzz/lockup-dynamic/createWithTimestamps.t.sol b/test/integration/fuzz/lockup-dynamic/createWithTimestamps.t.sol index a5f279d39..cce900d40 100644 --- a/test/integration/fuzz/lockup-dynamic/createWithTimestamps.t.sol +++ b/test/integration/fuzz/lockup-dynamic/createWithTimestamps.t.sol @@ -177,6 +177,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Fuzz_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenSegmentCountNotZero whenSegmentCountNotTooHigh whenSegmentAmountsSumDoesNotOverflow @@ -191,7 +192,7 @@ contract CreateWithTimestamps_LockupDynamic_Integration_Fuzz_Test is vm.assume(funder != address(0) && params.recipient != address(0) && params.broker.account != address(0)); vm.assume(params.segments.length != 0); params.broker.fee = _bound(params.broker.fee, 0, MAX_BROKER_FEE); - params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); + params.startTime = boundUint40(params.startTime, 1, defaults.START_TIME()); params.transferable = true; // Fuzz the segment timestamps. diff --git a/test/integration/fuzz/lockup-linear/createWithTimestamps.t.sol b/test/integration/fuzz/lockup-linear/createWithTimestamps.t.sol index bc53ce6fd..9a92d315e 100644 --- a/test/integration/fuzz/lockup-linear/createWithTimestamps.t.sol +++ b/test/integration/fuzz/lockup-linear/createWithTimestamps.t.sol @@ -104,6 +104,7 @@ contract CreateWithTimestamps_LockupLinear_Integration_Fuzz_Test is external whenNotDelegateCalled whenDepositAmountNotZero + whenStartTimeNotZero whenStartTimeNotGreaterThanCliffTime whenCliffTimeLessThanEndTime whenEndTimeInTheFuture diff --git a/test/integration/fuzz/lockup-tranched/createWithTimestamps.t.sol b/test/integration/fuzz/lockup-tranched/createWithTimestamps.t.sol index 4b25dd2e0..7d197ae39 100644 --- a/test/integration/fuzz/lockup-tranched/createWithTimestamps.t.sol +++ b/test/integration/fuzz/lockup-tranched/createWithTimestamps.t.sol @@ -177,6 +177,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Fuzz_Test is whenNotDelegateCalled whenRecipientNonZeroAddress whenDepositAmountNotZero + whenStartTimeNotZero whenTrancheCountNotZero whenTrancheCountNotTooHigh whenTrancheAmountsSumDoesNotOverflow @@ -192,7 +193,7 @@ contract CreateWithTimestamps_LockupTranched_Integration_Fuzz_Test is vm.assume(params.tranches.length != 0); params.broker.fee = _bound(params.broker.fee, 0, MAX_BROKER_FEE); - params.startTime = boundUint40(params.startTime, 0, defaults.START_TIME()); + params.startTime = boundUint40(params.startTime, 1, defaults.START_TIME()); params.transferable = true; // Fuzz the tranche timestamps. diff --git a/test/integration/shared/lockup-dynamic/createWithTimestamps.t.sol b/test/integration/shared/lockup-dynamic/createWithTimestamps.t.sol index 3b1b3c53e..b9a7a5fd2 100644 --- a/test/integration/shared/lockup-dynamic/createWithTimestamps.t.sol +++ b/test/integration/shared/lockup-dynamic/createWithTimestamps.t.sol @@ -22,6 +22,10 @@ contract CreateWithTimestamps_Integration_Shared_Test is LockupDynamic_Integrati _; } + modifier whenStartTimeNotZero() { + _; + } + modifier whenSegmentCountNotZero() { _; } diff --git a/test/integration/shared/lockup-linear/createWithTimestamps.t.sol b/test/integration/shared/lockup-linear/createWithTimestamps.t.sol index ebe9f366d..09975a86c 100644 --- a/test/integration/shared/lockup-linear/createWithTimestamps.t.sol +++ b/test/integration/shared/lockup-linear/createWithTimestamps.t.sol @@ -22,6 +22,10 @@ abstract contract CreateWithTimestamps_Integration_Shared_Test is LockupLinear_I _; } + modifier whenStartTimeNotZero() { + _; + } + modifier whenStartTimeNotGreaterThanCliffTime() { _; } diff --git a/test/integration/shared/lockup-tranched/createWithTimestamps.t.sol b/test/integration/shared/lockup-tranched/createWithTimestamps.t.sol index 88ff66f17..854d97960 100644 --- a/test/integration/shared/lockup-tranched/createWithTimestamps.t.sol +++ b/test/integration/shared/lockup-tranched/createWithTimestamps.t.sol @@ -22,6 +22,10 @@ contract CreateWithTimestamps_Integration_Shared_Test is LockupTranched_Integrat _; } + modifier whenStartTimeNotZero() { + _; + } + modifier whenTrancheCountNotZero() { _; } diff --git a/test/invariant/Lockup.t.sol b/test/invariant/Lockup.t.sol index 9db2edcc4..8ec23a98d 100644 --- a/test/invariant/Lockup.t.sol +++ b/test/invariant/Lockup.t.sol @@ -95,6 +95,15 @@ abstract contract Lockup_Invariant_Test is Invariant_Test { } } + function invariant_DepositedAmountNotZero() external useCurrentTimestamp { + uint256 lastStreamId = lockupStore.lastStreamId(); + for (uint256 i = 0; i < lastStreamId; ++i) { + uint256 streamId = lockupStore.streamIds(i); + uint128 depositAmount = lockup.getDepositedAmount(streamId); + assertNotEq(depositAmount, 0, "Invariant violated: stream non-null, deposited amount zero"); + } + } + function invariant_EndTimeGtStartTime() external useCurrentTimestamp { uint256 lastStreamId = lockupStore.lastStreamId(); for (uint256 i = 0; i < lastStreamId; ++i) { @@ -115,6 +124,15 @@ abstract contract Lockup_Invariant_Test is Invariant_Test { } } + function invariant_StartTimeNotZero() external useCurrentTimestamp { + uint256 lastStreamId = lockupStore.lastStreamId(); + for (uint256 i = 0; i < lastStreamId; ++i) { + uint256 streamId = lockupStore.streamIds(i); + uint40 startTime = lockup.getStartTime(streamId); + assertGt(startTime, 0, "Invariant violated: start time zero"); + } + } + function invariant_StatusCanceled() external useCurrentTimestamp { uint256 lastStreamId = lockupStore.lastStreamId(); for (uint256 i = 0; i < lastStreamId; ++i) { diff --git a/test/invariant/LockupDynamic.t.sol b/test/invariant/LockupDynamic.t.sol index cc7d75d29..ac99bfd53 100644 --- a/test/invariant/LockupDynamic.t.sol +++ b/test/invariant/LockupDynamic.t.sol @@ -58,26 +58,6 @@ contract LockupDynamic_Invariant_Test is Lockup_Invariant_Test { INVARIANTS //////////////////////////////////////////////////////////////////////////*/ - /// @dev The deposited amount must not be zero. - function invariant_DepositedAmountNotZero() external useCurrentTimestamp { - uint256 lastStreamId = lockupStore.lastStreamId(); - for (uint256 i = 0; i < lastStreamId; ++i) { - uint256 streamId = lockupStore.streamIds(i); - LockupDynamic.StreamLD memory stream = lockupDynamic.getStream(streamId); - assertNotEq(stream.amounts.deposited, 0, "Invariant violated: stream non-null, deposited amount zero"); - } - } - - /// @dev The end time cannot be zero because it must be greater than the start time (which can be zero). - function invariant_EndTimeNotZero() external useCurrentTimestamp { - uint256 lastStreamId = lockupStore.lastStreamId(); - for (uint256 i = 0; i < lastStreamId; ++i) { - uint256 streamId = lockupStore.streamIds(i); - LockupDynamic.StreamLD memory stream = lockupDynamic.getStream(streamId); - assertNotEq(stream.endTime, 0, "Invariant violated: end time zero"); - } - } - /// @dev Unordered segment timestamps are not allowed. function invariant_SegmentTimestampsOrdered() external useCurrentTimestamp { uint256 lastStreamId = lockupStore.lastStreamId(); diff --git a/test/invariant/LockupLinear.t.sol b/test/invariant/LockupLinear.t.sol index 84ac74858..bca4387eb 100644 --- a/test/invariant/LockupLinear.t.sol +++ b/test/invariant/LockupLinear.t.sol @@ -73,16 +73,6 @@ contract LockupLinear_Invariant_Test is Lockup_Invariant_Test { } } - /// @dev The deposited amount must not be zero. - function invariant_DepositedAmountNotZero() external useCurrentTimestamp { - uint256 lastStreamId = lockupStore.lastStreamId(); - for (uint256 i = 0; i < lastStreamId; ++i) { - uint256 streamId = lockupStore.streamIds(i); - LockupLinear.StreamLL memory stream = lockupLinear.getStream(streamId); - assertNotEq(stream.amounts.deposited, 0, "Invariant violated: stream non-null, deposited amount zero"); - } - } - /// @dev The end time must not be less than or equal to the cliff time. function invariant_EndTimeGtCliffTime() external useCurrentTimestamp { uint256 lastStreamId = lockupStore.lastStreamId(); @@ -96,16 +86,6 @@ contract LockupLinear_Invariant_Test is Lockup_Invariant_Test { } } - /// @dev The end time must not be zero because it must be greater than the start time (which can be zero). - function invariant_EndTimeNotZero() external useCurrentTimestamp { - uint256 lastStreamId = lockupStore.lastStreamId(); - for (uint256 i = 0; i < lastStreamId; ++i) { - uint256 streamId = lockupStore.streamIds(i); - LockupLinear.StreamLL memory stream = lockupLinear.getStream(streamId); - assertNotEq(stream.endTime, 0, "Invariant violated: stream non-null, end time zero"); - } - } - /// @dev Settled streams must not appear as cancelable in {SablierV2LockupLinear.getStream}. function invariant_StatusSettled_GetStream() external { uint256 lastStreamId = lockupStore.lastStreamId(); diff --git a/test/invariant/LockupTranched.t.sol b/test/invariant/LockupTranched.t.sol index c57c3e177..e076af08a 100644 --- a/test/invariant/LockupTranched.t.sol +++ b/test/invariant/LockupTranched.t.sol @@ -58,26 +58,6 @@ contract LockupTranched_Invariant_Test is Lockup_Invariant_Test { INVARIANTS //////////////////////////////////////////////////////////////////////////*/ - /// @dev The deposited amount must not be zero. - function invariant_DepositedAmountNotZero() external useCurrentTimestamp { - uint256 lastStreamId = lockupStore.lastStreamId(); - for (uint256 i = 0; i < lastStreamId; ++i) { - uint256 streamId = lockupStore.streamIds(i); - LockupTranched.StreamLT memory stream = lockupTranched.getStream(streamId); - assertNotEq(stream.amounts.deposited, 0, "Invariant violated: stream non-null, deposited amount zero"); - } - } - - /// @dev The end time cannot be zero because it must be greater than the start time (which can be zero). - function invariant_EndTimeNotZero() external useCurrentTimestamp { - uint256 lastStreamId = lockupStore.lastStreamId(); - for (uint256 i = 0; i < lastStreamId; ++i) { - uint256 streamId = lockupStore.streamIds(i); - LockupTranched.StreamLT memory stream = lockupTranched.getStream(streamId); - assertNotEq(stream.endTime, 0, "Invariant violated: end time zero"); - } - } - /// @dev Settled streams must not appear as cancelable in {SablierV2LockupTranched.getStream}. function invariant_StatusSettled_GetStream() external { uint256 lastStreamId = lockupStore.lastStreamId(); diff --git a/test/invariant/handlers/LockupDynamicCreateHandler.sol b/test/invariant/handlers/LockupDynamicCreateHandler.sol index 44e4b8dec..4cd0f7d7f 100644 --- a/test/invariant/handlers/LockupDynamicCreateHandler.sol +++ b/test/invariant/handlers/LockupDynamicCreateHandler.sol @@ -109,7 +109,7 @@ contract LockupDynamicCreateHandler is BaseHandler { } params.broker.fee = _bound(params.broker.fee, 0, MAX_BROKER_FEE); - params.startTime = boundUint40(params.startTime, 0, getBlockTimestamp()); + params.startTime = boundUint40(params.startTime, 1, getBlockTimestamp()); // Fuzz the segment timestamps. fuzzSegmentTimestamps(params.segments, params.startTime); diff --git a/test/invariant/handlers/LockupTranchedCreateHandler.sol b/test/invariant/handlers/LockupTranchedCreateHandler.sol index 91a95740d..6661a7863 100644 --- a/test/invariant/handlers/LockupTranchedCreateHandler.sol +++ b/test/invariant/handlers/LockupTranchedCreateHandler.sol @@ -109,7 +109,7 @@ contract LockupTranchedCreateHandler is BaseHandler { } params.broker.fee = _bound(params.broker.fee, 0, MAX_BROKER_FEE); - params.startTime = boundUint40(params.startTime, 0, getBlockTimestamp()); + params.startTime = boundUint40(params.startTime, 1, getBlockTimestamp()); // Fuzz the tranche timestamps. fuzzTrancheTimestamps(params.tranches, params.startTime);