0x608060405234801561001057600080fd5b506004361061021c5760003560e01c806370a0823111610125578063a9059cbb116100ad578063d5abeb011161007c578063d5abeb011461047c578063da6841aa14610485578063dc1d4fb71461048d578063dd62ed3e14610495578063f1127ed8146104a857600080fd5b8063a9059cbb1461043b578063b33712c51461044e578063c3cda52014610456578063d505accf1461046957600080fd5b806391ddadf4116100f457806391ddadf4146103e157806395d89b41146104005780639ab24eb0146104085780639d2f83f01461041b5780639dc29fac1461042857600080fd5b806370a082311461038d5780637ecebe00146103a057806384b0196e146103b35780638e539e8c146103ce57600080fd5b806340c10f19116101a85780634c761240116101775780634c76124014610307578063587cde1e1461030f5780635c19a95c1461033a5780635c975abb1461034d5780636fcfff451461036557600080fd5b806340c10f19146102d9578063439766ce146102ec578063466916ca146102f45780634bf5d7e9146102ff57600080fd5b806318160ddd116101ef57806318160ddd1461028657806323b872dd1461029c578063313ce567146102af5780633644e515146102be5780633a46b1a8146102c657600080fd5b806301ffc9a71461022157806306fdde0314610249578063095ea7b31461025e5780631794bb3c14610271575b600080fd5b61023461022f36600461258c565b6104e7565b60405190151581526020015b60405180910390f35b610251610504565b60405161024091906125fc565b61023461026c36600461262b565b6105ad565b61028461027f366004612655565b6105c0565b005b61028e6107ea565b604051908152602001610240565b6102346102aa366004612655565b610819565b60405160128152602001610240565b61028e61084f565b61028e6102d436600461262b565b610859565b6102846102e736600461262b565b6108ec565b6102846109e4565b60005460ff16610234565b610251610a49565b610284610ac1565b61032261031d366004612691565b610afd565b6040516001600160a01b039091168152602001610240565b610284610348366004612691565b610b28565b600080516020612b778339815191525460ff16610234565b610378610373366004612691565b610b33565b60405163ffffffff9091168152602001610240565b61028e61039b366004612691565b610b3e565b61028e6103ae366004612691565b610b49565b6103bb610b54565b60405161024097969594939291906126ac565b61028e6103dc366004612742565b610c00565b6103e9610c7c565b60405165ffffffffffff9091168152602001610240565b610251610c86565b61028e610416366004612691565b610cc5565b6000546102349060ff1681565b61028461043636600461262b565b610d25565b61023461044936600461262b565b610dc2565b610284610df6565b61028461046436600461276c565b610e59565b6102846104773660046127c4565b610f16565b61028e60035481565b60025461028e565b610284611032565b61028e6104a336600461282e565b611071565b6104bb6104b6366004612861565b6110bd565b60408051825165ffffffffffff1681526020928301516001600160d01b03169281019290925201610240565b60006301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000600080516020612b378339815191525b9050806003018054610529906128a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610555906128a1565b80156105a25780601f10610577576101008083540402835291602001916105a2565b820191906000526020600020905b81548152906001019060200180831161058557829003601f168201915b505050505091505090565b60006105b983836110db565b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156106065750825b905060008267ffffffffffffffff1660011480156106235750303b155b905081158015610631575080155b1561064f5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561067957845460ff60401b1916600160401b1785555b6106bb604051806040016040528060048152602001635669636560e01b815250604051806040016040528060048152602001635649434560e01b8152506110e9565b6106c36110fb565b6106e8604051806040016040528060048152602001635669636560e01b81525061110b565b6106f0611139565b6001600160a01b0388161580159061071057506001600160a01b03871615155b6107565760405162461bcd60e51b81526020600482015260126024820152711059191c995cdcc81e995c9bc81a5b9c1d5d60721b60448201526064015b60405180910390fd5b600180546001600160a01b0319166001600160a01b038a81169190911790915560008054610100600160a81b031916610100928a1692909202919091179055600386905583156107e057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60006108147f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b905090565b6000811561082a5761082a83611141565b6108358484846111b8565b50811561084557610845846111dc565b5060019392505050565b6000610814611210565b6000600080516020612b1783398151915281610873610c7c565b90508065ffffffffffff1684106108ae57604051637669fc0f60e11b81526004810185905265ffffffffffff8216602482015260440161074d565b6108da6108ba8561121a565b6001600160a01b0387166000908152600185016020526040902090611251565b6001600160d01b031695945050505050565b6108f4611307565b60005460ff1615610918576040516301ca793160e61b815260040160405180910390fd5b60015460405163d59b266f60e01b81523360048201526001600160a01b039091169063d59b266f9060240160006040518083038186803b15801561095b57600080fd5b505afa15801561096f573d6000803e3d6000fd5b505050506003548161097f6107ea565b61098991906128f1565b11156109c757806109986107ea565b6109a291906128f1565b60035460405163adc3cee560e01b81526004810192909252602482015260440161074d565b80156109d6576109d682611141565b6109e08282611338565b5050565b60015460405163d59b266f60e01b81523360048201526001600160a01b039091169063d59b266f9060240160006040518083038186803b158015610a2757600080fd5b505afa158015610a3b573d6000803e3d6000fd5b50505050610a4761136e565b565b6060610a536113cb565b65ffffffffffff16610a63610c7c565b65ffffffffffff1614610a89576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b60005461010090046001600160a01b03163314610af157604051631a1a6da960e01b815260040160405180910390fd5b6000805460ff19169055565b6001600160a01b039081166000908152600080516020612b1783398151915260205260409020541690565b336109e081836113d6565b60006104fe82611466565b60006104fe826114b7565b60006104fe826114ea565b60006060808280808381600080516020612b578339815191528054909150158015610b8157506001810154155b610bc55760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b604482015260640161074d565b610bcd6114f5565b610bd5611534565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000600080516020612b1783398151915281610c1a610c7c565b90508065ffffffffffff168410610c5557604051637669fc0f60e11b81526004810185905265ffffffffffff8216602482015260440161074d565b610c6b610c618561121a565b6002840190611251565b6001600160d01b0316949350505050565b60006108146113cb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace048054606091600080516020612b3783398151915291610529906128a1565b6001600160a01b03811660009081527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0160205260408120600080516020612b1783398151915290610d159061154c565b6001600160d01b03169392505050565b610d2d611307565b60005460ff1615610d51576040516301ca793160e61b815260040160405180910390fd5b6001600160a01b0382163314610da95760405162461bcd60e51b815260206004820152601f60248201527f557365722063616e206f6e6c79206275726e206f776e656420746f6b656e7300604482015260640161074d565b610db38282611585565b80156109e0576109e0826111dc565b60008115610dd357610dd383611141565b610ddd83836115bb565b508115610ded57610ded336111dc565b50600192915050565b60015460405163d59b266f60e01b81523360048201526001600160a01b039091169063d59b266f9060240160006040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b50505050610a476115c9565b83421115610e7d57604051632341d78760e11b81526004810185905260240161074d565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610ef790610eef9060a0016040516020818303038152906040528051906020012061160f565b85858561163c565b9050610f03818761166a565b610f0d81886113d6565b50505050505050565b83421115610f3a5760405163313c898160e11b81526004810185905260240161074d565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f698c6116ae565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610fc48261160f565b90506000610fd48287878761163c565b9050896001600160a01b0316816001600160a01b03161461101b576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161074d565b6110268a8a8a6116f0565b50505050505050505050565b60005461010090046001600160a01b0316331461106257604051631a1a6da960e01b815260040160405180910390fd5b6000805460ff19166001179055565b6001600160a01b0380831660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace01602090815260408083209385168352929052908120546105b9565b60408051808201909152600080825260208201526105b983836116fd565b6000336108458185856116f0565b6110f1611768565b6109e082826117b1565b611103611768565b610a47611802565b611113611768565b61113681604051806040016040528060018152602001603160f81b815250611823565b50565b610a47611768565b6001600160a01b038116158015906111615750600061115f82610b3e565b145b1561117a576002600081546111759061291a565b909155505b7f523ed68c34259142bf5cc24c7701db6f716684bca4afa07f94c1b453493306926002546040516111ad91815260200190565b60405180910390a150565b6000336111c6858285611884565b6111d18585856118e4565b506001949350505050565b6001600160a01b038116158015906111fc575060006111fa82610b3e565b145b1561117a5760026000815461117590612933565b6000610814611943565b600065ffffffffffff82111561124d576040516306dfcc6560e41b8152603060048201526024810183905260440161074d565b5090565b8154600090818160058111156112b057600061126c846119b7565b611276908561294a565b60008881526020902090915081015465ffffffffffff90811690871610156112a0578091506112ae565b6112ab8160016128f1565b92505b505b60006112be87878585611a9f565b905080156112f9576112e3876112d560018461294a565b600091825260209091200190565b54600160301b90046001600160d01b03166112fc565b60005b979650505050505050565b600080516020612b778339815191525460ff1615610a475760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0382166113625760405163ec442f0560e01b81526000600482015260240161074d565b6109e060008383611b01565b611376611307565b600080516020612b77833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b0390911681526020016111ad565b60006108144361121a565b600080516020612b1783398151915260006113f084610afd565b6001600160a01b0385811660008181526020869052604080822080546001600160a01b031916898616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611460818461145b87611b0c565b611b17565b50505050565b6001600160a01b03811660009081527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d016020526040812054600080516020612b17833981519152906105b990611c91565b600080600080516020612b378339815191525b6001600160a01b0390931660009081526020939093525050604090205490565b60006104fe82611cc2565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028054606091600080516020612b5783398151915291610529906128a1565b60606000600080516020612b57833981519152610518565b8054600090801561157c57611566836112d560018461294a565b54600160301b90046001600160d01b03166105b9565b60009392505050565b6001600160a01b0382166115af57604051634b637e8f60e11b81526000600482015260240161074d565b6109e082600083611b01565b6000336108458185856118e4565b6115d1611ceb565b600080516020612b77833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336113b3565b60006104fe61161c611210565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060008061164e88888888611d1b565b92509250925061165e8282611dea565b50909695505050505050565b6000611675836116ae565b90508082146116a9576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161074d565b505050565b6001600160a01b031660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6116a98383836001611ea3565b604080518082018252600080825260208083018290526001600160a01b03861682527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d01905291909120600080516020612b17833981519152906117609084611f8b565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a4757604051631afcd79f60e31b815260040160405180910390fd5b6117b9611768565b600080516020612b378339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036117f384826129ab565b506004810161146083826129ab565b61180a611768565b600080516020612b77833981519152805460ff19169055565b61182b611768565b600080516020612b578339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10261186584826129ab565b506003810161187483826129ab565b5060008082556001909101555050565b60006118908484611071565b9050600019811461146057818110156118d557604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161074d565b61146084848484036000611ea3565b6001600160a01b03831661190e57604051634b637e8f60e11b81526000600482015260240161074d565b6001600160a01b0382166119385760405163ec442f0560e01b81526000600482015260240161074d565b6116a9838383611b01565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61196e611ffb565b611976612065565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036119c957506000919050565b600060016119d6846120a9565b901c6001901b905060018184816119ef576119ef612a6b565b048201901c90506001818481611a0757611a07612a6b565b048201901c90506001818481611a1f57611a1f612a6b565b048201901c90506001818481611a3757611a37612a6b565b048201901c90506001818481611a4f57611a4f612a6b565b048201901c90506001818481611a6757611a67612a6b565b048201901c90506001818481611a7f57611a7f612a6b565b048201901c90506105b981828581611a9957611a99612a6b565b0461213d565b60005b81831015611af9576000611ab68484612153565b60008781526020902090915065ffffffffffff86169082015465ffffffffffff161115611ae557809250611af3565b611af08160016128f1565b93505b50611aa2565b509392505050565b6116a983838361216e565b60006104fe82610b3e565b600080516020612b178339815191526001600160a01b0384811690841614801590611b425750600082115b15611460576001600160a01b03841615611bec576001600160a01b038416600090815260018201602052604081208190611b87906121d4611b82876121e0565b612214565b6001600160d01b031691506001600160d01b03169150856001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611be1929190918252602082015260400190565b60405180910390a250505b6001600160a01b03831615611460576001600160a01b038316600090815260018201602052604081208190611c279061224d611b82876121e0565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c81929190918252602082015260400190565b60405180910390a2505050505050565b600063ffffffff82111561124d576040516306dfcc6560e41b8152602060048201526024810183905260440161074d565b6000807f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006114ca565b600080516020612b778339815191525460ff16610a4757604051638dfc202b60e01b815260040160405180910390fd5b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611d565750600091506003905082611de0565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611daa573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611dd657506000925060019150829050611de0565b9250600091508190505b9450945094915050565b6000826003811115611dfe57611dfe612a81565b03611e07575050565b6001826003811115611e1b57611e1b612a81565b03611e395760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611e4d57611e4d612a81565b03611e6e5760405163fce698f760e01b81526004810182905260240161074d565b6003826003811115611e8257611e82612a81565b036109e0576040516335e2f38360e21b81526004810182905260240161074d565b600080516020612b378339815191526001600160a01b038516611edc5760405163e602df0560e01b81526000600482015260240161074d565b6001600160a01b038416611f0657604051634a1406b160e11b81526000600482015260240161074d565b6001600160a01b03808616600090815260018301602090815260408083209388168352929052208390558115611f8457836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611f7b91815260200190565b60405180910390a35b5050505050565b6040805180820190915260008082526020820152826000018263ffffffff1681548110611fba57611fba612a97565b60009182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b6000600080516020612b57833981519152816120156114f5565b80519091501561202d57805160209091012092915050565b8154801561203c579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b6000600080516020612b578339815191528161207f611534565b80519091501561209757805160209091012092915050565b6001820154801561203c579392505050565b600080608083901c156120be57608092831c92015b604083901c156120d057604092831c92015b602083901c156120e257602092831c92015b601083901c156120f457601092831c92015b600883901c1561210657600892831c92015b600483901c1561211857600492831c92015b600283901c1561212a57600292831c92015b600183901c156104fe5760010192915050565b600081831061214c57816105b9565b5090919050565b60006121626002848418612aad565b6105b9908484166128f1565b612179838383612259565b6001600160a01b0383166121c95760006121916107ea565b90506001600160d01b03808211156121c657604051630e58ae9360e11b8152600481018390526024810182905260440161074d565b50505b6116a9838383612397565b60006105b98284612acf565b60006001600160d01b0382111561124d576040516306dfcc6560e41b815260d060048201526024810183905260440161074d565b600080612240612222610c7c565b61223861222e8861154c565b868863ffffffff16565b879190612409565b915091505b935093915050565b60006105b98284612af6565b600080516020612b378339815191526001600160a01b038416612295578181600201600082825461228a91906128f1565b909155506123079050565b6001600160a01b038416600090815260208290526040902054828110156122e85760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161074d565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b038316612325576002810180548390039055612344565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161238991815260200190565b60405180910390a350505050565b600080516020612b178339815191526001600160a01b0384166123ca576123c78160020161224d611b82856121e0565b50505b6001600160a01b0383166123ee576123eb816002016121d4611b82856121e0565b50505b6114606123fa85610afd565b61240385610afd565b84611b17565b600080612240858585825460009081908015612531576000612430876112d560018561294a565b60408051808201909152905465ffffffffffff808216808452600160301b9092046001600160d01b03166020840152919250908716101561248457604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff8088169116036124d057846124a7886112d560018661294a565b80546001600160d01b0392909216600160301b0265ffffffffffff909216919091179055612521565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160301b029216919091179101555b6020015192508391506122459050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160301b029190931617920191909155905081612245565b60006020828403121561259e57600080fd5b81356001600160e01b0319811681146105b957600080fd5b6000815180845260005b818110156125dc576020818501810151868301820152016125c0565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006105b960208301846125b6565b80356001600160a01b038116811461262657600080fd5b919050565b6000806040838503121561263e57600080fd5b6126478361260f565b946020939093013593505050565b60008060006060848603121561266a57600080fd5b6126738461260f565b92506126816020850161260f565b9150604084013590509250925092565b6000602082840312156126a357600080fd5b6105b98261260f565b60ff60f81b881681526000602060e0818401526126cc60e084018a6125b6565b83810360408501526126de818a6125b6565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b8181101561273057835183529284019291840191600101612714565b50909c9b505050505050505050505050565b60006020828403121561275457600080fd5b5035919050565b803560ff8116811461262657600080fd5b60008060008060008060c0878903121561278557600080fd5b61278e8761260f565b955060208701359450604087013593506127aa6060880161275b565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a0312156127df57600080fd5b6127e88861260f565b96506127f66020890161260f565b955060408801359450606088013593506128126080890161275b565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561284157600080fd5b61284a8361260f565b91506128586020840161260f565b90509250929050565b6000806040838503121561287457600080fd5b61287d8361260f565b9150602083013563ffffffff8116811461289657600080fd5b809150509250929050565b600181811c908216806128b557607f821691505b6020821081036128d557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104fe576104fe6128db565b634e487b7160e01b600052604160045260246000fd5b60006001820161292c5761292c6128db565b5060010190565b600081612942576129426128db565b506000190190565b818103818111156104fe576104fe6128db565b601f8211156116a957600081815260208120601f850160051c810160208610156129845750805b601f850160051c820191505b818110156129a357828155600101612990565b505050505050565b815167ffffffffffffffff8111156129c5576129c5612904565b6129d9816129d384546128a1565b8461295d565b602080601f831160018114612a0e57600084156129f65750858301515b600019600386901b1c1916600185901b1785556129a3565b600085815260208120601f198616915b82811015612a3d57888601518255948401946001909101908401612a1e565b5085821015612a5b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600082612aca57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160d01b03828116828216039080821115612aef57612aef6128db565b5092915050565b6001600160d01b03818116838216019080821115612aef57612aef6128db56fee8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a264697066735822122006327215ee8cadc2420cf5265f63e81cdec3a83c730455621c331c6d3527b36264736f6c63430008150033
0x608060405234801561001057600080fd5b50612bcc806100206000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806370a0823111610125578063a9059cbb116100ad578063d5abeb011161007c578063d5abeb011461047c578063da6841aa14610485578063dc1d4fb71461048d578063dd62ed3e14610495578063f1127ed8146104a857600080fd5b8063a9059cbb1461043b578063b33712c51461044e578063c3cda52014610456578063d505accf1461046957600080fd5b806391ddadf4116100f457806391ddadf4146103e157806395d89b41146104005780639ab24eb0146104085780639d2f83f01461041b5780639dc29fac1461042857600080fd5b806370a082311461038d5780637ecebe00146103a057806384b0196e146103b35780638e539e8c146103ce57600080fd5b806340c10f19116101a85780634c761240116101775780634c76124014610307578063587cde1e1461030f5780635c19a95c1461033a5780635c975abb1461034d5780636fcfff451461036557600080fd5b806340c10f19146102d9578063439766ce146102ec578063466916ca146102f45780634bf5d7e9146102ff57600080fd5b806318160ddd116101ef57806318160ddd1461028657806323b872dd1461029c578063313ce567146102af5780633644e515146102be5780633a46b1a8146102c657600080fd5b806301ffc9a71461022157806306fdde0314610249578063095ea7b31461025e5780631794bb3c14610271575b600080fd5b61023461022f36600461258c565b6104e7565b60405190151581526020015b60405180910390f35b610251610504565b60405161024091906125fc565b61023461026c36600461262b565b6105ad565b61028461027f366004612655565b6105c0565b005b61028e6107ea565b604051908152602001610240565b6102346102aa366004612655565b610819565b60405160128152602001610240565b61028e61084f565b61028e6102d436600461262b565b610859565b6102846102e736600461262b565b6108ec565b6102846109e4565b60005460ff16610234565b610251610a49565b610284610ac1565b61032261031d366004612691565b610afd565b6040516001600160a01b039091168152602001610240565b610284610348366004612691565b610b28565b600080516020612b778339815191525460ff16610234565b610378610373366004612691565b610b33565b60405163ffffffff9091168152602001610240565b61028e61039b366004612691565b610b3e565b61028e6103ae366004612691565b610b49565b6103bb610b54565b60405161024097969594939291906126ac565b61028e6103dc366004612742565b610c00565b6103e9610c7c565b60405165ffffffffffff9091168152602001610240565b610251610c86565b61028e610416366004612691565b610cc5565b6000546102349060ff1681565b61028461043636600461262b565b610d25565b61023461044936600461262b565b610dc2565b610284610df6565b61028461046436600461276c565b610e59565b6102846104773660046127c4565b610f16565b61028e60035481565b60025461028e565b610284611032565b61028e6104a336600461282e565b611071565b6104bb6104b6366004612861565b6110bd565b60408051825165ffffffffffff1681526020928301516001600160d01b03169281019290925201610240565b60006301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000600080516020612b378339815191525b9050806003018054610529906128a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610555906128a1565b80156105a25780601f10610577576101008083540402835291602001916105a2565b820191906000526020600020905b81548152906001019060200180831161058557829003601f168201915b505050505091505090565b60006105b983836110db565b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156106065750825b905060008267ffffffffffffffff1660011480156106235750303b155b905081158015610631575080155b1561064f5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561067957845460ff60401b1916600160401b1785555b6106bb604051806040016040528060048152602001635669636560e01b815250604051806040016040528060048152602001635649434560e01b8152506110e9565b6106c36110fb565b6106e8604051806040016040528060048152602001635669636560e01b81525061110b565b6106f0611139565b6001600160a01b0388161580159061071057506001600160a01b03871615155b6107565760405162461bcd60e51b81526020600482015260126024820152711059191c995cdcc81e995c9bc81a5b9c1d5d60721b60448201526064015b60405180910390fd5b600180546001600160a01b0319166001600160a01b038a81169190911790915560008054610100600160a81b031916610100928a1692909202919091179055600386905583156107e057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60006108147f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b905090565b6000811561082a5761082a83611141565b6108358484846111b8565b50811561084557610845846111dc565b5060019392505050565b6000610814611210565b6000600080516020612b1783398151915281610873610c7c565b90508065ffffffffffff1684106108ae57604051637669fc0f60e11b81526004810185905265ffffffffffff8216602482015260440161074d565b6108da6108ba8561121a565b6001600160a01b0387166000908152600185016020526040902090611251565b6001600160d01b031695945050505050565b6108f4611307565b60005460ff1615610918576040516301ca793160e61b815260040160405180910390fd5b60015460405163d59b266f60e01b81523360048201526001600160a01b039091169063d59b266f9060240160006040518083038186803b15801561095b57600080fd5b505afa15801561096f573d6000803e3d6000fd5b505050506003548161097f6107ea565b61098991906128f1565b11156109c757806109986107ea565b6109a291906128f1565b60035460405163adc3cee560e01b81526004810192909252602482015260440161074d565b80156109d6576109d682611141565b6109e08282611338565b5050565b60015460405163d59b266f60e01b81523360048201526001600160a01b039091169063d59b266f9060240160006040518083038186803b158015610a2757600080fd5b505afa158015610a3b573d6000803e3d6000fd5b50505050610a4761136e565b565b6060610a536113cb565b65ffffffffffff16610a63610c7c565b65ffffffffffff1614610a89576040516301bfc1c560e61b815260040160405180910390fd5b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b60005461010090046001600160a01b03163314610af157604051631a1a6da960e01b815260040160405180910390fd5b6000805460ff19169055565b6001600160a01b039081166000908152600080516020612b1783398151915260205260409020541690565b336109e081836113d6565b60006104fe82611466565b60006104fe826114b7565b60006104fe826114ea565b60006060808280808381600080516020612b578339815191528054909150158015610b8157506001810154155b610bc55760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b604482015260640161074d565b610bcd6114f5565b610bd5611534565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b6000600080516020612b1783398151915281610c1a610c7c565b90508065ffffffffffff168410610c5557604051637669fc0f60e11b81526004810185905265ffffffffffff8216602482015260440161074d565b610c6b610c618561121a565b6002840190611251565b6001600160d01b0316949350505050565b60006108146113cb565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace048054606091600080516020612b3783398151915291610529906128a1565b6001600160a01b03811660009081527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0160205260408120600080516020612b1783398151915290610d159061154c565b6001600160d01b03169392505050565b610d2d611307565b60005460ff1615610d51576040516301ca793160e61b815260040160405180910390fd5b6001600160a01b0382163314610da95760405162461bcd60e51b815260206004820152601f60248201527f557365722063616e206f6e6c79206275726e206f776e656420746f6b656e7300604482015260640161074d565b610db38282611585565b80156109e0576109e0826111dc565b60008115610dd357610dd383611141565b610ddd83836115bb565b508115610ded57610ded336111dc565b50600192915050565b60015460405163d59b266f60e01b81523360048201526001600160a01b039091169063d59b266f9060240160006040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b50505050610a476115c9565b83421115610e7d57604051632341d78760e11b81526004810185905260240161074d565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610ef790610eef9060a0016040516020818303038152906040528051906020012061160f565b85858561163c565b9050610f03818761166a565b610f0d81886113d6565b50505050505050565b83421115610f3a5760405163313c898160e11b81526004810185905260240161074d565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f698c6116ae565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610fc48261160f565b90506000610fd48287878761163c565b9050896001600160a01b0316816001600160a01b03161461101b576040516325c0072360e11b81526001600160a01b0380831660048301528b16602482015260440161074d565b6110268a8a8a6116f0565b50505050505050505050565b60005461010090046001600160a01b0316331461106257604051631a1a6da960e01b815260040160405180910390fd5b6000805460ff19166001179055565b6001600160a01b0380831660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace01602090815260408083209385168352929052908120546105b9565b60408051808201909152600080825260208201526105b983836116fd565b6000336108458185856116f0565b6110f1611768565b6109e082826117b1565b611103611768565b610a47611802565b611113611768565b61113681604051806040016040528060018152602001603160f81b815250611823565b50565b610a47611768565b6001600160a01b038116158015906111615750600061115f82610b3e565b145b1561117a576002600081546111759061291a565b909155505b7f523ed68c34259142bf5cc24c7701db6f716684bca4afa07f94c1b453493306926002546040516111ad91815260200190565b60405180910390a150565b6000336111c6858285611884565b6111d18585856118e4565b506001949350505050565b6001600160a01b038116158015906111fc575060006111fa82610b3e565b145b1561117a5760026000815461117590612933565b6000610814611943565b600065ffffffffffff82111561124d576040516306dfcc6560e41b8152603060048201526024810183905260440161074d565b5090565b8154600090818160058111156112b057600061126c846119b7565b611276908561294a565b60008881526020902090915081015465ffffffffffff90811690871610156112a0578091506112ae565b6112ab8160016128f1565b92505b505b60006112be87878585611a9f565b905080156112f9576112e3876112d560018461294a565b600091825260209091200190565b54600160301b90046001600160d01b03166112fc565b60005b979650505050505050565b600080516020612b778339815191525460ff1615610a475760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0382166113625760405163ec442f0560e01b81526000600482015260240161074d565b6109e060008383611b01565b611376611307565b600080516020612b77833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b0390911681526020016111ad565b60006108144361121a565b600080516020612b1783398151915260006113f084610afd565b6001600160a01b0385811660008181526020869052604080822080546001600160a01b031916898616908117909155905194955093928516927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611460818461145b87611b0c565b611b17565b50505050565b6001600160a01b03811660009081527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d016020526040812054600080516020612b17833981519152906105b990611c91565b600080600080516020612b378339815191525b6001600160a01b0390931660009081526020939093525050604090205490565b60006104fe82611cc2565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028054606091600080516020612b5783398151915291610529906128a1565b60606000600080516020612b57833981519152610518565b8054600090801561157c57611566836112d560018461294a565b54600160301b90046001600160d01b03166105b9565b60009392505050565b6001600160a01b0382166115af57604051634b637e8f60e11b81526000600482015260240161074d565b6109e082600083611b01565b6000336108458185856118e4565b6115d1611ceb565b600080516020612b77833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336113b3565b60006104fe61161c611210565b8360405161190160f01b8152600281019290925260228201526042902090565b60008060008061164e88888888611d1b565b92509250925061165e8282611dea565b50909695505050505050565b6000611675836116ae565b90508082146116a9576040516301d4b62360e61b81526001600160a01b03841660048201526024810182905260440161074d565b505050565b6001600160a01b031660009081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6116a98383836001611ea3565b604080518082018252600080825260208083018290526001600160a01b03861682527fe8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d01905291909120600080516020612b17833981519152906117609084611f8b565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a4757604051631afcd79f60e31b815260040160405180910390fd5b6117b9611768565b600080516020612b378339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036117f384826129ab565b506004810161146083826129ab565b61180a611768565b600080516020612b77833981519152805460ff19169055565b61182b611768565b600080516020612b578339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10261186584826129ab565b506003810161187483826129ab565b5060008082556001909101555050565b60006118908484611071565b9050600019811461146057818110156118d557604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161074d565b61146084848484036000611ea3565b6001600160a01b03831661190e57604051634b637e8f60e11b81526000600482015260240161074d565b6001600160a01b0382166119385760405163ec442f0560e01b81526000600482015260240161074d565b6116a9838383611b01565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61196e611ffb565b611976612065565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6000816000036119c957506000919050565b600060016119d6846120a9565b901c6001901b905060018184816119ef576119ef612a6b565b048201901c90506001818481611a0757611a07612a6b565b048201901c90506001818481611a1f57611a1f612a6b565b048201901c90506001818481611a3757611a37612a6b565b048201901c90506001818481611a4f57611a4f612a6b565b048201901c90506001818481611a6757611a67612a6b565b048201901c90506001818481611a7f57611a7f612a6b565b048201901c90506105b981828581611a9957611a99612a6b565b0461213d565b60005b81831015611af9576000611ab68484612153565b60008781526020902090915065ffffffffffff86169082015465ffffffffffff161115611ae557809250611af3565b611af08160016128f1565b93505b50611aa2565b509392505050565b6116a983838361216e565b60006104fe82610b3e565b600080516020612b178339815191526001600160a01b0384811690841614801590611b425750600082115b15611460576001600160a01b03841615611bec576001600160a01b038416600090815260018201602052604081208190611b87906121d4611b82876121e0565b612214565b6001600160d01b031691506001600160d01b03169150856001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611be1929190918252602082015260400190565b60405180910390a250505b6001600160a01b03831615611460576001600160a01b038316600090815260018201602052604081208190611c279061224d611b82876121e0565b6001600160d01b031691506001600160d01b03169150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611c81929190918252602082015260400190565b60405180910390a2505050505050565b600063ffffffff82111561124d576040516306dfcc6560e41b8152602060048201526024810183905260440161074d565b6000807f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006114ca565b600080516020612b778339815191525460ff16610a4757604051638dfc202b60e01b815260040160405180910390fd5b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611d565750600091506003905082611de0565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611daa573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611dd657506000925060019150829050611de0565b9250600091508190505b9450945094915050565b6000826003811115611dfe57611dfe612a81565b03611e07575050565b6001826003811115611e1b57611e1b612a81565b03611e395760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611e4d57611e4d612a81565b03611e6e5760405163fce698f760e01b81526004810182905260240161074d565b6003826003811115611e8257611e82612a81565b036109e0576040516335e2f38360e21b81526004810182905260240161074d565b600080516020612b378339815191526001600160a01b038516611edc5760405163e602df0560e01b81526000600482015260240161074d565b6001600160a01b038416611f0657604051634a1406b160e11b81526000600482015260240161074d565b6001600160a01b03808616600090815260018301602090815260408083209388168352929052208390558115611f8457836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611f7b91815260200190565b60405180910390a35b5050505050565b6040805180820190915260008082526020820152826000018263ffffffff1681548110611fba57611fba612a97565b60009182526020918290206040805180820190915291015465ffffffffffff81168252600160301b90046001600160d01b0316918101919091529392505050565b6000600080516020612b57833981519152816120156114f5565b80519091501561202d57805160209091012092915050565b8154801561203c579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b6000600080516020612b578339815191528161207f611534565b80519091501561209757805160209091012092915050565b6001820154801561203c579392505050565b600080608083901c156120be57608092831c92015b604083901c156120d057604092831c92015b602083901c156120e257602092831c92015b601083901c156120f457601092831c92015b600883901c1561210657600892831c92015b600483901c1561211857600492831c92015b600283901c1561212a57600292831c92015b600183901c156104fe5760010192915050565b600081831061214c57816105b9565b5090919050565b60006121626002848418612aad565b6105b9908484166128f1565b612179838383612259565b6001600160a01b0383166121c95760006121916107ea565b90506001600160d01b03808211156121c657604051630e58ae9360e11b8152600481018390526024810182905260440161074d565b50505b6116a9838383612397565b60006105b98284612acf565b60006001600160d01b0382111561124d576040516306dfcc6560e41b815260d060048201526024810183905260440161074d565b600080612240612222610c7c565b61223861222e8861154c565b868863ffffffff16565b879190612409565b915091505b935093915050565b60006105b98284612af6565b600080516020612b378339815191526001600160a01b038416612295578181600201600082825461228a91906128f1565b909155506123079050565b6001600160a01b038416600090815260208290526040902054828110156122e85760405163391434e360e21b81526001600160a01b0386166004820152602481018290526044810184905260640161074d565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b038316612325576002810180548390039055612344565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161238991815260200190565b60405180910390a350505050565b600080516020612b178339815191526001600160a01b0384166123ca576123c78160020161224d611b82856121e0565b50505b6001600160a01b0383166123ee576123eb816002016121d4611b82856121e0565b50505b6114606123fa85610afd565b61240385610afd565b84611b17565b600080612240858585825460009081908015612531576000612430876112d560018561294a565b60408051808201909152905465ffffffffffff808216808452600160301b9092046001600160d01b03166020840152919250908716101561248457604051632520601d60e01b815260040160405180910390fd5b805165ffffffffffff8088169116036124d057846124a7886112d560018661294a565b80546001600160d01b0392909216600160301b0265ffffffffffff909216919091179055612521565b6040805180820190915265ffffffffffff80881682526001600160d01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160301b029216919091179101555b6020015192508391506122459050565b50506040805180820190915265ffffffffffff80851682526001600160d01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160301b029190931617920191909155905081612245565b60006020828403121561259e57600080fd5b81356001600160e01b0319811681146105b957600080fd5b6000815180845260005b818110156125dc576020818501810151868301820152016125c0565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006105b960208301846125b6565b80356001600160a01b038116811461262657600080fd5b919050565b6000806040838503121561263e57600080fd5b6126478361260f565b946020939093013593505050565b60008060006060848603121561266a57600080fd5b6126738461260f565b92506126816020850161260f565b9150604084013590509250925092565b6000602082840312156126a357600080fd5b6105b98261260f565b60ff60f81b881681526000602060e0818401526126cc60e084018a6125b6565b83810360408501526126de818a6125b6565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b8181101561273057835183529284019291840191600101612714565b50909c9b505050505050505050505050565b60006020828403121561275457600080fd5b5035919050565b803560ff8116811461262657600080fd5b60008060008060008060c0878903121561278557600080fd5b61278e8761260f565b955060208701359450604087013593506127aa6060880161275b565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a0312156127df57600080fd5b6127e88861260f565b96506127f66020890161260f565b955060408801359450606088013593506128126080890161275b565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561284157600080fd5b61284a8361260f565b91506128586020840161260f565b90509250929050565b6000806040838503121561287457600080fd5b61287d8361260f565b9150602083013563ffffffff8116811461289657600080fd5b809150509250929050565b600181811c908216806128b557607f821691505b6020821081036128d557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104fe576104fe6128db565b634e487b7160e01b600052604160045260246000fd5b60006001820161292c5761292c6128db565b5060010190565b600081612942576129426128db565b506000190190565b818103818111156104fe576104fe6128db565b601f8211156116a957600081815260208120601f850160051c810160208610156129845750805b601f850160051c820191505b818110156129a357828155600101612990565b505050505050565b815167ffffffffffffffff8111156129c5576129c5612904565b6129d9816129d384546128a1565b8461295d565b602080601f831160018114612a0e57600084156129f65750858301515b600019600386901b1c1916600185901b1785556129a3565b600085815260208120601f198616915b82811015612a3d57888601518255948401946001909101908401612a1e565b5085821015612a5b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600082612aca57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160d01b03828116828216039080821115612aef57612aef6128db565b5092915050565b6001600160d01b03818116838216019080821115612aef57612aef6128db56fee8b26c30fad74198956032a3533d903385d56dd795af560196f9c78d4af40d0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a264697066735822122006327215ee8cadc2420cf5265f63e81cdec3a83c730455621c331c6d3527b36264736f6c63430008150033