608060405234801561001057600080fd5b5061207b806100206000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636fcfff45116100f9578063a457c2d711610097578063c4d66de811610071578063c4d66de8146103c1578063d505accf146103d4578063dd62ed3e146103e7578063f1127ed8146103fa57600080fd5b8063a457c2d714610388578063a9059cbb1461039b578063c3cda520146103ae57600080fd5b80638e539e8c116100d35780638e539e8c1461034757806395d89b411461035a5780639ab24eb0146103625780639dc29fac1461037557600080fd5b80636fcfff45146102e357806370a082311461030b5780637ecebe001461033457600080fd5b8063313ce567116101665780633a46b1a8116101405780633a46b1a81461027c57806340c10f191461028f578063587cde1e146102a45780635c19a95c146102d057600080fd5b8063313ce567146102525780633644e51514610261578063395093511461026957600080fd5b806306fdde03146101ae57806307546172146101cc578063095ea7b3146101f557806318160ddd1461021857806323b872dd1461022a5780632a7c38261461023d575b600080fd5b6101b6610437565b6040516101c39190611cc3565b60405180910390f35b600080516020612026833981519152545b6040516001600160a01b0390911681526020016101c3565b610208610203366004611d2d565b6104c9565b60405190151581526020016101c3565b6035545b6040519081526020016101c3565b610208610238366004611d57565b6104e3565b61021c60008051602061202683398151915281565b604051601281526020016101c3565b61021c610507565b610208610277366004611d2d565b610516565b61021c61028a366004611d2d565b610538565b6102a261029d366004611d2d565b6105b7565b005b6101dd6102b2366004611d93565b6001600160a01b03908116600090815260cc60205260409020541690565b6102a26102de366004611d93565b610605565b6102f66102f1366004611d93565b610612565b60405163ffffffff90911681526020016101c3565b61021c610319366004611d93565b6001600160a01b031660009081526033602052604090205490565b61021c610342366004611d93565b610634565b61021c610355366004611dae565b610652565b6101b66106ae565b61021c610370366004611d93565b6106bd565b6102a2610383366004611d2d565b610743565b610208610396366004611d2d565b61078d565b6102086103a9366004611d2d565b610808565b6102a26103bc366004611dd8565b610816565b6102a26103cf366004611d93565b61094c565b6102a26103e2366004611e30565b610ac9565b61021c6103f5366004611e9a565b610c2d565b61040d610408366004611ecd565b610c58565b60408051825163ffffffff1681526020928301516001600160e01b031692810192909252016101c3565b60606036805461044690611f0d565b80601f016020809104026020016040519081016040528092919081815260200182805461047290611f0d565b80156104bf5780601f10610494576101008083540402835291602001916104bf565b820191906000526020600020905b8154815290600101906020018083116104a257829003601f168201915b5050505050905090565b6000336104d7818585610cdb565b60019150505b92915050565b6000336104f1858285610dff565b6104fc858585610e79565b506001949350505050565b600061051161102a565b905090565b6000336104d78185856105298383610c2d565b6105339190611f57565b610cdb565b600043821061058e5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b6001600160a01b038316600090815260cd602052604090206105b090836110a5565b9392505050565b600080516020612026833981519152546001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b815260040161058590611f6a565b610601828261119b565b5050565b61060f3382611225565b50565b6001600160a01b038116600090815260cd60205260408120546104dd9061129f565b6001600160a01b0381166000908152609960205260408120546104dd565b60004382106106a35760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610585565b6104dd60ce836110a5565b60606037805461044690611f0d565b6001600160a01b038116600090815260cd60205260408120548015610730576001600160a01b038316600090815260cd602052604090206106ff600183611fae565b8154811061070f5761070f611fc1565b600091825260209091200154600160201b90046001600160e01b0316610733565b60005b6001600160e01b03169392505050565b600080516020612026833981519152546001600160a01b0316336001600160a01b0316146107835760405162461bcd60e51b815260040161058590611f6a565b6106018282611308565b6000338161079b8286610c2d565b9050838110156107fb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610585565b6104fc8286868403610cdb565b6000336104d7818585610e79565b834211156108665760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610585565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906108e0906108d89060a00160405160208183030381529060405280519060200120611320565b85858561136e565b90506108eb81611396565b86146109395760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610585565b6109438188611225565b50505050505050565b60006109646000805160206120268339815191525490565b6001600160a01b0316146109ba5760405162461bcd60e51b815260206004820152601f60248201527f496e646578546f6b656e3a20616c726561647920696e697469616c697a6564006044820152606401610585565b60006109c4610437565b80516020918201206040805180820182526001808252601960f91b919094015260658290557fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560668190558151808301909252919350909160ce9182918190610a2d9043611fae565b63ffffffff168152602001610a4160355490565b6001600160e01b0390811690915282546001810184556000938452602080852084519190940151909216600160201b0263ffffffff909216919091179101556000805160206120268339815191528590556040516001600160a01b038616917f726b590ef91a8c76ad05bbe91a57ef84605276528f49cd47d787f558a4e755b691a250505050565b83421115610b195760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610585565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610b488c611396565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610ba382611320565b90506000610bb38287878761136e565b9050896001600160a01b0316816001600160a01b031614610c165760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610585565b610c218a8a8a610cdb565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b60408051808201909152600080825260208201526001600160a01b038316600090815260cd60205260409020805463ffffffff8416908110610c9c57610c9c611fc1565b60009182526020918290206040805180820190915291015463ffffffff81168252600160201b90046001600160e01b0316918101919091529392505050565b6001600160a01b038316610d3d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610585565b6001600160a01b038216610d9e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610585565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610e0b8484610c2d565b90506000198114610e735781811015610e665760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610585565b610e738484848403610cdb565b50505050565b6001600160a01b038316610edd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610585565b6001600160a01b038216610f3f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610585565b6001600160a01b03831660009081526033602052604090205481811015610fb75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610585565b6001600160a01b0380851660008181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110179086815260200190565b60405180910390a3610e738484846113c3565b60006105117f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61105960655490565b6066546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b8154600090818160058111156110ff5760006110c0846113f5565b6110ca9085611fae565b600088815260209020909150869082015463ffffffff1611156110ef578091506110fd565b6110fa816001611f57565b92505b505b8082101561114c57600061111383836114dd565b600088815260209020909150869082015463ffffffff16111561113857809150611146565b611143816001611f57565b92505b506110ff565b80156111855761116f86611161600184611fae565b600091825260209091200190565b54600160201b90046001600160e01b0316611188565b60005b6001600160e01b03169695505050505050565b6111a582826114f8565b6035546001600160e01b0310156112175760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610585565b610e7360ce6115c1836115cd565b6001600160a01b03828116600081815260cc6020818152604080842080546033845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610e7382848361171e565b600063ffffffff8211156113045760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610585565b5090565b611312828261185b565b610e7360ce611996836115cd565b60006104dd61132d61102a565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061137f878787876119a2565b9150915061138c81611a66565b5095945050505050565b6001600160a01b03811660009081526099602052604090208054600181018255905b50919050565b505050565b6001600160a01b03838116600090815260cc60205260408082205485841683529120546113be9291821691168361171e565b60008160000361140757506000919050565b6000600161141484611bb0565b901c6001901b9050600181848161142d5761142d611fd7565b048201901c9050600181848161144557611445611fd7565b048201901c9050600181848161145d5761145d611fd7565b048201901c9050600181848161147557611475611fd7565b048201901c9050600181848161148d5761148d611fd7565b048201901c905060018184816114a5576114a5611fd7565b048201901c905060018184816114bd576114bd611fd7565b048201901c90506105b0818285816114d7576114d7611fd7565b04611c44565b60006114ec6002848418611fed565b6105b090848416611f57565b6001600160a01b03821661154e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610585565b80603560008282546115609190611f57565b90915550506001600160a01b0382166000818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610601600083836113c3565b60006105b08284611f57565b82546000908190818115611619576115ea87611161600185611fae565b60408051808201909152905463ffffffff81168252600160201b90046001600160e01b0316602082015261162e565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061164e84868863ffffffff16565b92506000821180156116665750805163ffffffff1643145b156116aa5761167483611c5a565b61168388611161600186611fae565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055611714565b8660405180604001604052806116bf4361129f565b63ffffffff1681526020016116d386611c5a565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b5050935093915050565b816001600160a01b0316836001600160a01b0316141580156117405750600081115b156113be576001600160a01b038316156117ce576001600160a01b038316600090815260cd60205260408120819061177b90611996856115cd565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516117c3929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156113be576001600160a01b038216600090815260cd602052604081208190611804906115c1856115cd565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161184c929190918252602082015260400190565b60405180910390a25050505050565b6001600160a01b0382166118bb5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610585565b6001600160a01b0382166000908152603360205260409020548181101561192f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610585565b6001600160a01b03831660008181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36113be836000846113c3565b60006105b08284611fae565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156119d95750600090506003611a5d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611a2d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611a5657600060019250925050611a5d565b9150600090505b94509492505050565b6000816004811115611a7a57611a7a61200f565b03611a825750565b6001816004811115611a9657611a9661200f565b03611ae35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610585565b6002816004811115611af757611af761200f565b03611b445760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610585565b6003816004811115611b5857611b5861200f565b0361060f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610585565b600080608083901c15611bc557608092831c92015b604083901c15611bd757604092831c92015b602083901c15611be957602092831c92015b601083901c15611bfb57601092831c92015b600883901c15611c0d57600892831c92015b600483901c15611c1f57600492831c92015b600283901c15611c3157600292831c92015b600183901c156104dd5760010192915050565b6000818310611c5357816105b0565b5090919050565b60006001600160e01b038211156113045760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610585565b600060208083528351808285015260005b81811015611cf057858101830151858201604001528201611cd4565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611d2857600080fd5b919050565b60008060408385031215611d4057600080fd5b611d4983611d11565b946020939093013593505050565b600080600060608486031215611d6c57600080fd5b611d7584611d11565b9250611d8360208501611d11565b9150604084013590509250925092565b600060208284031215611da557600080fd5b6105b082611d11565b600060208284031215611dc057600080fd5b5035919050565b803560ff81168114611d2857600080fd5b60008060008060008060c08789031215611df157600080fd5b611dfa87611d11565b95506020870135945060408701359350611e1660608801611dc7565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215611e4b57600080fd5b611e5488611d11565b9650611e6260208901611d11565b95506040880135945060608801359350611e7e60808901611dc7565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611ead57600080fd5b611eb683611d11565b9150611ec460208401611d11565b90509250929050565b60008060408385031215611ee057600080fd5b611ee983611d11565b9150602083013563ffffffff81168114611f0257600080fd5b809150509250929050565b600181811c90821680611f2157607f821691505b6020821081036113b857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156104dd576104dd611f41565b60208082526024908201527f496e646578546f6b656e3a2063616c6c6572206973206e6f7420746865206d69604082015263373a32b960e11b606082015260800190565b818103818111156104dd576104dd611f41565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60008261200a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfe1af730152eea9813c49583a406e8dd55a4df08cae9e33ae45721374fdde82baea2646970667358221220e9d84dbd048c6601d7e5377b870866620dfc291c250ac61c7596112805f5ea7164736f6c63430008120033