60806040526001600c5534801561001557600080fd5b50467f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61005c604080518082019091526007815266059617065204c560cc1b602082015290565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051601f19818403018152919052805160209091012060035550600580546001600160a01b0319163317905561552f80620000fe6000396000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c806370a0823111610160578063ba9a7a56116100d8578063dd62ed3e1161008c578063f3e0ffbf11610071578063f3e0ffbf14610681578063fc22d0e514610694578063fff6cae9146106a757600080fd5b8063dd62ed3e14610643578063ed69e8651461066e57600080fd5b8063c45a0155116100bd578063c45a0155146105f0578063d21220a714610610578063d505accf1461063057600080fd5b8063ba9a7a56146105d4578063bc25cf77146105dd57600080fd5b80637ecebe001161012f57806395d89b411161011457806395d89b4114610575578063a9059cbb146105ae578063ac069907146105c157600080fd5b80637ecebe001461054257806389afcb441461056257600080fd5b806370a08231146104db578063732cd7ab146104fb5780637464fc3d1461051b5780637b1039991461052457600080fd5b806323b872dd1161020e578063485cc955116101c25780635909c0d5116101a75780635909c0d5146104b65780635a3d5493146104bf5780636a627842146104c857600080fd5b8063485cc9551461049b57806349d10b64146104ae57600080fd5b806330adf81f116101f357806330adf81f14610451578063313ce567146104785780633644e5151461049257600080fd5b806323b872dd1461041e57806328d6dbcd1461043157600080fd5b80630dfe16811161026557806319de419e1161024a57806319de419e146103dc578063212a8c95146103f857806321c281911461040b57600080fd5b80630dfe16811461038057806318160ddd146103c557600080fd5b8063022c0d9f1461029757806306fdde03146102ac5780630902f1ac146102f7578063095ea7b31461035d575b600080fd5b6102aa6102a5366004614f7f565b6106af565b005b60408051808201909152600781527f59617065204c500000000000000000000000000000000000000000000000000060208201525b6040516102ee9190615103565b60405180910390f35b600854604080516dffffffffffffffffffffffffffff80841682526e01000000000000000000000000000084041660208201527c010000000000000000000000000000000000000000000000000000000090920463ffffffff16908201526060016102ee565b61037061036b366004614ec1565b610d00565b60405190151581526020016102ee565b6006546103a09073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ee565b6103ce60005481565b6040519081526020016102ee565b600f546010545b604080519283526020830191909152016102ee565b6103ce610406366004614dd0565b610d17565b6102aa610419366004614d96565b610f5f565b61037061042c366004614e09565b61101b565b6103ce61043f366004614d96565b600e6020526000908152604090205481565b6103ce7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b610480601281565b60405160ff90911681526020016102ee565b6103ce60035481565b6102aa6104a9366004614dd0565b6110f5565b6102aa6111c9565b6103ce60095481565b6103ce600a5481565b6103ce6104d6366004614d96565b6112b0565b6103ce6104e9366004614d96565b60016020526000908152604090205481565b61050e610509366004614d96565b61130d565b6040516102ee91906150a9565b6103ce600b5481565b60115473ffffffffffffffffffffffffffffffffffffffff166103a0565b6103ce610550366004614d96565b60046020526000908152604090205481565b6103e3610570366004614d96565b6116ab565b60408051808201909152600381527f594c50000000000000000000000000000000000000000000000000000000000060208201526102e1565b6103706105bc366004614ec1565b611959565b6103a06105cf366004614d96565b611966565b6103ce6103e881565b6102aa6105eb366004614d96565b611a28565b6005546103a09073ffffffffffffffffffffffffffffffffffffffff1681565b6007546103a09073ffffffffffffffffffffffffffffffffffffffff1681565b6102aa61063e366004614e4a565b611b2d565b6103ce610651366004614dd0565b600260209081526000928352604080842090915290825290205481565b6102aa61067c366004614f5d565b611e18565b6103ce61068f366004614d96565b611f16565b6103ce6106a2366004614eed565b611fe5565b6102aa61217f565b600c54600114610720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b454400000000000000000000000000000060448201526064015b60405180910390fd5b6000600c55841515806107335750600084115b6107bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f556e697377617056323a20494e53554646494349454e545f4f55545055545f4160448201527f4d4f554e540000000000000000000000000000000000000000000000000000006064820152608401610717565b60008061081b6008546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000083049091169163ffffffff7c01000000000000000000000000000000000000000000000000000000009091041690565b5091509150816dffffffffffffffffffffffffffff168710801561084e5750806dffffffffffffffffffffffffffff1686105b6108da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f556e697377617056323a20494e53554646494349454e545f4c4951554944495460448201527f59000000000000000000000000000000000000000000000000000000000000006064820152608401610717565b600654600754600091829173ffffffffffffffffffffffffffffffffffffffff91821691908116908916821480159061093f57508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b6109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e697377617056323a20494e56414c49445f544f00000000000000000000006044820152606401610717565b8a156109b6576109b6828a8d61226d565b89156109c7576109c7818a8c61226d565b8615610a5a576040517f10d1e85c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906310d1e85c90610a279033908f908f908e908e90600401615031565b600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b505050505b610a6382612419565b9350610a6e81612419565b92505050600089856dffffffffffffffffffffffffffff16610a909190615363565b8311610a9d576000610ac1565b610ab78a6dffffffffffffffffffffffffffff8716615363565b610ac19084615363565b90506000610adf8a6dffffffffffffffffffffffffffff8716615363565b8311610aec576000610b10565b610b068a6dffffffffffffffffffffffffffff8716615363565b610b109084615363565b90506000821180610b215750600081115b610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f556e697377617056323a20494e53554646494349454e545f494e5055545f414d60448201527f4f554e54000000000000000000000000000000000000000000000000000000006064820152608401610717565b6000610bce610bbc8460036124d0565b610bc8876103e86124d0565b9061255a565b90506000610be0610bbc8460036124d0565b9050610c0c620f4240610c066dffffffffffffffffffffffffffff8b8116908b166124d0565b906124d0565b610c1683836124d0565b1015610c7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e697377617056323a204b00000000000000000000000000000000000000006044820152606401610717565b5050610c8c848488886125d2565b60408051838152602081018390529081018c9052606081018b905273ffffffffffffffffffffffffffffffffffffffff8a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600c55505050505050505050565b6000610d0d3384846128ae565b5060015b92915050565b600080610d238461130d565b905060005b8151811015610f5757610f43610f3c838381518110610d4957610d49615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9657600080fd5b505afa158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce9190614f44565b610dd990600a61521c565b610f36858581518110610dee57610dee615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3b57600080fd5b505afa158015610e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e739190614f44565b868681518110610e8557610e85615476565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152909116906370a082319060240160206040518083038186803b158015610ef857600080fd5b505afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190614f44565b9061291d565b90612929565b8490612935565b925080610f4f816153cb565b915050610d28565b505092915050565b600654819073ffffffffffffffffffffffffffffffffffffffff80831691161480610fa4575060075473ffffffffffffffffffffffffffffffffffffffff8281169116145b61100a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f59617065737761703a204e4f54204120524553455256454420544f4b454e00006044820152606401610717565b6110178260006001612941565b5050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146110df5773ffffffffffffffffffffffffffffffffffffffff841660009081526002602090815260408083203384529091529020546110ad908361255a565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b6110ea848484612a32565b5060015b9392505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e0000000000000000000000006044820152606401610717565b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637b1039996040518163ffffffff1660e01b815260040160206040518083038186803b15801561123157600080fd5b505afa158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190614db3565b601180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006112bb82612aff565b6006549091506112e39073ffffffffffffffffffffffffffffffffffffffff16600080612941565b6007546113089073ffffffffffffffffffffffffffffffffffffffff16600080612941565b919050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600d602052604081205460609161135560115473ffffffffffffffffffffffffffffffffffffffff1690565b6040517ff9c7bba500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152919091169063f9c7bba59060240160206040518083038186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f69190614f44565b9050808214156114905773ffffffffffffffffffffffffffffffffffffffff84166000908152600d60209081526040918290208054835181840281018401909452808452909183018282801561148257602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611457575b505050505092505050919050565b60008167ffffffffffffffff8111156114ab576114ab6154a5565b6040519080825280602002602001820160405280156114d4578160200160208202803683370190505b50905060005b8381101561158d5773ffffffffffffffffffffffffffffffffffffffff86166000908152600d6020526040902080548290811061151957611519615476565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682828151811061155657611556615476565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280611585816153cb565b9150506114da565b50825b828110156116a25760115473ffffffffffffffffffffffffffffffffffffffff166040517f7bbfc69e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018490529190911690637bbfc69e9060440160206040518083038186803b15801561162157600080fd5b505afa158015611635573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116599190614db3565b82828151811061166b5761166b615476565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101528061169a816153cb565b915050611590565b50949350505050565b600080600c5460011461171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b45440000000000000000000000000000006044820152606401610717565b6000600c8190556008546006546007546dffffffffffffffffffffffffffff808416946e010000000000000000000000000000909404169273ffffffffffffffffffffffffffffffffffffffff928316929091169061177883612419565b9050600061178583612419565b306000908152600160205260408120549192506117a28888612df0565b600054909150806117b384876124d0565b6117bd91906151a7565b9a50806117ca84866124d0565b6117d491906151a7565b995060008b1180156117e6575060008a115b611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f556e697377617056323a20494e53554646494349454e545f4c4951554944495460448201527f595f4255524e45440000000000000000000000000000000000000000000000006064820152608401610717565b61187c3084612f69565b611887878d8d61226d565b611892868d8c61226d565b61189b87612419565b94506118a686612419565b93506118b485858b8b6125d2565b81156118f0576008546118ec906dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166124d0565b600b555b604080518c8152602081018c905273ffffffffffffffffffffffffffffffffffffffff8e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600c81905550915091565b6000610d0d338484612a32565b600061198760115473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fe177dc7000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152919091169063e177dc709060240160206040518083038186803b1580156119f057600080fd5b505afa158015611a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d119190614db3565b600c54600114611a94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b45440000000000000000000000000000006044820152606401610717565b6000600c5560065460075460085473ffffffffffffffffffffffffffffffffffffffff9283169290911690611ae99083908590611ae4906dffffffffffffffffffffffffffff16610bc884612419565b61226d565b600854611b239082908590611ae4906e01000000000000000000000000000090046dffffffffffffffffffffffffffff16610bc884612419565b50506001600c5550565b42841015611b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e697377617056323a204558504952454400000000000000000000000000006044820152606401610717565b60035473ffffffffffffffffffffffffffffffffffffffff8816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611bf7836153cb565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611c989291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611d21573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611d9c57508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611e02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e4154555245000000006044820152606401610717565b611e0d8989896128ae565b505050505050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663570ca7356040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8057600080fd5b505afa158015611e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb89190614db3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eef57600080fd5b612710811115611efe57600080fd5b80821115611f0b57600080fd5b600f91909155601055565b600080611f228361130d565b905060005b8151811015611fde57611fca828281518110611f4557611f45615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3c9190614f44565b925080611fd6816153cb565b915050611f27565b5050919050565b600554604080517f570ca735000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163570ca735916004808301926020929190829003018186803b15801561205057600080fd5b505afa158015612064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120889190614db3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120bf57600080fd5b600654849073ffffffffffffffffffffffffffffffffffffffff80831691161480612104575060075473ffffffffffffffffffffffffffffffffffffffff8281169116145b61216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f59617065737761703a204e4f54204120524553455256454420544f4b454e00006044820152606401610717565b61217685308686613022565b95945050505050565b600c546001146121eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b45440000000000000000000000000000006044820152606401610717565b6000600c55600654612266906122169073ffffffffffffffffffffffffffffffffffffffff16612419565b6007546122389073ffffffffffffffffffffffffffffffffffffffff16612419565b6008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166125d2565b6001600c55565b61227983826000612941565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283928716916123409190615015565b6000604051808303816000865af19150503d806000811461237d576040519150601f19603f3d011682016040523d82523d6000602084013e612382565b606091505b50915091508180156123ac5750805115806123ac5750808060200190518101906123ac9190614f22565b612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c45440000000000006044820152606401610717565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600e60205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529192610d11926370a082319060240160206040518083038186803b15801561249257600080fd5b505afa1580156124a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ca9190614f44565b90612935565b60008115806124f4575082826124e68183615326565b92506124f290836151a7565b145b610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152606401610717565b6000826125678382615363565b9150811115610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f7700000000000000000000006044820152606401610717565b6dffffffffffffffffffffffffffff84118015906125fe57506dffffffffffffffffffffffffffff8311155b612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f556e697377617056323a204f564552464c4f57000000000000000000000000006044820152606401610717565b600061267564010000000042615404565b6008549091506000906126ae907c0100000000000000000000000000000000000000000000000000000000900463ffffffff168361537a565b905060008163ffffffff161180156126d557506dffffffffffffffffffffffffffff841615155b80156126f057506dffffffffffffffffffffffffffff831615155b156127be578063ffffffff1661272d8561270986613217565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690613242565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166127559190615326565b600960008282546127669190615154565b909155505063ffffffff811661277f8461270987613217565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166127a79190615326565b600a60008282546127b89190615154565b90915550505b6008805463ffffffff84167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff8981166e0100000000000000000000000000009081027fffffffff000000000000000000000000000000000000000000000000000000009095168c83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006110ee8284615326565b60006110ee82846151a7565b60006110ee8284615154565b60006129568361295086612419565b9061325e565b90506000612975612710610f36600f548561291d90919063ffffffff16565b90506000612994612710610f366010548661291d90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600e60205260408120549192506129c7848461326a565b9050828211806129de57508580156129de57508082115b156129fb576129f6886129f18385615363565b6132c1565b612a28565b81841180612a105750858015612a1057508181115b15612a2857612a2888612a238484615363565b613521565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612a62908261255a565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612a9e90826135e0565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906129109085815260200190565b6000600c54600114612b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b45440000000000000000000000000000006044820152606401610717565b6000600c8190556008546006546dffffffffffffffffffffffffffff808316936e010000000000000000000000000000909304169190612bc29073ffffffffffffffffffffffffffffffffffffffff16612419565b600754909150600090612bea9073ffffffffffffffffffffffffffffffffffffffff16612419565b90506000612c08836dffffffffffffffffffffffffffff871661255a565b90506000612c26836dffffffffffffffffffffffffffff871661255a565b90506000612c348787612df0565b60005490915080612c6b57612c576103e8610bc8612c5287876124d0565b613658565b9850612c6660006103e86136c7565b612cc0565b612cbd6dffffffffffffffffffffffffffff8916612c8986846124d0565b612c9391906151a7565b6dffffffffffffffffffffffffffff8916612cae86856124d0565b612cb891906151a7565b613764565b98505b60008911612d50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f556e697377617056323a20494e53554646494349454e545f4c4951554944495460448201527f595f4d494e5445440000000000000000000000000000000000000000000000006064820152608401610717565b612d5a8a8a6136c7565b612d6686868a8a6125d2565b8115612da257600854612d9e906dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166124d0565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600c5550949695505050505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015612e5b57600080fd5b505afa158015612e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e939190614db3565b600b5473ffffffffffffffffffffffffffffffffffffffff8216158015945091925090612f56578015612f51576000612ee2612c526dffffffffffffffffffffffffffff8881169088166124d0565b90506000612eef83613658565b905080821115612f4e576000612f11612f08848461255a565b600054906124d0565b90506000612f2a83612f248660056124d0565b906135e0565b90506000612f3882846151a7565b90508015612f4a57612f4a87826136c7565b5050505b50505b610f57565b8015610f57576000600b55505092915050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902054612f99908261255a565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554612fcd908261255a565b600090815560405182815273ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b60008061302e86611966565b905060008173ffffffffffffffffffffffffffffffffffffffff1663ecf708586040518163ffffffff1660e01b815260040160206040518083038186803b15801561307857600080fd5b505afa15801561308c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b09190614f44565b905060008273ffffffffffffffffffffffffffffffffffffffff166301e1d1146040518163ffffffff1660e01b815260040160206040518083038186803b1580156130fa57600080fd5b505afa15801561310e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131329190614f44565b9050808211613147576000935050505061320f565b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8310801561319657507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81105b156131b75760006131a7848461325e565b9050808211156131b5578091505b505b801561320a5760006131cd8a8a3085600061377a565b9050806131e25760009550505050505061320f565b6131f08a308b8460006141a2565b9550866131fd828861325e565b111561320857600080fd5b505b505050505b949350505050565b6000610d116e0100000000000000000000000000006dffffffffffffffffffffffffffff84166152e2565b60006110ee6dffffffffffffffffffffffffffff83168461516c565b60006110ee8284615363565b600060026132788184615404565b613283600286615404565b61328d9190615154565b61329791906151a7565b6132a26002846151a7565b6132ad6002866151a7565b6132b79190615154565b6110ee9190615154565b8160006132cd82612419565b905060006132db8530610d17565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600e60205260408120549192508183111561331d576133168284615363565b9050613321565b5060005b600061333a8830806133338b87612935565b600161377a565b9050600087821115613357576133508883615363565b905061335b565b5060005b61336f6133688284615363565b859061325e565b73ffffffffffffffffffffffffffffffffffffffff808b166000908152600e602090815260408083209490945560055484517f017e7e580000000000000000000000000000000000000000000000000000000081529451929493169263017e7e589260048083019392829003018186803b1580156133ec57600080fd5b505afa158015613400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134249190614db3565b9050811561344d5761344d73ffffffffffffffffffffffffffffffffffffffff8b168284614773565b6040805173ffffffffffffffffffffffffffffffffffffffff8c168152602081018590529081018390527fef4df05a61bbcf67d2847e7a9b3553ac9561d4505a2a4f25e680563432d8acd29060600160405180910390a1505050505050806134b483612419565b1461351b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f59617065737761703a2042414c414e4345204348414e474544000000000000006044820152606401610717565b50505050565b81600061352d82612419565b9050600061353f8530308760006141a2565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600e60205260409020549091506135729082612935565b73ffffffffffffffffffffffffffffffffffffffff86166000818152600e60209081526040918290209390935580519182529181018690527f38477e4b620b58ac2682bb0495f4dbe976f682fd6092063680e66e953562d9c0910160405180910390a150806134b483612419565b6000826135ed8382615154565b9150811015610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152606401610717565b600060038211156136b957508060006136726002836151a7565b61367d906001615154565b90505b818110156136b35790508060028161369881866151a7565b6136a29190615154565b6136ac91906151a7565b9050613680565b50919050565b811561130857506001919050565b6000546136d490826135e0565b600090815573ffffffffffffffffffffffffffffffffffffffff831681526001602052604090205461370690826135e0565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130169085815260200190565b600081831061377357816110ee565b5090919050565b60008061378687611966565b90508660006137948261130d565b90506137a0898261484c565b60005b8151811015613e6c57851580156137fe57508373ffffffffffffffffffffffffffffffffffffffff168282815181106137de576137de615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16145b1561380857613e5a565b600082828151811061381c5761381c615476565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152909116906370a082319060240160206040518083038186803b15801561388f57600080fd5b505afa1580156138a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138c79190614f44565b905073ffffffffffffffffffffffffffffffffffffffff8a1630146139b0576139ad818484815181106138fc576138fc615476565b60209081029190910101516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e811660048301523060248301529091169063dd62ed3e9060440160206040518083038186803b15801561397557600080fd5b505afa158015613989573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb89190614f44565b90505b613a13818484815181106139c6576139c6615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166375de29026040518163ffffffff1660e01b815260040160206040518083038186803b15801561397557600080fd5b90508015613e585773ffffffffffffffffffffffffffffffffffffffff8a163014613b0657828281518110613a4a57613a4a615476565b60209081029190910101516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015230602483015260448201849052909116906323b872dd90606401602060405180830381600087803b158015613acc57600080fd5b505af1158015613ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b049190614f22565b505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8814613da5576000613c78848481518110613b4457613b44615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b158015613b9157600080fd5b505afa158015613ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc99190614f44565b610f36868681518110613bde57613bde615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613c2b57600080fd5b505afa158015613c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c639190614f44565b613c6e90600a61521c565b610f308d8c61325e565b9050600081118015613c8957508181105b15613d4557613d3e848481518110613ca357613ca3615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b8152600401613ce591815260200190565b602060405180830381600087803b158015613cff57600080fd5b505af1158015613d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d379190614f44565b8890612935565b9650613d9f565b613d9c848481518110613d5a57613d5a615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d846040518263ffffffff1660e01b8152600401613ce591815260200190565b96505b50613e4b565b613e48838381518110613dba57613dba615476565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613e0957600080fd5b505af1158015613e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e419190614f44565b8790612935565b95505b858811613e585750613e6c565b505b80613e64816153cb565b9150506137a3565b508584118015613f8d5750613f818373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613ec057600080fd5b505afa158015613ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ef89190614f44565b613f0390600a61521c565b8473ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4957600080fd5b505afa158015613f5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f369190614f44565b613f8b858861325e565b115b1561415857613f9c848761325e565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff858116602483015284169063dd62ed3e9060440160206040518083038186803b15801561400957600080fd5b505afa15801561401d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140419190614f44565b10156140885761408873ffffffffffffffffffffffffffffffffffffffff8316847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6148b0565b73ffffffffffffffffffffffffffffffffffffffff8316636e553f656140ae868961325e565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152600481019190915273ffffffffffffffffffffffffffffffffffffffff8b166024820152604401602060405180830381600087803b15801561411b57600080fd5b505af115801561412f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141539190614f44565b508593505b73ffffffffffffffffffffffffffffffffffffffff871630146141965761419673ffffffffffffffffffffffffffffffffffffffff83168886614773565b50505095945050505050565b6000806141ae87611966565b905073ffffffffffffffffffffffffffffffffffffffff81166141d5576000915050612176565b8683156142f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851461422a5761422573ffffffffffffffffffffffffffffffffffffffff8216883088614a41565b6142f1565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80891660048301526142f19189913091908516906370a082319060240160206040518083038186803b15801561429a57600080fd5b505afa1580156142ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142d29190614f44565b73ffffffffffffffffffffffffffffffffffffffff8516929190614a41565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015286919083169063dd62ed3e9060440160206040518083038186803b15801561436157600080fd5b505afa158015614375573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143999190614f44565b1015614402576143c173ffffffffffffffffffffffffffffffffffffffff82168360006148b0565b61440273ffffffffffffffffffffffffffffffffffffffff8216837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6148b0565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b15801561446a57600080fd5b505afa15801561447e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a29190614f44565b905073ffffffffffffffffffffffffffffffffffffffff87163014614570576040517f6e553f650000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff8881166024830152841690636e553f65906044015b602060405180830381600087803b15801561453257600080fd5b505af1158015614546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456a9190614f44565b5061466c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86146145ea576040517fb6b55f250000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff84169063b6b55f2590602401614518565b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561463257600080fd5b505af1158015614646573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061466a9190614f44565b505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b1580156146d457600080fd5b505afa1580156146e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061470c9190614f44565b9050614718828261325e565b945073ffffffffffffffffffffffffffffffffffffffff891630148015906147405750600081115b156147665761476673ffffffffffffffffffffffffffffffffffffffff84168a83614773565b5050505095945050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526148479084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614a9f565b505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600d6020526040902054815111156110175773ffffffffffffffffffffffffffffffffffffffff82166000908152600d60209081526040909120825161484792840190614cf7565b80158061495f57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561492557600080fd5b505afa158015614939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061495d9190614f44565b155b6149eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610717565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526148479084907f095ea7b300000000000000000000000000000000000000000000000000000000906064016147c5565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261351b9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016147c5565b6000614b01826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614bab9092919063ffffffff16565b8051909150156148475780806020019051810190614b1f9190614f22565b614847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610717565b606061320f848460008585843b614c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610717565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051614c479190615015565b60006040518083038185875af1925050503d8060008114614c84576040519150601f19603f3d011682016040523d82523d6000602084013e614c89565b606091505b5091509150614c99828286614ca4565b979650505050505050565b60608315614cb35750816110ee565b825115614cc35782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107179190615103565b828054828255906000526020600020908101928215614d71579160200282015b82811115614d7157825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614d17565b50614d7d929150614d81565b5090565b5b80821115614d7d5760008155600101614d82565b600060208284031215614da857600080fd5b81356110ee816154d4565b600060208284031215614dc557600080fd5b81516110ee816154d4565b60008060408385031215614de357600080fd5b8235614dee816154d4565b91506020830135614dfe816154d4565b809150509250929050565b600080600060608486031215614e1e57600080fd5b8335614e29816154d4565b92506020840135614e39816154d4565b929592945050506040919091013590565b600080600080600080600060e0888a031215614e6557600080fd5b8735614e70816154d4565b96506020880135614e80816154d4565b95506040880135945060608801359350608088013560ff81168114614ea457600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215614ed457600080fd5b8235614edf816154d4565b946020939093013593505050565b600080600060608486031215614f0257600080fd5b8335614f0d816154d4565b95602085013595506040909401359392505050565b600060208284031215614f3457600080fd5b815180151581146110ee57600080fd5b600060208284031215614f5657600080fd5b5051919050565b60008060408385031215614f7057600080fd5b50508035926020909101359150565b600080600080600060808688031215614f9757600080fd5b85359450602086013593506040860135614fb0816154d4565b9250606086013567ffffffffffffffff80821115614fcd57600080fd5b818801915088601f830112614fe157600080fd5b813581811115614ff057600080fd5b89602082850101111561500257600080fd5b9699959850939650602001949392505050565b6000825161502781846020870161539f565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b6020808252825182820181905260009190848201906040850190845b818110156150f757835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016150c5565b50909695505050505050565b602081526000825180602084015261512281604085016020870161539f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000821982111561516757615167615418565b500190565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8084168061519b5761519b615447565b92169190910492915050565b6000826151b6576151b6615447565b500490565b600181815b8085111561521457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156151fa576151fa615418565b8085161561520757918102915b93841c93908002906151c0565b509250929050565b60006110ee838360008261523257506001610d11565b8161523f57506000610d11565b8160018114615255576002811461525f5761527b565b6001915050610d11565b60ff84111561527057615270615418565b50506001821b610d11565b5060208310610133831016604e8410600b841016171561529e575081810a610d11565b6152a883836151bb565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156152da576152da615418565b029392505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083168185168183048111821515161561531d5761531d615418565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561535e5761535e615418565b500290565b60008282101561537557615375615418565b500390565b600063ffffffff8381169083168181101561539757615397615418565b039392505050565b60005b838110156153ba5781810151838201526020016153a2565b8381111561351b5750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153fd576153fd615418565b5060010190565b60008261541357615413615447565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146154f657600080fd5b5056fea264697066735822122001183ca384ed9641ab9a4b1426aebdc987104748bfe3a2ac01fc39baf3e5db6764736f6c63430008060033