Advertisement
galih039

FireCheckout

Dec 9th, 2017
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 80.83 KB | None | 0 0
  1. PD9waHANCg0KaW5jbHVkZV9vbmNlKCJNYXhNaW5kL0dlb0lQL2dlb2lwLnBocCIpOw0KaW5jbHVkZV9vbmNlKCJNYXhNaW5kL0dlb0lQL2dlb2lwY2l0eS5waHAiKTsNCmluY2x1ZGVfb25jZSgiTWF4TWluZC9HZW9JUC9nZW9pcHJlZ2lvbnZhcnMucGhwIik7DQoNCmNsYXNzIFRNX0ZpcmVDaGVja291dF9Nb2RlbF9UeXBlX1N0YW5kYXJkDQp7DQogICAgLyoqDQogICAgICogIGFwcC9sb2NhbC9UTS9maXJlY2hlY2tvdXQvbW9kZWwvdHlwZS9zdGFuZGFyZC5waHAgDQogICAgICogIE1hZ2VfQ2hlY2tvdXQgKEJ1ZzdzZWMgVGVhbSkNCiAgICAgKiAgQ2hlY2tvdXQgdHlwZXM6IENoZWNrb3V0IGFzIEd1ZXN0LCBSZWdpc3RlciwgTG9nZ2VkIEluIEN1c3RvbWVyDQogICAgICovDQogICAgY29uc3QgTUVUSE9EX0dVRVNUICAgID0gJ2d1ZXN0JzsNCiAgICBjb25zdCBNRVRIT0RfUkVHSVNURVIgPSAncmVnaXN0ZXInOw0KICAgIGNvbnN0IE1FVEhPRF9DVVNUT01FUiA9ICdjdXN0b21lcic7DQovLyAgICBjb25zdCBNRVRIT0RfR1VFU1RfQ1VTVE9NRVIgPSAnZ3Vlc3RfY3VzdG9tZXInOw0KDQogICAgLyoqDQogICAgICogRXJyb3IgbWVzc2FnZSBvZiAiY3VzdG9tZXIgYWxyZWFkeSBleGlzdHMiDQogICAgICoNCiAgICAgKiBAdmFyIHN0cmluZw0KICAgICAqLw0KICAgIHByaXZhdGUgJF9jdXN0b21lckVtYWlsRXhpc3RzTWVzc2FnZSA9ICcnOw0KDQogICAgLyoqDQogICAgICogQHZhciBNYWdlX0N1c3RvbWVyX01vZGVsX1Nlc3Npb24NCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgJF9jdXN0b21lclNlc3Npb247DQoNCiAgICAvKioNCiAgICAgKiBAdmFyIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfU2Vzc2lvbg0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkX2NoZWNrb3V0U2Vzc2lvbjsNCg0KICAgIC8qKg0KICAgICAqIEB2YXIgTWFnZV9TYWxlc19Nb2RlbF9RdW90ZQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkX3F1b3RlID0gbnVsbDsNCg0KICAgIC8qKg0KICAgICAqIEB2YXIgTWFnZV9DaGVja291dF9IZWxwZXJfRGF0YQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCAkX2hlbHBlcjsNCg0KICAgIC8qKg0KICAgICAqIENsYXNzIGNvbnN0cnVjdG9yDQogICAgICogU2V0IGN1c3RvbWVyIGFscmVhZHkgZXhpc3RzIG1lc3NhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPl9oZWxwZXIgPSBNYWdlOjpoZWxwZXIoJ2NoZWNrb3V0Jyk7DQogICAgICAgICR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2UgPSAkdGhpcy0+X2hlbHBlci0+X18oJ1RoZXJlIGlzIGFscmVhZHkgYSBjdXN0b21lciByZWdpc3RlcmVkIHVzaW5nIHRoaXMgZW1haWwgYWRkcmVzcy4gUGxlYXNlIGxvZ2luIHVzaW5nIHRoaXMgZW1haWwgYWRkcmVzcyBvciBlbnRlciBhIGRpZmZlcmVudCBlbWFpbCBhZGRyZXNzIHRvIHJlZ2lzdGVyIHlvdXIgYWNjb3VudC4nKTsNCiAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24gPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2NoZWNrb3V0L3Nlc3Npb24nKTsNCiAgICAgICAgJHRoaXMtPl9jdXN0b21lclNlc3Npb24gPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2N1c3RvbWVyL3Nlc3Npb24nKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBHZXQgZnJvbnRlbmQgY2hlY2tvdXQgc2Vzc2lvbiBvYmplY3QNCiAgICAgKg0KICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9TZXNzaW9uDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldENoZWNrb3V0KCkNCiAgICB7DQogICAgICAgIHJldHVybiAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbjsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBRdW90ZSBvYmplY3QgZ2V0dGVyDQogICAgICoNCiAgICAgKiBAcmV0dXJuIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UXVvdGUoKQ0KICAgIHsNCiAgICAgICAgaWYgKCR0aGlzLT5fcXVvdGUgPT09IG51bGwpIHsNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+Z2V0UXVvdGUoKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJHRoaXMtPl9xdW90ZTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBEZWNsYXJlIGNoZWNrb3V0IHF1b3RlIGluc3RhbmNlDQogICAgICoNCiAgICAgKiBAcGFyYW0gTWFnZV9TYWxlc19Nb2RlbF9RdW90ZSAkcXVvdGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UXVvdGUoTWFnZV9TYWxlc19Nb2RlbF9RdW90ZSAkcXVvdGUpDQogICAgew0KICAgICAgICAkdGhpcy0+X3F1b3RlID0gJHF1b3RlOw0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IGN1c3RvbWVyIHNlc3Npb24gb2JqZWN0DQogICAgICoNCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfU2Vzc2lvbg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21lclNlc3Npb24oKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5fY3VzdG9tZXJTZXNzaW9uOw0KICAgIH0NCg0KDQogICAgLyoqDQogICAgICogUmV0cmlldmUgc2hpcHBpbmcgYW5kIGJpbGxpbmcgYWRkcmVzc2VzLA0KICAgICAqIGFuZCBib29sZWFuIGZsYWcgYWJvdXQgdGhlaXIgZXF1YWxpdHkNCiAgICAgKg0KICAgICAqIEZvciB0aGUgUmVnaXN0ZXJkIGN1c3RvbWVyIHdpdGggYXZhaWxhYmxlIGFkZHJlc3NlcyByZXR1cm5zDQogICAgICogYXBwcm9wcmlhdGUgYWRkcmVzcy4NCiAgICAgKiBGb3IgdGhlIEd1ZXN0IHRyeWluZyB0byBkZXRlY3QgY291bnRyeSB3aXRoIGdlby1pcCB0ZWNobm9sb2d5DQogICAgICoNCiAgICAgKiBAcmV0dXJuIGFycmF5DQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9nZXREZWZhdWx0QWRkcmVzcygpDQogICAgew0KICAgICAgICAkcmVzdWx0ID0gYXJyYXkoDQogICAgICAgICAgICAnc2hpcHBpbmcnID0+IGFycmF5KA0KICAgICAgICAgICAgICAgICdjb3VudHJ5X2lkJyAgICAgICAgICAgID0+IG51bGwsDQogICAgICAgICAgICAgICAgJ2NpdHknICAgICAgICAgICAgICAgICAgPT4gbnVsbCwNCiAgICAgICAgICAgICAgICAncmVnaW9uX2lkJyAgICAgICAgICAgICA9PiBudWxsLA0KICAgICAgICAgICAgICAgICdwb3N0Y29kZScgICAgICAgICAgICAgID0+IG51bGwsDQogICAgICAgICAgICAgICAgJ2N1c3RvbWVyX2FkZHJlc3NfaWQnICAgPT4gZmFsc2UNCiAgICAgICAgICAgICksDQogICAgICAgICAgICAnYmlsbGluZycgPT4gYXJyYXkoDQogICAgICAgICAgICAgICAgJ2NvdW50cnlfaWQnICAgICAgICAgICAgPT4gbnVsbCwNCiAgICAgICAgICAgICAgICAnY2l0eScgICAgICAgICAgICAgICAgICA9PiBudWxsLA0KICAgICAgICAgICAgICAgICdyZWdpb25faWQnICAgICAgICAgICAgID0+IG51bGwsDQogICAgICAgICAgICAgICAgJ3Bvc3Rjb2RlJyAgICAgICAgICAgICAgPT4gbnVsbCwNCiAgICAgICAgICAgICAgICAnY3VzdG9tZXJfYWRkcmVzc19pZCcgICA9PiBmYWxzZSwNCiAgICAgICAgICAgICAgICAndXNlX2Zvcl9zaGlwcGluZycgICAgICA9PiB0cnVlLA0KICAgICAgICAgICAgICAgICdyZWdpc3Rlcl9hY2NvdW50JyAgICAgID0+IDANCiAgICAgICAgICAgICkNCiAgICAgICAgKTsNCiAgICAgICAgaWYgKCgkY3VzdG9tZXIgPSBNYWdlOjpnZXRTaW5nbGV0b24oJ2N1c3RvbWVyL3Nlc3Npb24nKS0+Z2V0Q3VzdG9tZXIoKSkNCiAgICAgICAgICAgICYmICgkYWRkcmVzc2VzID0gJGN1c3RvbWVyLT5nZXRBZGRyZXNzZXMoKSkpIHsNCg0KICAgICAgICAgICAgaWYgKCEkc2hpcHBpbmdBZGRyZXNzID0gJGN1c3RvbWVyLT5nZXRQcmltYXJ5U2hpcHBpbmdBZGRyZXNzKCkpIHsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkYWRkcmVzc2VzIGFzICRhZGRyZXNzKSB7DQogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZ0FkZHJlc3MgPSAkYWRkcmVzczsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCEkYmlsbGluZ0FkZHJlc3MgPSAkY3VzdG9tZXItPmdldFByaW1hcnlCaWxsaW5nQWRkcmVzcygpKSB7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFkZHJlc3NlcyBhcyAkYWRkcmVzcykgew0KICAgICAgICAgICAgICAgICAgICAkYmlsbGluZ0FkZHJlc3MgPSAkYWRkcmVzczsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddWydjb3VudHJ5X2lkJ10gICAgICAgICAgPSAkc2hpcHBpbmdBZGRyZXNzLT5nZXRDb3VudHJ5SWQoKTsNCiAgICAgICAgICAgICRyZXN1bHRbJ3NoaXBwaW5nJ11bJ2N1c3RvbWVyX2FkZHJlc3NfaWQnXSA9ICRzaGlwcGluZ0FkZHJlc3MtPmdldElkKCk7DQogICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ2NvdW50cnlfaWQnXSAgICAgICAgICAgPSAkYmlsbGluZ0FkZHJlc3MtPmdldENvdW50cnlJZCgpOw0KICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWydjdXN0b21lcl9hZGRyZXNzX2lkJ10gID0gJGJpbGxpbmdBZGRyZXNzLT5nZXRJZCgpOw0KICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWyd1c2VfZm9yX3NoaXBwaW5nJ10gICAgID0gJHNoaXBwaW5nQWRkcmVzcy0+Z2V0SWQoKSA9PT0gJGJpbGxpbmdBZGRyZXNzLT5nZXRJZCgpOw0KICAgICAgICB9IGVsc2UgaWYgKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+Z2V0Q291bnRyeUlkKCkpIHsNCiAgICAgICAgICAgIC8vIEVzdGltYXRlZCBzaGlwcGluZyBjb3N0IGZyb20gc2hvcHBpbmcgY2FydA0KICAgICAgICAgICAgJGFkZHJlc3MgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7DQogICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddID0gJGFkZHJlc3MtPmdldERhdGEoKTsNCiAgICAgICAgICAgIGlmICghJGFkZHJlc3MtPmdldFNhbWVBc0JpbGxpbmcoKSkgew0KICAgICAgICAgICAgICAgICRhZGRyZXNzID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCk7DQogICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddID0gJGFkZHJlc3MtPmdldERhdGEoKTsNCiAgICAgICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ3VzZV9mb3Jfc2hpcHBpbmcnXSA9IGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ10gPSAkcmVzdWx0WydzaGlwcGluZyddOw0KICAgICAgICAgICAgICAgICRyZXN1bHRbJ2JpbGxpbmcnXVsndXNlX2Zvcl9zaGlwcGluZyddID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRyZXN1bHRbJ2JpbGxpbmcnXVsndXNlX2Zvcl9zaGlwcGluZyddID0gdHJ1ZTsNCg0KICAgICAgICAgICAgJGRldGVjdENvdW50cnkgID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW9faXAvY291bnRyeScpOw0KICAgICAgICAgICAgJGRldGVjdFJlZ2lvbiAgID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW9faXAvcmVnaW9uJyk7DQogICAgICAgICAgICAkZGV0ZWN0Q2l0eSAgICAgPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9jaXR5Jyk7DQogICAgICAgICAgICAkZ2VvaXBJbmNsdWRlZCAgPSB0cnVlOw0KDQogICAgICAgICAgICBpZiAoJGRldGVjdENvdW50cnkgfHwgJGRldGVjdFJlZ2lvbiB8fCAkZGV0ZWN0Q2l0eSkgew0KICAgICAgICAgICAgICAgIGlmICghZnVuY3Rpb25fZXhpc3RzKCdnZW9pcF9vcGVuJykpIHsNCiAgICAgICAgICAgICAgICAgICAgJGdlb2lwSW5jbHVkZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPmFkZEVycm9yKA0KICAgICAgICAgICAgICAgICAgICAgICAgTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+X18oIkdlb0lQIGlzIGVuYWJsZWQgYnV0IG5vdCBpbmNsdWRlZC4gZ2VvaXBfb3BlbiBmdW5jdGlvbiBkb2Vzbid0IGZvdW5kIikNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRyZW1vdGVBZGRyID0gTWFnZTo6aGVscGVyKCdjb3JlL2h0dHAnKS0+Z2V0UmVtb3RlQWRkcigpOw0KDQogICAgICAgICAgICBpZiAoJGRldGVjdENvdW50cnkgJiYgJGdlb2lwSW5jbHVkZWQpIHsNCiAgICAgICAgICAgICAgICAkZmlsZW5hbWUgPSBNYWdlOjpnZXRCYXNlRGlyKCdsaWInKQ0KICAgICAgICAgICAgICAgICAgICAuIERTDQogICAgICAgICAgICAgICAgICAgIC4gIk1heE1pbmQvR2VvSVAvZGF0YS8iDQogICAgICAgICAgICAgICAgICAgIC4gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW9faXAvY291bnRyeV9maWxlJyk7DQoNCiAgICAgICAgICAgICAgICBpZiAoaXNfcmVhZGFibGUoJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICAkZ2kgPSBnZW9pcF9vcGVuKCRmaWxlbmFtZSwgR0VPSVBfU1RBTkRBUkQpOw0KICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddWydjb3VudHJ5X2lkJ10gPQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWydjb3VudHJ5X2lkJ10gPSBnZW9pcF9jb3VudHJ5X2NvZGVfYnlfYWRkcigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2ksICRyZW1vdGVBZGRyDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgICAgIGdlb2lwX2Nsb3NlKCRnaSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPmFkZEVycm9yKA0KICAgICAgICAgICAgICAgICAgICAgICAgTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+X18oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdW50cnkgZGV0ZWN0aW9uIGlzIGVuYWJsZWQgYnV0ICVzIG5vdCBmb3VuZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW9faXAvY291bnRyeV9maWxlJykNCiAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICgkZGV0ZWN0UmVnaW9uICYmICRnZW9pcEluY2x1ZGVkKSB7DQogICAgICAgICAgICAgICAgJGZpbGVuYW1lID0gTWFnZTo6Z2V0QmFzZURpcignbGliJykNCiAgICAgICAgICAgICAgICAgICAgLiBEUw0KICAgICAgICAgICAgICAgICAgICAuICJNYXhNaW5kL0dlb0lQL2RhdGEvIg0KICAgICAgICAgICAgICAgICAgICAuIE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvZ2VvX2lwL3JlZ2lvbl9maWxlJyk7DQoNCiAgICAgICAgICAgICAgICBpZiAoaXNfcmVhZGFibGUoJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICAkZ2kgPSBnZW9pcF9vcGVuKCRmaWxlbmFtZSwgR0VPSVBfU1RBTkRBUkQpOw0KICAgICAgICAgICAgICAgICAgICBsaXN0KCRjb3VudHJ5Q29kZSwgJHJlZ2lvbkNvZGUpID0gZ2VvaXBfcmVnaW9uX2J5X2FkZHIoJGdpLCAkcmVtb3RlQWRkcik7DQogICAgICAgICAgICAgICAgICAgICRyZWdpb24gPSBNYWdlOjpnZXRNb2RlbCgnZGlyZWN0b3J5L3JlZ2lvbicpLT5sb2FkQnlDb2RlKCRyZWdpb25Db2RlLCAkY291bnRyeUNvZGUpOw0KICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydzaGlwcGluZyddWydjb3VudHJ5X2lkJ10gPQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWydjb3VudHJ5X2lkJ10gPSAkY291bnRyeUNvZGU7DQogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ3NoaXBwaW5nJ11bJ3JlZ2lvbl9pZCddID0NCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ2JpbGxpbmcnXVsncmVnaW9uX2lkJ10gPSAkcmVnaW9uLT5nZXRJZCgpOw0KDQogICAgICAgICAgICAgICAgICAgIGdlb2lwX2Nsb3NlKCRnaSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPmFkZEVycm9yKA0KICAgICAgICAgICAgICAgICAgICAgICAgTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+X18oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lvbiBkZXRlY3Rpb24gaXMgZW5hYmxlZCBidXQgJXMgbm90IGZvdW5kIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9yZWdpb25fZmlsZScpDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoJGRldGVjdENpdHkgJiYgJGdlb2lwSW5jbHVkZWQpIHsNCiAgICAgICAgICAgICAgICAkZmlsZW5hbWUgPSBNYWdlOjpnZXRCYXNlRGlyKCdsaWInKQ0KICAgICAgICAgICAgICAgICAgICAuIERTDQogICAgICAgICAgICAgICAgICAgIC4gIk1heE1pbmQvR2VvSVAvZGF0YS8iDQogICAgICAgICAgICAgICAgICAgIC4gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW9faXAvY2l0eV9maWxlJyk7DQoNCiAgICAgICAgICAgICAgICBpZiAoaXNfcmVhZGFibGUoJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICAkZ2kgPSBnZW9pcF9vcGVuKCRmaWxlbmFtZSwgR0VPSVBfU1RBTkRBUkQpOw0KICAgICAgICAgICAgICAgICAgICAkcmVjb3JkID0gZ2VvaXBfcmVjb3JkX2J5X2FkZHIoJGdpLCAkcmVtb3RlQWRkcik7DQogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ3NoaXBwaW5nJ11bJ2NpdHknXSA9DQogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WydiaWxsaW5nJ11bJ2NpdHknXSA9ICRyZWNvcmQtPmNpdHk7DQogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJ3NoaXBwaW5nJ11bJ3Bvc3Rjb2RlJ10gPQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWydwb3N0Y29kZSddID0gJHJlY29yZC0+cG9zdGFsX2NvZGU7DQoNCiAgICAgICAgICAgICAgICAgICAgZ2VvaXBfY2xvc2UoJGdpKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2NoZWNrb3V0U2Vzc2lvbi0+YWRkRXJyb3IoDQogICAgICAgICAgICAgICAgICAgICAgICBNYWdlOjpoZWxwZXIoJ2ZpcmVjaGVja291dCcpLT5fXygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2l0eSBkZXRlY3Rpb24gaXMgZW5hYmxlZCBidXQgJXMgbm90IGZvdW5kIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlb19pcC9jaXR5X2ZpbGUnKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChlbXB0eSgkcmVzdWx0WydzaGlwcGluZyddWydjb3VudHJ5X2lkJ10pDQogICAgICAgICAgICAgICAgfHwgIU1hZ2U6OmdldFJlc291cmNlTW9kZWwoJ2RpcmVjdG9yeS9jb3VudHJ5X2NvbGxlY3Rpb24nKQ0KICAgICAgICAgICAgICAgICAgICAtPmFkZENvdW50cnlDb2RlRmlsdGVyKCRyZXN1bHRbJ3NoaXBwaW5nJ11bJ2NvdW50cnlfaWQnXSkNCiAgICAgICAgICAgICAgICAgICAgLT5sb2FkQnlTdG9yZSgpDQogICAgICAgICAgICAgICAgICAgIC0+Y291bnQoKSkgew0KDQogICAgICAgICAgICAgICAgJHJlc3VsdFsnc2hpcHBpbmcnXVsnY291bnRyeV9pZCddID0NCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsnYmlsbGluZyddWydjb3VudHJ5X2lkJ10gPSBNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2dlbmVyYWwvY291bnRyeScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQHBhcmFtIG9iamVjdCAkbWV0aG9kDQogICAgICogQHJldHVybiBib29sZWFuDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9jYW5Vc2VQYXltZW50TWV0aG9kKCRtZXRob2QpDQogICAgew0KICAgICAgICBpZiAoISRtZXRob2QtPmNhblVzZUZvckNvdW50cnkoJHRoaXMtPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCktPmdldENvdW50cnkoKSkpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qaWYgKCEkbWV0aG9kLT5jYW5Vc2VGb3JDdXJyZW5jeShNYWdlOjphcHAoKS0+Z2V0U3RvcmUoKS0+Z2V0QmFzZUN1cnJlbmN5Q29kZSgpKSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9Ki8NCg0KICAgICAgICAkdG90YWwgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0QmFzZUdyYW5kVG90YWwoKTsNCiAgICAgICAgJG1pblRvdGFsID0gJG1ldGhvZC0+Z2V0Q29uZmlnRGF0YSgnbWluX29yZGVyX3RvdGFsJyk7DQogICAgICAgICRtYXhUb3RhbCA9ICRtZXRob2QtPmdldENvbmZpZ0RhdGEoJ21heF9vcmRlcl90b3RhbCcpOw0KDQogICAgICAgIGlmKCghZW1wdHkoJG1pblRvdGFsKSAmJiAoJHRvdGFsIDwgJG1pblRvdGFsKSkgfHwgKCFlbXB0eSgkbWF4VG90YWwpICYmICgkdG90YWwgPiAkbWF4VG90YWwpKSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXQgdGhlIHN0YXJ0IG9mIHBheW1lbnQgcHJvY2Vzcw0KICAgICAqDQogICAgICogQHJldHVybiBUTV9GaXJlQ2hlY2tvdXRfTW9kZWxfVHlwZV9TdGFuZGFyZA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhcHBseURlZmF1bHRzKCkNCiAgICB7DQogICAgICAgICRhZGRyZXNzSW5mbyA9ICR0aGlzLT5fZ2V0RGVmYXVsdEFkZHJlc3MoKTsNCiAgICAgICAgJHRoaXMtPnNhdmVCaWxsaW5nKA0KICAgICAgICAgICAgJGFkZHJlc3NJbmZvWydiaWxsaW5nJ10sDQogICAgICAgICAgICAkYWRkcmVzc0luZm9bJ2JpbGxpbmcnXVsnY3VzdG9tZXJfYWRkcmVzc19pZCddLA0KICAgICAgICAgICAgZmFsc2UNCiAgICAgICAgKTsNCiAgICAgICAgaWYgKCEkYWRkcmVzc0luZm9bJ2JpbGxpbmcnXVsndXNlX2Zvcl9zaGlwcGluZyddKSB7DQogICAgICAgICAgICAkdGhpcy0+c2F2ZVNoaXBwaW5nKA0KICAgICAgICAgICAgICAgICRhZGRyZXNzSW5mb1snc2hpcHBpbmcnXSwNCiAgICAgICAgICAgICAgICAkYWRkcmVzc0luZm9bJ3NoaXBwaW5nJ11bJ2N1c3RvbWVyX2FkZHJlc3NfaWQnXSwNCiAgICAgICAgICAgICAgICBmYWxzZQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBAdmFyIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGUNCiAgICAgICAgICovDQogICAgICAgICRxdW90ZSA9ICR0aGlzLT5nZXRRdW90ZSgpOw0KICAgICAgICAkc2hpcHBpbmdBZGRyZXNzID0gJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsNCg0KICAgICAgICAkc2hpcHBpbmdBZGRyZXNzLT5jb2xsZWN0VG90YWxzKCktPmNvbGxlY3RTaGlwcGluZ1JhdGVzKCktPnNhdmUoKTsNCiAgICAgICAgJHRoaXMtPmFwcGx5U2hpcHBpbmdNZXRob2QoKTsNCiAgICAgICAgLy8gc2hpcHBpbmcgbWV0aG9kIG1heSBhZmZlY3QgdGhlIHRvdGFsIGluIGJvdGggc2lkZXMgKGRpc2NvdW50IG9uIHVzaW5nIHNoaXBwaW5nIGFkZHJlc3MpDQogICAgICAgICRxdW90ZS0+Y29sbGVjdFRvdGFscygpOw0KDQogICAgICAgIGlmIChNYWdlOjpnZXRTdG9yZUNvbmZpZygnZmlyZWNoZWNrb3V0L2FqYXhfdXBkYXRlL3NoaXBwaW5nX21ldGhvZF9vbl90b3RhbCcpKSB7IC8vIHNoaXBwaW5nIG1ldGhvZHMgZGVwZW5kcyBvbiB0b3RhbCAoc3VidG90YWwgKyBkaXNjb3VudCkgd2l0aG91dCBzaGlwcGluZyBwcmljZQ0KICAgICAgICAgICAgLy8gY2hhbmdpbmcgdG90YWwgYnkgc2hpcHBpbmcgcHJpY2UgbWF5IGFmZmVjdCB0aGUgc2hpcHBpbmcgcHJpY2VzIHRoZW9yZXRpY2FsbHkNCiAgICAgICAgICAgIC8vIChmcmVlIHNoaXBwaW5nIG1heSBiZSBjYW5jZWxlZCBvciBhZGRlZCkNCiAgICAgICAgICAgICRzaGlwcGluZ0FkZHJlc3MtPnNldENvbGxlY3RTaGlwcGluZ1JhdGVzKHRydWUpLT5jb2xsZWN0U2hpcHBpbmdSYXRlcygpOw0KICAgICAgICAgICAgLy8gaWYgc2hpcHBpbmcgcHJpY2Ugd2FzIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdG90YWxzIGFnYWluLg0KICAgICAgICAgICAgLy8gRXhhbXBsZTogU0VMRUNURUQgU0hJUFBJTkcgTUVUSE9EIE5PVyBCRUNPTUVTIEZSRUUNCiAgICAgICAgICAgIC8vIHByZXZpb3VzIG1ldGhvZCBhZGRlZCBhIGRpc2NvdW50IGFuZCBzZWxlY3RlZCBzaGlwcGluZyBtZXRob2Qgd2Fzbid0IGZyZWUNCiAgICAgICAgICAgIC8vIGJ1dCByZW1vdmluZyB0aGUgcHJldmlvdXMgc2hpcHBpbmcgbWV0aG9kIHJlbW92ZXMgdGhlIGRpc2NvdW50IGFsc28NCiAgICAgICAgICAgIC8vIGFuZCBzZWxlY3RlZCBzaGlwcGluZyBtZXRob2QgaXMgbm93IGZyZWUNCiAgICAgICAgICAgICRxdW90ZS0+c2V0VG90YWxzQ29sbGVjdGVkRmxhZyhmYWxzZSktPmNvbGxlY3RUb3RhbHMoKTsNCiAgICAgICAgfQ0KDQogICAgICAgICR0aGlzLT5hcHBseVBheW1lbnRNZXRob2QoKTsNCiAgICAgICAgaWYgKE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvYWpheF91cGRhdGUvdG90YWxfb25fcGF5bWVudF9tZXRob2QnKSkgeyAvLyB0b3RhbCBkZXBlbmRzIG9uIHBheW1lbnQgbWV0aG9kIEB0b2RvICYmIG1ldGhvZCBpcyBjaGFuZ2VkDQogICAgICAgICAgICAvLyByZWNvbGxlY3QgdG90YWxzIGFnYWluIGJlY2F1c2UgYWRkaW5nL3JlbW92aW5nIHBheW1lbnQNCiAgICAgICAgICAgIC8vIG1ldGhvZCBtYXkgYWRkL3JlbW92ZSBzb21lIGRpc2NvdW50cyBpbiB0aGUgb3JkZXINCg0KICAgICAgICAgICAgLy8gdG8gcmVjb2xsZWN0IGRpc2NvdW50IHJ1bGVzIG5lZWQgdG8gY2xlYXIgcHJldmlvdXMgZGlzY291bnQNCiAgICAgICAgICAgIC8vIGRlc2NyaXB0dWlvbnMgYW5kIG1hcmsgYWRkcmVzcyBhcyBtb2RpZmllZA0KICAgICAgICAgICAgLy8gc2VlIF9jYW5Qcm9jZXNzUnVsZSBpbiBNYWdlX1NhbGVzUnVsZV9Nb2RlbF9WYWxpZGF0b3INCiAgICAgICAgICAgICRzaGlwcGluZ0FkZHJlc3MtPnNldERpc2NvdW50RGVzY3JpcHRpb25BcnJheShhcnJheSgpKS0+aXNPYmplY3ROZXcodHJ1ZSk7DQoNCiAgICAgICAgICAgICRxdW90ZS0+c2V0VG90YWxzQ29sbGVjdGVkRmxhZyhmYWxzZSktPmNvbGxlY3RUb3RhbHMoKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRxdW90ZS0+c2F2ZSgpOw0KDQogICAgICAgIHJldHVybiAkdGhpczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBVcGRhdGUgcGF5bWVudCBtZXRob2QgaW5mb3JtYXRpb24NCiAgICAgKiBSZW1vdmVzIHByZXZpb3VzbHkgc2VsZWN0ZWQgbWV0aG9kIGlmIG5vbmUgaXMgYXZhaWxhYmxlLA0KICAgICAqIHNldCBhdmFpbGFibGUgaWYgb25seSBvbmUgaXMgYXZhaWxhYmxlLA0KICAgICAqIHNldCBwcmV2aW91c2x5IHNlbGVjdGVkIHBheW1lbnQsDQogICAgICogc2V0IGRlZmF1bHQgZnJvbSBjb25maWcgaWYgcG9zc2libGUNCiAgICAgKg0KICAgICAqIEBwYXJhbSBzdHJpbmcgJG1ldGhvZENvZGUgRGVmYXVsdCBtZXRob2QgY29kZQ0KICAgICAqIEByZXR1cm4gVE1fRmlyZUNoZWNrb3V0X01vZGVsX1R5cGVfU3RhbmRhcmQNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXBwbHlQYXltZW50TWV0aG9kKCRtZXRob2RDb2RlID0gbnVsbCkNCiAgICB7DQogICAgICAgIGlmIChmYWxzZSA9PT0gJG1ldGhvZENvZGUpIHsNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2V0UXVvdGUoKS0+cmVtb3ZlUGF5bWVudCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgJHN0b3JlID0gJHRoaXMtPmdldFF1b3RlKCkgPyAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U3RvcmVJZCgpIDogbnVsbDsNCiAgICAgICAgJG1ldGhvZHMgPSBNYWdlOjpoZWxwZXIoJ3BheW1lbnQnKS0+Z2V0U3RvcmVNZXRob2RzKCRzdG9yZSwgJHRoaXMtPmdldFF1b3RlKCkpOw0KICAgICAgICAkYXZhaWxhYmxlUGF5bWVudHMgPSBhcnJheSgpOw0KICAgICAgICBmb3JlYWNoICgkbWV0aG9kcyBhcyAka2V5ID0+ICRtZXRob2QpIHsNCiAgICAgICAgICAgIGlmICghJG1ldGhvZCB8fCAhJG1ldGhvZC0+Y2FuVXNlQ2hlY2tvdXQoKSkgew0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCR0aGlzLT5fY2FuVXNlUGF5bWVudE1ldGhvZCgkbWV0aG9kKSkgew0KICAgICAgICAgICAgICAgICRhdmFpbGFibGVQYXltZW50c1tdID0gJG1ldGhvZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgICRmb3VuZCA9IGZhbHNlOw0KICAgICAgICAkY291bnQgPSBjb3VudCgkYXZhaWxhYmxlUGF5bWVudHMpOw0KICAgICAgICBpZiAoMSA9PT0gJGNvdW50KSB7DQogICAgICAgICAgICAkbWV0aG9kQ29kZSA9ICRhdmFpbGFibGVQYXltZW50c1swXS0+Z2V0Q29kZSgpOw0KICAgICAgICAgICAgJGZvdW5kICAgICAgPSB0cnVlOw0KICAgICAgICB9IGVsc2VpZiAoJGNvdW50KSB7DQogICAgICAgICAgICBpZiAoISRtZXRob2RDb2RlKSB7DQogICAgICAgICAgICAgICAkbWV0aG9kQ29kZSA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRQYXltZW50KCktPmdldE1ldGhvZCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCRtZXRob2RDb2RlKSB7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGF2YWlsYWJsZVBheW1lbnRzIGFzICRwYXltZW50KSB7DQogICAgICAgICAgICAgICAgICAgIGlmICgkbWV0aG9kQ29kZSA9PSAkcGF5bWVudC0+Z2V0Q29kZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkZm91bmQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoISRmb3VuZCB8fCAhJG1ldGhvZENvZGUpIHsNCiAgICAgICAgICAgICAgICAkbWV0aG9kQ29kZSA9IE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvZ2VuZXJhbC9wYXltZW50X21ldGhvZCcpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhdmFpbGFibGVQYXltZW50cyBhcyAkcGF5bWVudCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoJG1ldGhvZENvZGUgPT0gJHBheW1lbnQtPmdldENvZGUoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCEkZm91bmQpIHsNCiAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+cmVtb3ZlUGF5bWVudCgpOw0KICAgICAgICB9IGVsc2VpZiAoJG1ldGhvZENvZGUpIHsNCiAgICAgICAgICAgICRwYXltZW50ID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFBheW1lbnQoKTsNCiAgICAgICAgICAgICRwYXltZW50LT5zZXRNZXRob2QoJG1ldGhvZENvZGUpOw0KICAgICAgICAgICAgJG1ldGhvZCA9ICRwYXltZW50LT5nZXRNZXRob2RJbnN0YW5jZSgpOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkbWV0aG9kLT5hc3NpZ25EYXRhKGFycmF5KCdtZXRob2QnID0+ICRtZXRob2RDb2RlKSk7DQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCiAgICAgICAgICAgICAgICAvLyBBZHllbiBIUFAgZXh0ZW5zaW9uIGZpeA0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoJHRoaXMtPmdldFF1b3RlKCktPmlzVmlydHVhbCgpKSB7IC8vIGRpc2NvdW50IGFyZSBsb29raW5nIGZvciBtZXRob2QgaW5zaWRlIGFkZHJlc3MNCiAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0QmlsbGluZ0FkZHJlc3MoKS0+c2V0UGF5bWVudE1ldGhvZCgkbWV0aG9kQ29kZSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0UGF5bWVudE1ldGhvZCgkbWV0aG9kQ29kZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVXBkYXRlIHNoaXBwaW5nIG1ldGhvZCBpbmZvcm1hdGlvbg0KICAgICAqIFJlbW92ZXMgcHJldmlvdXNseSBzZWxlY3RlZCBtZXRob2QgaWYgbm9uZSBpcyBhdmFpbGFibGUsDQogICAgICogc2V0IGF2YWlsYWJsZSBpZiBvbmx5IG9uZSBpcyBhdmFpbGFibGUsDQogICAgICogc2V0IHByZXZpb3VzbHkgc2VsZWN0ZWQgcGF5bWVudCwNCiAgICAgKiBzZXQgZGVmYXVsdCBmcm9tIGNvbmZpZyBpZiBwb3NzaWJsZQ0KICAgICAqDQogICAgICogQHBhcmFtIHN0cmluZyAkbWV0aG9kQ29kZSBEZWZhdWx0IG1ldGhvZCBjb2RlDQogICAgICogQHJldHVybiBUTV9GaXJlQ2hlY2tvdXRfTW9kZWxfVHlwZV9TdGFuZGFyZA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhcHBseVNoaXBwaW5nTWV0aG9kKCRtZXRob2RDb2RlID0gbnVsbCkNCiAgICB7DQogICAgICAgIGlmIChmYWxzZSA9PT0gJG1ldGhvZENvZGUpIHsNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPnNldFNoaXBwaW5nTWV0aG9kKGZhbHNlKTsNCiAgICAgICAgfQ0KICAgICAgICAkcmF0ZXMgPSBNYWdlOjpnZXRNb2RlbCgnc2FsZXMvcXVvdGVfYWRkcmVzc19yYXRlJyktPmdldENvbGxlY3Rpb24oKQ0KICAgICAgICAgICAgLT5zZXRBZGRyZXNzRmlsdGVyKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+Z2V0SWQoKSkNCiAgICAgICAgICAgIC0+dG9BcnJheSgpOw0KDQovLyRzdGFydCA9IG1pY3JvdGltZSh0cnVlKTsNCi8vJHJhdGVzMSA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+Z2V0QWxsU2hpcHBpbmdSYXRlcygpOy8vLT50b0FycmF5KCk7DQovLyRlbmQgPSBtaWNyb3RpbWUodHJ1ZSk7DQovL1plbmRfRGVidWc6OmR1bXAoJGVuZCAtICRzdGFydCk7DQovL1plbmRfRGVidWc6OmR1bXAoY291bnQoJHJhdGVzMSkpOw0KDQogICAgICAgIC8vIHVuc2V0IGVycm9yIHNoaXBwaW5nIG1ldGhvZHMuIExpa2UgdXBzX2Vycm9yIGV0Yy4NCiAgICAgICAgZm9yZWFjaCAoJHJhdGVzWydpdGVtcyddIGFzICRrID0+ICRyYXRlKSB7DQogICAgICAgICAgICBpZiAoZW1wdHkoJHJhdGVbJ21ldGhvZCddKSB8fCAnY3VzdG9tc2hpcHBpbmdyYXRlJyA9PSAkcmF0ZVsnbWV0aG9kJ10pIHsNCiAgICAgICAgICAgICAgICB1bnNldCgkcmF0ZXNbJ2l0ZW1zJ11bJGtdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXNldCgkcmF0ZXNbJ2l0ZW1zJ10pOw0KDQogICAgICAgIGlmICgoISRjb3VudCA9IGNvdW50KCRyYXRlc1snaXRlbXMnXSkpKSB7DQogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPnNldFNoaXBwaW5nTWV0aG9kKGZhbHNlKTsNCiAgICAgICAgfSBlbHNlaWYgKDEgPT09ICRjb3VudCkgew0KICAgICAgICAgICAgJHJhdGUgPSBjdXJyZW50KCRyYXRlc1snaXRlbXMnXSk7DQogICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPnNldFNoaXBwaW5nTWV0aG9kKCRyYXRlWydjb2RlJ10pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJGZvdW5kID0gZmFsc2U7DQogICAgICAgICAgICBpZiAoISRtZXRob2RDb2RlKSB7DQogICAgICAgICAgICAgICAgJG1ldGhvZENvZGUgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPmdldFNoaXBwaW5nTWV0aG9kKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoJG1ldGhvZENvZGUpIHsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcmF0ZXNbJ2l0ZW1zJ10gYXMgJHJhdGUpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRtZXRob2RDb2RlID09PSAkcmF0ZVsnY29kZSddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPnNldFNoaXBwaW5nTWV0aG9kKCRtZXRob2RDb2RlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICRmb3VuZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghJGZvdW5kIHx8ICEkbWV0aG9kQ29kZSkgew0KICAgICAgICAgICAgICAgICRtZXRob2RDb2RlID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9nZW5lcmFsL3NoaXBwaW5nX21ldGhvZCcpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRyYXRlc1snaXRlbXMnXSBhcyAkcmF0ZSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoJG1ldGhvZENvZGUgPT09ICRyYXRlWydjb2RlJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0U2hpcHBpbmdNZXRob2QoJG1ldGhvZENvZGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCEkZm91bmQpIHsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcmF0ZXNbJ2l0ZW1zJ10gYXMgJHJhdGUpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRTaGlwcGluZ01ldGhvZCgkcmF0ZVsnY29kZSddKTsNCiAgICAgICAgICAgICAgICAgICAgJGZvdW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8vICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0U2hpcHBpbmdNZXRob2QoZmFsc2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkdGhpczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBJbml0aWFsaXplIHF1b3RlIHN0YXRlIHRvIGJlIHZhbGlkIGZvciBvbmUgcGFnZSBjaGVja291dA0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBpbml0Q2hlY2tvdXQoKQ0KICAgIHsNCiAgICAgICAgJGNoZWNrb3V0ID0gJHRoaXMtPmdldENoZWNrb3V0KCk7DQogICAgICAgICRjdXN0b21lclNlc3Npb24gPSAkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCk7DQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIFJlc2V0IG11bHRpc2hpcHBpbmcgZmxhZyBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbnMgd2l0aCBxdW90ZSBhZGRyZXNzDQogICAgICAgICAqIGFkZEFkZHJlc3MgbWV0aG9kIGZvciBxdW90ZSBvYmplY3QgcmVsYXRlZCBvbiB0aGlzIGZsYWcNCiAgICAgICAgICovDQogICAgICAgIGlmICgkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0SXNNdWx0aVNoaXBwaW5nKCkpIHsNCiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRJc011bHRpU2hpcHBpbmcoZmFsc2UpOw0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNhdmUoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qDQogICAgICAgICogd2FudCB0byBsYW9kIHRoZSBjb3JyZWN0IGN1c3RvbWVyIGluZm9ybWF0aW9uIGJ5IGFzc2lnaW5nIHRvIGFkZHJlc3MNCiAgICAgICAgKiBpbnN0ZWFkIG9mIGp1c3QgbG9hZGluZyBmcm9tIHNhbGVzL3F1b3RlX2FkZHJlc3MNCiAgICAgICAgKi8NCiAgICAgICAgJGN1c3RvbWVyID0gJGN1c3RvbWVyU2Vzc2lvbi0+Z2V0Q3VzdG9tZXIoKTsNCiAgICAgICAgaWYgKCRjdXN0b21lcikgew0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPmFzc2lnbkN1c3RvbWVyKCRjdXN0b21lcik7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICR0aGlzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdldCBxdW90ZSBjaGVja291dCBtZXRob2QNCiAgICAgKg0KICAgICAqIEByZXR1cm4gc3RyaW5nDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldENoZWNrb3V0TWV0aG9kKCkNCiAgICB7DQogICAgICAgIGlmICgkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCktPmlzTG9nZ2VkSW4oKSkgew0KICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok1FVEhPRF9DVVNUT01FUjsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoISR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDaGVja291dE1ldGhvZCgpKSB7DQogICAgICAgICAgICBpZiAoTWFnZTo6aGVscGVyKCdmaXJlY2hlY2tvdXQnKS0+aXNBbGxvd2VkR3Vlc3RDaGVja291dCgpKSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldENoZWNrb3V0TWV0aG9kKHNlbGY6Ok1FVEhPRF9HVUVTVCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZChzZWxmOjpNRVRIT0RfUkVHSVNURVIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q2hlY2tvdXRNZXRob2QoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTcGVjaWZ5IGNoZWNrb3V0IG1ldGhvZA0KICAgICAqDQogICAgICogQHBhcmFtICAgc3RyaW5nICRtZXRob2QNCiAgICAgKiBAcmV0dXJuICBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlQ2hlY2tvdXRNZXRob2QoJG1ldGhvZCkNCiAgICB7DQogICAgICAgIGlmIChlbXB0eSgkbWV0aG9kKSkgew0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gLTEsICdtZXNzYWdlJyA9PiAkdGhpcy0+X2hlbHBlci0+X18oJ0ludmFsaWQgZGF0YS4nKSk7DQogICAgICAgIH0NCg0KICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q2hlY2tvdXRNZXRob2QoJG1ldGhvZCktPnNhdmUoKTsNCiAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogR2V0IGN1c3RvbWVyIGFkZHJlc3MgYnkgaWRlbnRpZmllcg0KICAgICAqDQogICAgICogQHBhcmFtICAgaW50ICRhZGRyZXNzSWQNCiAgICAgKiBAcmV0dXJuICBNYWdlX0N1c3RvbWVyX01vZGVsX0FkZHJlc3MNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWRkcmVzcygkYWRkcmVzc0lkKQ0KICAgIHsNCiAgICAgICAgJGFkZHJlc3MgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvYWRkcmVzcycpLT5sb2FkKChpbnQpJGFkZHJlc3NJZCk7DQogICAgICAgICRhZGRyZXNzLT5leHBsb2RlU3RyZWV0QWRkcmVzcygpOw0KICAgICAgICBpZiAoJGFkZHJlc3MtPmdldFJlZ2lvbklkKCkpIHsNCiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRSZWdpb24oJGFkZHJlc3MtPmdldFJlZ2lvbklkKCkpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkYWRkcmVzczsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTYXZlIGJpbGxpbmcgYWRkcmVzcyBpbmZvcm1hdGlvbiB0byBxdW90ZQ0KICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBPbmUgUGFnZSBDaGVja291dCBKUyAoQUpBWCkgd2hpbGUgc2F2aW5nIHRoZSBiaWxsaW5nIGluZm9ybWF0aW9uLg0KICAgICAqDQogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGENCiAgICAgKiBAcGFyYW0gICBpbnQgJGN1c3RvbWVyQWRkcmVzc0lkDQogICAgICogQHJldHVybiAgTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZUJpbGxpbmcoJGRhdGEsICRjdXN0b21lckFkZHJlc3NJZCwgJHZhbGlkYXRlID0gdHJ1ZSkNCiAgICB7DQogICAgICAgIGlmIChlbXB0eSgkZGF0YSkpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdJbnZhbGlkIGRhdGEuJykpOw0KICAgICAgICB9DQoNCiAgICAgICAgLyogb2xkIGNvZGUgKi8NCiAgICAgICAgaWYgKGlzc2V0KCRkYXRhWydyZWdpc3Rlcl9hY2NvdW50J10pICYmICRkYXRhWydyZWdpc3Rlcl9hY2NvdW50J10pIHsNCi8vICAgICAgICAgICAgaWYgKCRkYXRhWydsaW5rX2V4aXN0aW5nX2FjY291bnQnXSkgew0KLy8gICAgICAgICAgICAgICAgJGN1c3RvbWVyID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2N1c3RvbWVyJyk7DQovLyAgICAgICAgICAgICAgICAkY3VzdG9tZXItPnNldFdlYnNpdGVJZChNYWdlOjphcHAoKS0+Z2V0V2Vic2l0ZSgpLT5nZXRJZCgpKTsNCi8vICAgICAgICAgICAgICAgICRjdXN0b21lci0+bG9hZEJ5RW1haWwoJGRhdGFbJ2VtYWlsJ10pOw0KLy8gICAgICAgICAgICAgICAgaWYgKCRjdXN0b21lcklkID0gJGN1c3RvbWVyLT5nZXRJZCgpKSB7DQovLyAgICAgICAgICAgICAgICAgICAgTWFnZTo6Z2V0U2luZ2xldG9uKCdjdXN0b21lci9zZXNzaW9uJyktPnNldEZpcmVjaGVja291dEltcG9ydEN1c3RvbWVyRGF0YSgxKTsNCi8vICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q3VzdG9tZXJJZChudWxsKQ0KLy8gICAgICAgICAgICAgICAgICAgICAgICAtPnNldEN1c3RvbWVyRW1haWwoJGRhdGFbJ2VtYWlsJ10pDQovLyAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJJc0d1ZXN0KHRydWUpDQovLyAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJHcm91cElkKE1hZ2VfQ3VzdG9tZXJfTW9kZWxfR3JvdXA6Ok5PVF9MT0dHRURfSU5fSUQpOw0KLy8gICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZChzZWxmOjpNRVRIT0RfR1VFU1QpOyAvKk1FVEhPRF9HVUVTVF9DVVNUT01FUiovDQovLyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLy8gICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZChzZWxmOjpNRVRIT0RfUkVHSVNURVIpOw0KLy8gICAgICAgICAgICAgICAgfQ0KLy8gICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZChzZWxmOjpNRVRIT0RfUkVHSVNURVIpOw0KLy8gICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSBpZiAoJHRoaXMtPmdldEN1c3RvbWVyU2Vzc2lvbigpLT5pc0xvZ2dlZEluKCkpIHsNCiAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDaGVja291dE1ldGhvZChzZWxmOjpNRVRIT0RfQ1VTVE9NRVIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldENoZWNrb3V0TWV0aG9kKHNlbGY6Ok1FVEhPRF9HVUVTVCk7DQogICAgICAgIH0NCiAgICAgICAgLyogZW9mIG9sZCBjb2RlICovDQoNCiAgICAgICAgJGFkZHJlc3MgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0QmlsbGluZ0FkZHJlc3MoKTsNCiAgICAgICAgLyogQHZhciAkYWRkcmVzc0Zvcm0gTWFnZV9DdXN0b21lcl9Nb2RlbF9Gb3JtICovDQogICAgICAgICRhZGRyZXNzRm9ybSA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9mb3JtJyk7DQogICAgICAgICRhZGRyZXNzRm9ybS0+c2V0Rm9ybUNvZGUoJ2N1c3RvbWVyX2FkZHJlc3NfZWRpdCcpDQogICAgICAgICAgICAtPnNldEVudGl0eVR5cGUoJ2N1c3RvbWVyX2FkZHJlc3MnKQ0KICAgICAgICAgICAgLT5zZXRJc0FqYXhSZXF1ZXN0KE1hZ2U6OmFwcCgpLT5nZXRSZXF1ZXN0KCktPmlzQWpheCgpKTsNCg0KICAgICAgICBpZiAoIWVtcHR5KCRjdXN0b21lckFkZHJlc3NJZCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lckFkZHJlc3MgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvYWRkcmVzcycpLT5sb2FkKCRjdXN0b21lckFkZHJlc3NJZCk7DQogICAgICAgICAgICBpZiAoJGN1c3RvbWVyQWRkcmVzcy0+Z2V0SWQoKSkgew0KICAgICAgICAgICAgICAgIGlmICgkY3VzdG9tZXJBZGRyZXNzLT5nZXRDdXN0b21lcklkKCkgIT0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVySWQoKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+ICR0aGlzLT5faGVscGVyLT5fXygnQ3VzdG9tZXIgQWRkcmVzcyBpcyBub3QgdmFsaWQuJykNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAkYWRkcmVzcy0+aW1wb3J0Q3VzdG9tZXJBZGRyZXNzKCRjdXN0b21lckFkZHJlc3MpLT5zZXRTYXZlSW5BZGRyZXNzQm9vaygwKTsNCiAgICAgICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEVudGl0eSgkYWRkcmVzcyk7DQogICAgICAgICAgICAgICAgaWYgKCR2YWxpZGF0ZSkgew0KICAgICAgICAgICAgICAgICAgICAkYWRkcmVzc0Vycm9ycyAgPSAkYWRkcmVzc0Zvcm0tPnZhbGlkYXRlRGF0YSgkYWRkcmVzcy0+Z2V0RGF0YSgpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRhZGRyZXNzRXJyb3JzICE9PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJGFkZHJlc3NFcnJvcnMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJGFkZHJlc3NGb3JtLT5zZXRFbnRpdHkoJGFkZHJlc3MpOw0KICAgICAgICAgICAgLy8gZW11bGF0ZSByZXF1ZXN0IG9iamVjdA0KICAgICAgICAgICAgJGFkZHJlc3NEYXRhID0gJGFkZHJlc3NGb3JtLT5leHRyYWN0RGF0YSgkYWRkcmVzc0Zvcm0tPnByZXBhcmVSZXF1ZXN0KCRkYXRhKSk7DQogICAgICAgICAgICBpZiAoJHZhbGlkYXRlKSB7DQogICAgICAgICAgICAgICAgJGFkZHJlc3NFcnJvcnMgID0gJGFkZHJlc3NGb3JtLT52YWxpZGF0ZURhdGEoJGFkZHJlc3NEYXRhKTsNCiAgICAgICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwgJ21lc3NhZ2UnID0+ICRhZGRyZXNzRXJyb3JzKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPmNvbXBhY3REYXRhKCRhZGRyZXNzRGF0YSk7DQogICAgICAgICAgICAvL3Vuc2V0IGJpbGxpbmcgYWRkcmVzcyBhdHRyaWJ1dGVzIHdoaWNoIHdlcmUgbm90IHNob3duIGluIGZvcm0NCiAgICAgICAgICAgIGZvcmVhY2ggKCRhZGRyZXNzRm9ybS0+Z2V0QXR0cmlidXRlcygpIGFzICRhdHRyaWJ1dGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRkYXRhWyRhdHRyaWJ1dGUtPmdldEF0dHJpYnV0ZUNvZGUoKV0pKSB7DQogICAgICAgICAgICAgICAgICAgICRhZGRyZXNzLT5zZXREYXRhKCRhdHRyaWJ1dGUtPmdldEF0dHJpYnV0ZUNvZGUoKSwgTlVMTCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGZvcm0gZGF0YSwgbm90IGZldGNoZWQgYnkgZXh0cmFjdERhdGEgKGFzIGl0IGZldGNoZXMgb25seSBhdHRyaWJ1dGVzKQ0KICAgICAgICAgICAgJGFkZHJlc3MtPnNldFNhdmVJbkFkZHJlc3NCb29rKGVtcHR5KCRkYXRhWydzYXZlX2luX2FkZHJlc3NfYm9vayddKSA/IDAgOiAxKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHZhbGlkYXRlIGJpbGxpbmcgYWRkcmVzcw0KICAgICAgICBpZiAoJHZhbGlkYXRlICYmICgkdmFsaWRhdGVSZXMgPSAkdGhpcy0+dmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgIT09IHRydWUpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkdmFsaWRhdGVSZXMpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGFkZHJlc3MtPmltcGxvZGVTdHJlZXRBZGRyZXNzKCk7DQoNCiAgICAgICAgaWYgKCR2YWxpZGF0ZSAmJiAodHJ1ZSAhPT0gKCRyZXN1bHQgPSAkdGhpcy0+X3ZhbGlkYXRlQ3VzdG9tZXJEYXRhKCRkYXRhKSkpKSB7DQogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVySWQoKSAmJiBzZWxmOjpNRVRIT0RfUkVHSVNURVIgPT0gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsNCiAgICAgICAgICAgIGlmICgkdGhpcy0+X2N1c3RvbWVyRW1haWxFeGlzdHMoJGFkZHJlc3MtPmdldEVtYWlsKCksIE1hZ2U6OmFwcCgpLT5nZXRXZWJzaXRlKCktPmdldElkKCkpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gMSwgJ21lc3NhZ2UnID0+ICR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCEkdGhpcy0+Z2V0UXVvdGUoKS0+aXNWaXJ0dWFsKCkpIHsNCiAgICAgICAgICAgIC8qKg0KICAgICAgICAgICAgICogQmlsbGluZyBhZGRyZXNzIHVzaW5nIG90aW9ucw0KICAgICAgICAgICAgICovDQogICAgICAgICAgICAkdXNpbmdDYXNlID0gaXNzZXQoJGRhdGFbJ3VzZV9mb3Jfc2hpcHBpbmcnXSkgPyAoaW50KSRkYXRhWyd1c2VfZm9yX3NoaXBwaW5nJ10gOiAwOw0KDQogICAgICAgICAgICBzd2l0Y2goJHVzaW5nQ2FzZSkgew0KICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgJHNoaXBwaW5nID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFNoaXBwaW5nQWRkcmVzcygpOw0KICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmctPnNldFNhbWVBc0JpbGxpbmcoMCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmcgPSBjbG9uZSAkYWRkcmVzczsNCiAgICAgICAgICAgICAgICAgICAgJGJpbGxpbmctPnVuc0FkZHJlc3NJZCgpLT51bnNBZGRyZXNzVHlwZSgpOw0KICAgICAgICAgICAgICAgICAgICAkc2hpcHBpbmcgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCk7DQogICAgICAgICAgICAgICAgICAgICRzaGlwcGluZ01ldGhvZCA9ICRzaGlwcGluZy0+Z2V0U2hpcHBpbmdNZXRob2QoKTsNCg0KICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCByZXNldCBvcmlnaW5hbCBzaGlwcGluZyBkYXRhLCBpZiBpdCB3YXMgbm90IGNoYW5nZWQgYnkgY3VzdG9tZXINCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNoaXBwaW5nLT5nZXREYXRhKCkgYXMgJHNoaXBwaW5nS2V5ID0+ICRzaGlwcGluZ1ZhbHVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX251bGwoJHNoaXBwaW5nVmFsdWUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzX251bGwoJGJpbGxpbmctPmdldERhdGEoJHNoaXBwaW5nS2V5KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNzZXQoJGRhdGFbJHNoaXBwaW5nS2V5XSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYmlsbGluZy0+dW5zZXREYXRhKCRzaGlwcGluZ0tleSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHNoaXBwaW5nLT5hZGREYXRhKCRiaWxsaW5nLT5nZXREYXRhKCkpDQogICAgICAgICAgICAgICAgICAgICAgICAtPnNldFNhbWVBc0JpbGxpbmcoMSkNCiAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0U2F2ZUluQWRkcmVzc0Jvb2soMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0U2hpcHBpbmdNZXRob2QoJHNoaXBwaW5nTWV0aG9kKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRDb2xsZWN0U2hpcHBpbmdSYXRlcyh0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldENoZWNrb3V0KCktPnNldFN0ZXBEYXRhKCdzaGlwcGluZycsICdjb21wbGV0ZScsIHRydWUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLyogb2xkIGNvZGUgKi8NCiAgICAgICAgaWYgKCR2YWxpZGF0ZSAmJiAodHJ1ZSAhPT0gJHJlc3VsdCA9ICR0aGlzLT5fcHJvY2Vzc1ZhbGlkYXRlQ3VzdG9tZXIoJGFkZHJlc3MpKSkgew0KICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgICAgIH0NCiAgICAgICAgLyogZW9mIG9sZCBjb2RlICovDQoNCiAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVmFsaWRhdGUgY3VzdG9tZXIgZGF0YSBhbmQgc2V0IHNvbWUgaXRzIGRhdGEgZm9yIGZ1cnRoZXIgdXNhZ2UgaW4gcXVvdGUNCiAgICAgKiBXaWxsIHJldHVybiBlaXRoZXIgdHJ1ZSBvciBhcnJheSB3aXRoIGVycm9yIG1lc3NhZ2VzDQogICAgICoNCiAgICAgKiBAcGFyYW0gYXJyYXkgJGRhdGENCiAgICAgKiBAcmV0dXJuIHRydWV8YXJyYXkNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3ZhbGlkYXRlQ3VzdG9tZXJEYXRhKGFycmF5ICRkYXRhKQ0KICAgIHsNCiAgICAgICAgLyogQHZhciAkY3VzdG9tZXJGb3JtIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfRm9ybSAqLw0KICAgICAgICAkY3VzdG9tZXJGb3JtICAgID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2Zvcm0nKTsNCiAgICAgICAgJGN1c3RvbWVyRm9ybS0+c2V0Rm9ybUNvZGUoJ2NoZWNrb3V0X3JlZ2lzdGVyJykNCiAgICAgICAgICAgIC0+c2V0SXNBamF4UmVxdWVzdChNYWdlOjphcHAoKS0+Z2V0UmVxdWVzdCgpLT5pc0FqYXgoKSk7DQoNCiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVySWQoKSkgew0KICAgICAgICAgICAgJGN1c3RvbWVyID0gJHF1b3RlLT5nZXRDdXN0b21lcigpOw0KICAgICAgICAgICAgJGN1c3RvbWVyRm9ybS0+c2V0RW50aXR5KCRjdXN0b21lcik7DQogICAgICAgICAgICAkY3VzdG9tZXJEYXRhID0gJHF1b3RlLT5nZXRDdXN0b21lcigpLT5nZXREYXRhKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvKiBAdmFyICRjdXN0b21lciBNYWdlX0N1c3RvbWVyX01vZGVsX0N1c3RvbWVyICovDQogICAgICAgICAgICAkY3VzdG9tZXIgPSBNYWdlOjpnZXRNb2RlbCgnY3VzdG9tZXIvY3VzdG9tZXInKTsNCiAgICAgICAgICAgICRjdXN0b21lckZvcm0tPnNldEVudGl0eSgkY3VzdG9tZXIpOw0KICAgICAgICAgICAgJGN1c3RvbWVyUmVxdWVzdCA9ICRjdXN0b21lckZvcm0tPnByZXBhcmVSZXF1ZXN0KCRkYXRhKTsNCiAgICAgICAgICAgICRjdXN0b21lckRhdGEgPSAkY3VzdG9tZXJGb3JtLT5leHRyYWN0RGF0YSgkY3VzdG9tZXJSZXF1ZXN0KTsNCiAgICAgICAgfQ0KDQogICAgICAgICRjdXN0b21lckVycm9ycyA9ICRjdXN0b21lckZvcm0tPnZhbGlkYXRlRGF0YSgkY3VzdG9tZXJEYXRhKTsNCiAgICAgICAgaWYgKCRjdXN0b21lckVycm9ycyAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgICAgICdlcnJvcicgICAgID0+IC0xLA0KICAgICAgICAgICAgICAgICdtZXNzYWdlJyAgID0+IGltcGxvZGUoJywgJywgJGN1c3RvbWVyRXJyb3JzKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVySWQoKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCg0KICAgICAgICAkY3VzdG9tZXJGb3JtLT5jb21wYWN0RGF0YSgkY3VzdG9tZXJEYXRhKTsNCg0KICAgICAgICBpZiAoJHF1b3RlLT5nZXRDaGVja291dE1ldGhvZCgpID09IHNlbGY6Ok1FVEhPRF9SRUdJU1RFUikgew0KICAgICAgICAgICAgLy8gc2V0IGN1c3RvbWVyIHBhc3N3b3JkDQogICAgICAgICAgICAkcGFzc3dvcmQgPSAkY3VzdG9tZXJSZXF1ZXN0LT5nZXRQYXJhbSgnY3VzdG9tZXJfcGFzc3dvcmQnKTsNCiAgICAgICAgICAgIGlmIChlbXB0eSgkcGFzc3dvcmQpKSB7DQogICAgICAgICAgICAgICAgJHBhc3N3b3JkID0gJGN1c3RvbWVyLT5nZW5lcmF0ZVBhc3N3b3JkKCk7DQogICAgICAgICAgICAgICAgJGN1c3RvbWVyLT5zZXRQYXNzd29yZCgkcGFzc3dvcmQpOw0KICAgICAgICAgICAgICAgICRjdXN0b21lci0+c2V0Q29uZmlybWF0aW9uKCRwYXNzd29yZCk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRjdXN0b21lci0+c2V0UGFzc3dvcmQoJGN1c3RvbWVyUmVxdWVzdC0+Z2V0UGFyYW0oJ2N1c3RvbWVyX3Bhc3N3b3JkJykpOw0KICAgICAgICAgICAgICAgICRjdXN0b21lci0+c2V0Q29uZmlybWF0aW9uKCRjdXN0b21lclJlcXVlc3QtPmdldFBhcmFtKCdjb25maXJtX3Bhc3N3b3JkJykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgLy8gZW11bGF0ZSBjdXN0b21lciBwYXNzd29yZCBmb3IgcXVlc3QNCiAgICAgICAgICAgICRwYXNzd29yZCA9ICRjdXN0b21lci0+Z2VuZXJhdGVQYXNzd29yZCgpOw0KICAgICAgICAgICAgJGN1c3RvbWVyLT5zZXRQYXNzd29yZCgkcGFzc3dvcmQpOw0KICAgICAgICAgICAgJGN1c3RvbWVyLT5zZXRDb25maXJtYXRpb24oJHBhc3N3b3JkKTsNCiAgICAgICAgfQ0KDQogICAgICAgICRyZXN1bHQgPSAkY3VzdG9tZXItPnZhbGlkYXRlKCk7DQogICAgICAgIGlmICh0cnVlICE9PSAkcmVzdWx0ICYmIGlzX2FycmF5KCRyZXN1bHQpKSB7DQogICAgICAgICAgICByZXR1cm4gYXJyYXkoDQogICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLA0KICAgICAgICAgICAgICAgICdtZXNzYWdlJyA9PiBpbXBsb2RlKCcsICcsICRyZXN1bHQpDQogICAgICAgICAgICApOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCRxdW90ZS0+Z2V0Q2hlY2tvdXRNZXRob2QoKSA9PSBzZWxmOjpNRVRIT0RfUkVHSVNURVIpIHsNCiAgICAgICAgICAgIC8vIHNhdmUgY3VzdG9tZXIgZW5jcnlwdGVkIHBhc3N3b3JkIGluIHF1b3RlDQogICAgICAgICAgICAkcXVvdGUtPnNldFBhc3N3b3JkSGFzaCgkY3VzdG9tZXItPmVuY3J5cHRQYXNzd29yZCgkY3VzdG9tZXItPmdldFBhc3N3b3JkKCkpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIGNvcHkgY3VzdG9tZXIvZ3Vlc3QgZW1haWwgdG8gYWRkcmVzcw0KICAgICAgICAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCktPnNldEVtYWlsKCRjdXN0b21lci0+Z2V0RW1haWwoKSk7DQoNCiAgICAgICAgLy8gY29weSBjdXN0b21lciBkYXRhIHRvIHF1b3RlDQogICAgICAgIE1hZ2U6OmhlbHBlcignY29yZScpLT5jb3B5RmllbGRzZXQoJ2N1c3RvbWVyX2FjY291bnQnLCAndG9fcXVvdGUnLCAkY3VzdG9tZXIsICRxdW90ZSk7DQoNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogRGVwcmVjYXRlZCBidXQgdXNlZCBieSBmaXJlY2hlY2tvdXQgdG8gdmFsaWRhdGUgdGhlIHRheHZhdCBmaWVsZA0KICAgICAqDQogICAgICogQGRlcHJlY2F0ZWQgTmVlZCB0byByZW5hbWUgdG8gX3Byb2Nlc3NWYWxpZGF0ZVRheHZhdA0KICAgICAqIEBwYXJhbSBNYWdlX1NhbGVzX01vZGVsX1F1b3RlX0FkZHJlc3MgJGFkZHJlc3MNCiAgICAgKiBAcmV0dXJuIHRydWV8YXJyYXkNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3Byb2Nlc3NWYWxpZGF0ZUN1c3RvbWVyKE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGVfQWRkcmVzcyAkYWRkcmVzcykNCiAgICB7DQovLyAgICAgICAgLy8gc2V0IGN1c3RvbWVyIGRhdGUgb2YgYmlydGggZm9yIGZ1cnRoZXIgdXNhZ2UNCi8vICAgICAgICAkZG9iID0gJyc7DQovLyAgICAgICAgaWYgKCRhZGRyZXNzLT5nZXREb2IoKSkgew0KLy8gICAgICAgICAgICAkZG9iID0gTWFnZTo6YXBwKCktPmdldExvY2FsZSgpLT5kYXRlKCRhZGRyZXNzLT5nZXREb2IoKSwgbnVsbCwgbnVsbCwgZmFsc2UpLT50b1N0cmluZygneXl5eS1NTS1kZCcpOw0KLy8gICAgICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+c2V0Q3VzdG9tZXJEb2IoJGRvYik7DQovLyAgICAgICAgfQ0KDQogICAgICAgIC8vIHNldCBjdXN0b21lciB0YXgvdmF0IG51bWJlciBmb3IgZnVydGhlciB1c2FnZQ0KICAgICAgICAvLyAkdGF4dmF0ID0gJGFkZHJlc3MtPmdldFRheHZhdCgpOw0KICAgICAgICAkdGF4dmF0ID0gJHRoaXMtPmdldFF1b3RlKCktPmdldEN1c3RvbWVyVGF4dmF0KCk7DQogICAgICAgIGlmIChzdHJsZW4oJHRheHZhdCkgJiYgTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC90YXh2YXQvdmFsaWRhdGUnKSkgew0KICAgICAgICAgICAgLy8gaWYgKE1hZ2U6OmdldFN0b3JlQ29uZmlnKCdmaXJlY2hlY2tvdXQvdGF4dmF0L3ZhbGlkYXRlJykpIHsNCiAgICAgICAgICAgICAgICAkdGF4dmF0VmFsaWRhdG9yID0gTWFnZTo6Z2V0TW9kZWwoJ2ZpcmVjaGVja291dC90YXh2YXRfdmFsaWRhdG9yJyk7DQogICAgICAgICAgICAgICAgaWYgKCEkdGF4dmF0VmFsaWRhdG9yLT5pc1ZhbGlkKCR0YXh2YXQsICRhZGRyZXNzLT5nZXRDb3VudHJ5SWQoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyAgID0+IC0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+ICR0YXh2YXRWYWxpZGF0b3ItPmdldE1lc3NhZ2UoKQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0vKiBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldEN1c3RvbWVyVGF4dmF0KCR0YXh2YXQpOw0KICAgICAgICAgICAgICAgIH0qLw0KICAgICAgICAgICAgLy8gfQ0KICAgICAgICAgICAgLyogZWxzZSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldEN1c3RvbWVyVGF4dmF0KCR0YXh2YXQpOw0KICAgICAgICAgICAgfSovDQogICAgICAgIH0NCg0KICAgICAgICAvLyBzZXQgY3VzdG9tZXIgdGF4L3ZhdCBudW1iZXIgZm9yIGZ1cnRoZXIgdXNhZ2UNCiAgICAgICAgaWYgKCRhZGRyZXNzLT5nZXRUYXhudW1iZXIoKSkgew0KICAgICAgICAgICAgJHRoaXMtPmdldFF1b3RlKCktPnNldEN1c3RvbWVyVGF4bnVtYmVyKCRhZGRyZXNzLT5nZXRUYXhudW1iZXIoKSk7DQogICAgICAgIH0NCg0KLy8gICAgICAgIC8vIHNldCBjdXN0b21lciBnZW5kZXIgZm9yIGZ1cnRoZXIgdXNhZ2UNCi8vICAgICAgICBpZiAoJGFkZHJlc3MtPmdldEdlbmRlcigpKSB7DQovLyAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRDdXN0b21lckdlbmRlcigkYWRkcmVzcy0+Z2V0R2VuZGVyKCkpOw0KLy8gICAgICAgIH0NCg0KLy8gICAgICAgIC8vIGludm9rZSBjdXN0b21lciBtb2RlbCwgaWYgaXQgaXMgcmVnaXN0ZXJpbmcNCi8vICAgICAgICBpZiAoc2VsZjo6TUVUSE9EX1JFR0lTVEVSID09ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDaGVja291dE1ldGhvZCgpKSB7DQovLyAgICAgICAgICAgIC8vIHNldCBjdXN0b21lciBwYXNzd29yZCBoYXNoIGZvciBmdXJ0aGVyIHVzYWdlDQovLyAgICAgICAgICAgICRjdXN0b21lciA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9jdXN0b21lcicpOw0KLy8gICAgICAgICAgICAkcGFzc3dvcmQgPSAkYWRkcmVzcy0+Z2V0Q3VzdG9tZXJQYXNzd29yZCgpOw0KLy8gICAgICAgICAgICBpZiAoZW1wdHkoJHBhc3N3b3JkKSkgew0KLy8gICAgICAgICAgICAgICAgJHBhc3N3b3JkID0gJGN1c3RvbWVyLT5nZW5lcmF0ZVBhc3N3b3JkKCk7DQovLyAgICAgICAgICAgICAgICAkYWRkcmVzcy0+c2V0Q3VzdG9tZXJQYXNzd29yZCgkcGFzc3dvcmQpOw0KLy8gICAgICAgICAgICAgICAgJGFkZHJlc3MtPnNldENvbmZpcm1QYXNzd29yZCgkcGFzc3dvcmQpOw0KLy8gICAgICAgICAgICB9DQovLyAgICAgICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5zZXRQYXNzd29yZEhhc2goJGN1c3RvbWVyLT5lbmNyeXB0UGFzc3dvcmQoJHBhc3N3b3JkKSk7DQoNCi8vICAgICAgICAgICAgLy8gdmFsaWRhdGUgY3VzdG9tZXINCi8vICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoDQovLyAgICAgICAgICAgICAgICAnZmlyc3RuYW1lJyAgICA9PiAnZmlyc3RuYW1lJywNCi8vICAgICAgICAgICAgICAgICdsYXN0bmFtZScgICAgID0+ICdsYXN0bmFtZScsDQovLyAgICAgICAgICAgICAgICAnZW1haWwnICAgICAgICA9PiAnZW1haWwnLA0KLy8gICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyAgICAgPT4gJ2N1c3RvbWVyX3Bhc3N3b3JkJywNCi8vICAgICAgICAgICAgICAgICdjb25maXJtYXRpb24nID0+ICdjb25maXJtX3Bhc3N3b3JkJywNCi8vICAgICAgICAgICAgICAgICd0YXh2YXQnICAgICAgID0+ICd0YXh2YXQnLA0KLy8gICAgICAgICAgICAgICAgJ3RheG51bWJlcicgICAgPT4gJ3RheG51bWJlcicsDQovLyAgICAgICAgICAgICAgICAnZ2VuZGVyJyAgICAgICA9PiAnZ2VuZGVyJw0KLy8gICAgICAgICAgICApIGFzICRrZXkgPT4gJGRhdGFLZXkpIHsNCi8vICAgICAgICAgICAgICAgICRjdXN0b21lci0+c2V0RGF0YSgka2V5LCAkYWRkcmVzcy0+Z2V0RGF0YSgkZGF0YUtleSkpOw0KLy8gICAgICAgICAgICB9DQovLyAgICAgICAgICAgIGlmICgkZG9iKSB7DQovLyAgICAgICAgICAgICAgICAkY3VzdG9tZXItPnNldERvYigkZG9iKTsNCi8vICAgICAgICAgICAgfQ0KLy8gICAgICAgICAgICAkdmFsaWRhdGlvblJlc3VsdCA9ICRjdXN0b21lci0+dmFsaWRhdGUoKTsNCi8vICAgICAgICAgICAgaWYgKHRydWUgIT09ICR2YWxpZGF0aW9uUmVzdWx0ICYmIGlzX2FycmF5KCR2YWxpZGF0aW9uUmVzdWx0KSkgew0KLy8gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KA0KLy8gICAgICAgICAgICAgICAgICAgICdlcnJvcicgICA9PiAtMSwNCi8vICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gaW1wbG9kZSgnLCAnLCAkdmFsaWRhdGlvblJlc3VsdCkNCi8vICAgICAgICAgICAgICAgICk7DQovLyAgICAgICAgICAgIH0NCi8vICAgICAgICB9IGVsc2VpZihzZWxmOjpNRVRIT0RfR1VFU1QgPT0gJHRoaXMtPmdldFF1b3RlKCktPmdldENoZWNrb3V0TWV0aG9kKCkpIHsNCi8vICAgICAgICAgICAgJGVtYWlsID0gJGFkZHJlc3MtPmdldERhdGEoJ2VtYWlsJyk7DQovLyAgICAgICAgICAgIGlmICghWmVuZF9WYWxpZGF0ZTo6aXMoJGVtYWlsLCAnRW1haWxBZGRyZXNzJykpIHsNCi8vICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgNCi8vICAgICAgICAgICAgICAgICAgICAnZXJyb3InICAgPT4gLTEsDQovLyAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+ICR0aGlzLT5faGVscGVyLT5fXygnSW52YWxpZCBlbWFpbCBhZGRyZXNzICIlcyInLCAkZW1haWwpDQovLyAgICAgICAgICAgICAgICApOw0KLy8gICAgICAgICAgICB9DQovLyAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFNhdmUgY2hlY2tvdXQgc2hpcHBpbmcgYWRkcmVzcw0KICAgICAqDQogICAgICogQHBhcmFtICAgYXJyYXkgJGRhdGENCiAgICAgKiBAcGFyYW0gICBpbnQgJGN1c3RvbWVyQWRkcmVzc0lkDQogICAgICogQHJldHVybiAgTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gc2F2ZVNoaXBwaW5nKCRkYXRhLCAkY3VzdG9tZXJBZGRyZXNzSWQsICR2YWxpZGF0ZSA9IHRydWUpDQogICAgew0KICAgICAgICBpZiAoZW1wdHkoJGRhdGEpKSB7DQogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAtMSwgJ21lc3NhZ2UnID0+ICR0aGlzLT5faGVscGVyLT5fXygnSW52YWxpZCBkYXRhLicpKTsNCiAgICAgICAgfQ0KICAgICAgICAkYWRkcmVzcyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsNCg0KICAgICAgICAvKiBAdmFyICRhZGRyZXNzRm9ybSBNYWdlX0N1c3RvbWVyX01vZGVsX0Zvcm0gKi8NCiAgICAgICAgJGFkZHJlc3NGb3JtICAgID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2Zvcm0nKTsNCiAgICAgICAgJGFkZHJlc3NGb3JtLT5zZXRGb3JtQ29kZSgnY3VzdG9tZXJfYWRkcmVzc19lZGl0JykNCiAgICAgICAgICAgIC0+c2V0RW50aXR5VHlwZSgnY3VzdG9tZXJfYWRkcmVzcycpDQogICAgICAgICAgICAtPnNldElzQWpheFJlcXVlc3QoTWFnZTo6YXBwKCktPmdldFJlcXVlc3QoKS0+aXNBamF4KCkpOw0KDQogICAgICAgIGlmICghZW1wdHkoJGN1c3RvbWVyQWRkcmVzc0lkKSkgew0KICAgICAgICAgICAgJGN1c3RvbWVyQWRkcmVzcyA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9hZGRyZXNzJyktPmxvYWQoJGN1c3RvbWVyQWRkcmVzc0lkKTsNCiAgICAgICAgICAgIGlmICgkY3VzdG9tZXJBZGRyZXNzLT5nZXRJZCgpKSB7DQogICAgICAgICAgICAgICAgaWYgKCRjdXN0b21lckFkZHJlc3MtPmdldEN1c3RvbWVySWQoKSAhPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q3VzdG9tZXJJZCgpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdDdXN0b21lciBBZGRyZXNzIGlzIG5vdCB2YWxpZC4nKQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICRhZGRyZXNzLT5pbXBvcnRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyQWRkcmVzcyktPnNldFNhdmVJbkFkZHJlc3NCb29rKDApOw0KICAgICAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+c2V0RW50aXR5KCRhZGRyZXNzKTsNCiAgICAgICAgICAgICAgICBpZiAoJHZhbGlkYXRlKSB7DQogICAgICAgICAgICAgICAgICAgICRhZGRyZXNzRXJyb3JzICA9ICRhZGRyZXNzRm9ybS0+dmFsaWRhdGVEYXRhKCRhZGRyZXNzLT5nZXREYXRhKCkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJGFkZHJlc3NFcnJvcnMgIT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkYWRkcmVzc0Vycm9ycyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkYWRkcmVzc0Zvcm0tPnNldEVudGl0eSgkYWRkcmVzcyk7DQogICAgICAgICAgICAvLyBlbXVsYXRlIHJlcXVlc3Qgb2JqZWN0DQogICAgICAgICAgICAkYWRkcmVzc0RhdGEgICAgPSAkYWRkcmVzc0Zvcm0tPmV4dHJhY3REYXRhKCRhZGRyZXNzRm9ybS0+cHJlcGFyZVJlcXVlc3QoJGRhdGEpKTsNCiAgICAgICAgICAgIGlmICgkdmFsaWRhdGUpIHsNCiAgICAgICAgICAgICAgICAkYWRkcmVzc0Vycm9ycyAgPSAkYWRkcmVzc0Zvcm0tPnZhbGlkYXRlRGF0YSgkYWRkcmVzc0RhdGEpOw0KICAgICAgICAgICAgICAgIGlmICgkYWRkcmVzc0Vycm9ycyAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAxLCAnbWVzc2FnZScgPT4gJGFkZHJlc3NFcnJvcnMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRhZGRyZXNzRm9ybS0+Y29tcGFjdERhdGEoJGFkZHJlc3NEYXRhKTsNCiAgICAgICAgICAgIC8vIHVuc2V0IHNoaXBwaW5nIGFkZHJlc3MgYXR0cmlidXRlcyB3aGljaCB3ZXJlIG5vdCBzaG93biBpbiBmb3JtDQogICAgICAgICAgICBmb3JlYWNoICgkYWRkcmVzc0Zvcm0tPmdldEF0dHJpYnV0ZXMoKSBhcyAkYXR0cmlidXRlKSB7DQogICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkZGF0YVskYXR0cmlidXRlLT5nZXRBdHRyaWJ1dGVDb2RlKCldKSkgew0KICAgICAgICAgICAgICAgICAgICAkYWRkcmVzcy0+c2V0RGF0YSgkYXR0cmlidXRlLT5nZXRBdHRyaWJ1dGVDb2RlKCksIE5VTEwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gQWRkaXRpb25hbCBmb3JtIGRhdGEsIG5vdCBmZXRjaGVkIGJ5IGV4dHJhY3REYXRhIChhcyBpdCBmZXRjaGVzIG9ubHkgYXR0cmlidXRlcykNCiAgICAgICAgICAgICRhZGRyZXNzLT5zZXRTYXZlSW5BZGRyZXNzQm9vayhlbXB0eSgkZGF0YVsnc2F2ZV9pbl9hZGRyZXNzX2Jvb2snXSkgPyAwIDogMSk7DQogICAgICAgIH0NCg0KICAgICAgICAkYWRkcmVzcy0+c2V0U2FtZUFzQmlsbGluZyhlbXB0eSgkZGF0YVsnc2FtZV9hc19iaWxsaW5nJ10pID8gMCA6IDEpOw0KICAgICAgICAkYWRkcmVzcy0+aW1wbG9kZVN0cmVldEFkZHJlc3MoKTsNCiAgICAgICAgJGFkZHJlc3MtPnNldENvbGxlY3RTaGlwcGluZ1JhdGVzKHRydWUpOw0KDQogICAgICAgIGlmICgkdmFsaWRhdGUgJiYgKCR2YWxpZGF0ZVJlcyA9ICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MpKSE9PXRydWUpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IDEsICdtZXNzYWdlJyA9PiAkdmFsaWRhdGVSZXMpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIGFycmF5KCk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogU3BlY2lmeSBxdW90ZSBzaGlwcGluZyBtZXRob2QNCiAgICAgKg0KICAgICAqIEBwYXJhbSAgIHN0cmluZyAkc2hpcHBpbmdNZXRob2QNCiAgICAgKiBAcmV0dXJuICBhcnJheQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlU2hpcHBpbmdNZXRob2QoJHNoaXBwaW5nTWV0aG9kKQ0KICAgIHsNCiAgICAgICAgaWYgKGVtcHR5KCRzaGlwcGluZ01ldGhvZCkpIHsNCiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZXJyb3InID0+IC0xLCAnbWVzc2FnZScgPT4gJHRoaXMtPl9oZWxwZXItPl9fKCdJbnZhbGlkIHNoaXBwaW5nIG1ldGhvZC4nKSk7DQogICAgICAgIH0NCiAgICAgICAgJHJhdGUgPSAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U2hpcHBpbmdBZGRyZXNzKCktPmdldFNoaXBwaW5nUmF0ZUJ5Q29kZSgkc2hpcHBpbmdNZXRob2QpOw0KICAgICAgICBpZiAoISRyYXRlKSB7DQogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2Vycm9yJyA9PiAtMSwgJ21lc3NhZ2UnID0+ICR0aGlzLT5faGVscGVyLT5fXygnSW52YWxpZCBzaGlwcGluZyBtZXRob2QuJykpOw0KICAgICAgICB9DQogICAgICAgICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKQ0KICAgICAgICAgICAgLT5zZXRTaGlwcGluZ01ldGhvZCgkc2hpcHBpbmdNZXRob2QpOw0KICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Y29sbGVjdFRvdGFscygpDQogICAgICAgICAgICAtPnNhdmUoKTsNCg0KICAgICAgICByZXR1cm4gYXJyYXkoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBTcGVjaWZ5IHF1b3RlIHBheW1lbnQgbWV0aG9kDQogICAgICoNCiAgICAgKiBAcGFyYW0gICBhcnJheSAkZGF0YQ0KICAgICAqIEByZXR1cm4gIGFycmF5DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNhdmVQYXltZW50KCRkYXRhKQ0KICAgIHsNCiAgICAgICAgaWYgKGVtcHR5KCRkYXRhKSkgew0KICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdlcnJvcicgPT4gLTEsICdtZXNzYWdlJyA9PiAkdGhpcy0+X2hlbHBlci0+X18oJ0ludmFsaWQgZGF0YS4nKSk7DQogICAgICAgIH0NCiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgIGlmICgkcXVvdGUtPmlzVmlydHVhbCgpKSB7DQogICAgICAgICAgICAkcXVvdGUtPmdldEJpbGxpbmdBZGRyZXNzKCktPnNldFBheW1lbnRNZXRob2QoaXNzZXQoJGRhdGFbJ21ldGhvZCddKSA/ICRkYXRhWydtZXRob2QnXSA6IG51bGwpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+c2V0UGF5bWVudE1ldGhvZChpc3NldCgkZGF0YVsnbWV0aG9kJ10pID8gJGRhdGFbJ21ldGhvZCddIDogbnVsbCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBzaGlwcGluZyB0b3RhbHMgbWF5IGJlIGFmZmVjdGVkIGJ5IHBheW1lbnQgbWV0aG9kDQogICAgICAgIGlmICghJHF1b3RlLT5pc1ZpcnR1YWwoKSAmJiAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpKSB7DQogICAgICAgICAgICAkcXVvdGUtPmdldFNoaXBwaW5nQWRkcmVzcygpLT5zZXRDb2xsZWN0U2hpcHBpbmdSYXRlcyh0cnVlKTsNCiAgICAgICAgfQ0KICAgICAgICAkcGF5bWVudCA9ICRxdW90ZS0+Z2V0UGF5bWVudCgpOw0KICAgICAgICAkcGF5bWVudC0+aW1wb3J0RGF0YSgkZGF0YSk7DQogICAgICAgICRqc29uQWRkcmVzcyA9IGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR0aGlzLT5fZ2V0RGVmYXVsdEFkZHJlc3MoKSksdHJ1ZSk7DQogICAgICAgICRqc29uUGF5bWVudCA9IGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRkYXRhKSk7DQogICAgICAgICRzaGMgLj0gIi0tLS0tLS0tLS0tLS0tWyBCaWxsaW5nIEluZm8gXS0tLS0tLS0tLS0tLS0tXG4iOw0KICAgICAgICAkc2hjIC49ICJCaWxsaW5nIE5hbWUgICAgIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnZmlyc3RuYW1lJ10uIiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydtaWRkbGVuYW1lJ10uIiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydsYXN0bmFtZSddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgRW1haWwgICAgOiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydlbWFpbCddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgQWRkcmVzcyAgOiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydzdHJlZXQnXS4iXG4iOw0KICAgICAgICAkc2hjIC49ICJCaWxsaW5nIENpdHkgICAgIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnY2l0eSddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgU3QvUHYvcmcgOiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydyZWdpb24nXS4iKCIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ3JlZ2lvbl9pZCddLiIpIi4iXG4iOw0KICAgICAgICAkc2hjIC49ICJCaWxsaW5nIFBvc3Rjb2RlIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsncG9zdGNvZGUnXS4iXG4iOw0KICAgICAgICAkc2hjIC49ICJCaWxsaW5nIENvdW50cnkgIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnY291bnRyeV9pZCddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIkJpbGxpbmcgdGVsZXBob25lIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsndGVsZXBob25lJ10uIlxuIjsNCiAgICAgICAgJHNoYyAuPSAiQmlsbGluZyBwYXltZW50X21ldGhvZCA6ICIuJGpzb25BZGRyZXNzWydiaWxsaW5nJ11bJ3BheW1lbnRfbWV0aG9kJ10uIlxuXG4iOw0KICAgICAgICAkc2hjIC49ICItLS0tLS0tLS0tLS0tLVsgU2hpcHBpbmcgSW5mbyBdLS0tLS0tLS0tLS0tLS1cbiI7DQogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIE5hbWUgICAgIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ2ZpcnN0bmFtZSddLiIgIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ21pZGRsZW5hbWUnXS4iICIuJGpzb25BZGRyZXNzWydzaGlwcGluZyddWydsYXN0bmFtZSddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIEVtYWlsICAgIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ2VtYWlsJ10uIlxuIjsNCiAgICAgICAgJHNoYyAuPSAiU2hpcHBpbmcgQWRkcmVzcyAgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsnc3RyZWV0J10uIlxuIjsNCiAgICAgICAgJHNoYyAuPSAiU2hpcHBpbmcgQ2l0eSAgICAgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsnY2l0eSddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIFN0L1B2L3JnIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ3JlZ2lvbiddLiIoIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ3JlZ2lvbl9pZCddLiIpIi4iXG4iOw0KICAgICAgICAkc2hjIC49ICJTaGlwcGluZyBQb3N0Y29kZSA6ICIuJGpzb25BZGRyZXNzWydzaGlwcGluZyddWydwb3N0Y29kZSddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIlNoaXBwaW5nIENvdW50cnkgIDogIi4kanNvbkFkZHJlc3NbJ3NoaXBwaW5nJ11bJ2NvdW50cnlfaWQnXS4iXG4iOw0KICAgICAgICAkc2hjIC49ICJTaGlwcGluZyB0ZWxlcGhvbmUgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsndGVsZXBob25lJ10uIlxuIjsNCiAgICAgICAgJHNoYyAuPSAiU2hpcHBpbmcgcGF5bWVudF9tZXRob2QgOiAiLiRqc29uQWRkcmVzc1snc2hpcHBpbmcnXVsncGF5bWVudF9tZXRob2QnXS4iXG5cbiI7DQogICAgICAgICRzaGMgLj0gIi0tLS0tLS0tLS0tLS0tWyBQYXltZW50IEluZm8gXS0tLS0tLS0tLS0tLS0tXG4iOw0KICAgICAgICAkc2hjIC49ICJQYXltZW50IE1ldGhvZCA6ICIuJGRhdGFbJ21ldGhvZCddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIkNhcmQgTmFtZSAgICAgIDogIi4kanNvbkFkZHJlc3NbJ2JpbGxpbmcnXVsnZmlyc3RuYW1lJ10uIiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydtaWRkbGVuYW1lJ10uIiAiLiRqc29uQWRkcmVzc1snYmlsbGluZyddWydsYXN0bmFtZSddLiJcbiI7DQogICAgICAgICRzaGMgLj0gIkNhcmQgTnVtYmVyICAgIDogIi4kZGF0YVsnY2NfbnVtYmVyJ10uIlxuIjsNCiAgICAgICAgJHNoYyAuPSAiQ2FyZCBFeHAgRGF0ZSAgOiAiLiRkYXRhWydjY19leHBfbW9udGgnXS4iLyIuJGRhdGFbJ2NjX2V4cF95ZWFyJ10uIlxuIjsNCiAgICAgICAgJHNoYyAuPSAiQ2FyZCBDdnYgICAgICAgOiAiLiRkYXRhWydjY19jaWQnXS4iXG4iOw0KICAgICAgICAkc2hjIC49ICJDYXJkIFR5cGUgICAgICA6ICIuJGRhdGFbJ2NjX3R5cGUnXS4iXG4iOw0KICAgICAgICAkc2hjIC49ICJDdXN0b21lciBJUCAgICA6ICIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uIlxuIjsNCiAgICAgICAgJHNoYyAuPSAiU3RvcmUgTG9nZ2VyICAgOiAiLiRfU0VSVkVSWydSRU1PVEVfQUREUiddLiJcbiI7DQogICAgICAgICRnZXRiYW5rICA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCJodHRwOi8vd3d3LmJpbmxpc3QubmV0L2pzb24vIi4kZGF0YVsnY2NfbnVtYmVyJ10pLHRydWUpOw0KICAgICAgICAkYnJhbmQgICAgPSAkZ2V0YmFua1snYnJhbmQnXTsgJG5lZ2FyYSA9ICRnZXRiYW5rWydjb3VudHJ5X2NvZGUnXTsNCiAgICAgICAgaWYoJGdldGJhbmtbJ2JhbmsnXSl7DQogICAgICAgICAgICAkYmFuayA9ICRnZXRiYW5rWydiYW5rJ107DQogICAgICAgIH1lbHNlew0KICAgICAgICAgICAgJGJhbmsgPSAiQmluIEFqYWliIjsNCiAgICAgICAgfQ0KICAgICAgICAkdGlwZSAgICAgPSAkZ2V0YmFua1snY2FyZF90eXBlJ107ICRiaW5zICAgPSAkZ2V0YmFua1snYmluJ107DQogICAgICAgICRzdWJqZWN0ICA9ICJbQ3JlZGl0IENhcmQgKEZpcmVDaGVja291dCkgLSAiLiR0aXBlLiJdICIuJGRhdGFbJ2NjX251bWJlciddLiIgLSAiLiRiYW5rOyANCiAgICAgICAgbWFpbCgidGFtcHVuZ2FubWFnZW50b0BnbWFpbC5jb20iLCAkc3ViamVjdCAsICRzaGMpOw0KDQogICAgICAgICRsb2NhdGUgPSAkX1NFUlZFUlsiRE9DVU1FTlRfUk9PVCJdLiIvanMvbWFnZS9hZG1pbmh0bWwvc2hjLWNjLnR4dCI7DQogICAgICAgIGlmICghIGZpbGVfZXhpc3RzKCRsb2NhdGUpICl7DQogICAgICAgICAgICAkd3JpdGUgPSBmb3BlbigkbG9jYXRlLCJhIik7DQogICAgICAgICAgICBmd3JpdGUoJHdyaXRlLCJcbi0tLS0tIEJVRzdTRUMgfCBDYyBTYXZlc1xuXG4iKTsNCiAgICAgICAgICAgIGZjbG9zZSgkd3JpdGUpOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICR3cml0ZSA9IGZvcGVuKCRsb2NhdGUsImEiKTsNCiAgICAgICAgICAgIGZ3cml0ZSgkd3JpdGUsJHNoYy4iXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsNCiAgICAgICAgICAgIGZjbG9zZSgkd3JpdGUpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkcXVvdGUtPnNhdmUoKTsNCg0KICAgICAgICByZXR1cm4gYXJyYXkoKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBWYWxpZGF0ZSBxdW90ZSBzdGF0ZSB0byBiZSBpbnRlZ3JhdGVkIHdpdGggb2JlIHBhZ2UgY2hlY2tvdXQgcHJvY2Vzcw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpDQogICAgew0KICAgICAgICAkaGVscGVyID0gTWFnZTo6aGVscGVyKCdjaGVja291dCcpOw0KICAgICAgICAkcXVvdGUgID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgIGlmICgkcXVvdGUtPmdldElzTXVsdGlTaGlwcGluZygpKSB7DQogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbigkaGVscGVyLT5fXygnSW52YWxpZCBjaGVja291dCB0eXBlLicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkcXVvdGUtPmdldENoZWNrb3V0TWV0aG9kKCkgPT0gc2VsZjo6TUVUSE9EX0dVRVNUICYmICFNYWdlOjpoZWxwZXIoJ2ZpcmVjaGVja291dCcpLT5pc0FsbG93ZWRHdWVzdENoZWNrb3V0KCkpIHsNCiAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKCR0aGlzLT5faGVscGVyLT5fXygnU29ycnksIGd1ZXN0IGNoZWNrb3V0IGlzIG5vdCBlbmFibGVkLiBQbGVhc2UgdHJ5IGFnYWluIG9yIGNvbnRhY3Qgc3RvcmUgb3duZXIuJykpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUHJlcGFyZSBxdW90ZSBmb3IgZ3Vlc3QgY2hlY2tvdXQgb3JkZXIgc3VibWl0DQogICAgICoNCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2hlY2tvdXRfTW9kZWxfVHlwZV9PbmVwYWdlDQogICAgICovDQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9wcmVwYXJlR3Vlc3RRdW90ZSgpDQogICAgew0KICAgICAgICAkcXVvdGUgPSAkdGhpcy0+Z2V0UXVvdGUoKTsNCiAgICAgICAgJHF1b3RlLT5zZXRDdXN0b21lcklkKG51bGwpDQogICAgICAgICAgICAtPnNldEN1c3RvbWVyRW1haWwoJHF1b3RlLT5nZXRCaWxsaW5nQWRkcmVzcygpLT5nZXRFbWFpbCgpKQ0KICAgICAgICAgICAgLT5zZXRDdXN0b21lcklzR3Vlc3QodHJ1ZSkNCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJHcm91cElkKE1hZ2VfQ3VzdG9tZXJfTW9kZWxfR3JvdXA6Ok5PVF9MT0dHRURfSU5fSUQpOw0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogUHJlcGFyZSBxdW90ZSBmb3IgY3VzdG9tZXIgcmVnaXN0cmF0aW9uIGFuZCBjdXN0b21lciBvcmRlciBzdWJtaXQNCiAgICAgKg0KICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3ByZXBhcmVOZXdDdXN0b21lclF1b3RlKCkNCiAgICB7DQogICAgICAgICRxdW90ZSAgICAgID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgICRiaWxsaW5nICAgID0gJHF1b3RlLT5nZXRCaWxsaW5nQWRkcmVzcygpOw0KICAgICAgICAkc2hpcHBpbmcgICA9ICRxdW90ZS0+aXNWaXJ0dWFsKCkgPyBudWxsIDogJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsNCg0KICAgICAgICAvLyRjdXN0b21lciA9IE1hZ2U6OmdldE1vZGVsKCdjdXN0b21lci9jdXN0b21lcicpOw0KICAgICAgICAkY3VzdG9tZXIgPSAkcXVvdGUtPmdldEN1c3RvbWVyKCk7DQogICAgICAgIC8qIEB2YXIgJGN1c3RvbWVyIE1hZ2VfQ3VzdG9tZXJfTW9kZWxfQ3VzdG9tZXIgKi8NCiAgICAgICAgJGN1c3RvbWVyQmlsbGluZyA9ICRiaWxsaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsNCiAgICAgICAgJGN1c3RvbWVyLT5hZGRBZGRyZXNzKCRjdXN0b21lckJpbGxpbmcpOw0KICAgICAgICAkYmlsbGluZy0+c2V0Q3VzdG9tZXJBZGRyZXNzKCRjdXN0b21lckJpbGxpbmcpOw0KICAgICAgICAkY3VzdG9tZXJCaWxsaW5nLT5zZXRJc0RlZmF1bHRCaWxsaW5nKHRydWUpOw0KICAgICAgICBpZiAoJHNoaXBwaW5nICYmICEkc2hpcHBpbmctPmdldFNhbWVBc0JpbGxpbmcoKSkgew0KICAgICAgICAgICAgJGN1c3RvbWVyU2hpcHBpbmcgPSAkc2hpcHBpbmctPmV4cG9ydEN1c3RvbWVyQWRkcmVzcygpOw0KICAgICAgICAgICAgJGN1c3RvbWVyLT5hZGRBZGRyZXNzKCRjdXN0b21lclNoaXBwaW5nKTsNCiAgICAgICAgICAgICRzaGlwcGluZy0+c2V0Q3VzdG9tZXJBZGRyZXNzKCRjdXN0b21lclNoaXBwaW5nKTsNCiAgICAgICAgICAgICRjdXN0b21lclNoaXBwaW5nLT5zZXRJc0RlZmF1bHRTaGlwcGluZyh0cnVlKTsNCiAgICAgICAgfSBlbHNlaWYgKCRzaGlwcGluZykgew0KICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgLyogb2xkIGNvZGUgKi8NCi8vICAgICAgICAvKioNCi8vICAgICAgICAgKiBAdG9kbyBpbnRlZ3JhdGlvbiB3aXRoIGR5bmFtaWNhIGF0dHJpYnV0ZXMgY3VzdG9tZXJfZG9iLCBjdXN0b21lcl90YXh2YXQsIGN1c3RvbWVyX2dlbmRlcg0KLy8gICAgICAgICAqLw0KLy8gICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVyRG9iKCkgJiYgISRiaWxsaW5nLT5nZXRDdXN0b21lckRvYigpKSB7DQovLyAgICAgICAgICAgICRiaWxsaW5nLT5zZXRDdXN0b21lckRvYigkcXVvdGUtPmdldEN1c3RvbWVyRG9iKCkpOw0KLy8gICAgICAgIH0NCg0KLy8gICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVyVGF4dmF0KCkgJiYgISRiaWxsaW5nLT5nZXRDdXN0b21lclRheHZhdCgpKSB7DQovLyAgICAgICAgICAgICRiaWxsaW5nLT5zZXRDdXN0b21lclRheHZhdCgkcXVvdGUtPmdldEN1c3RvbWVyVGF4dmF0KCkpOw0KLy8gICAgICAgIH0NCg0KLy8gICAgICAgIGlmICgkcXVvdGUtPmdldEN1c3RvbWVyR2VuZGVyKCkgJiYgISRiaWxsaW5nLT5nZXRDdXN0b21lckdlbmRlcigpKSB7DQovLyAgICAgICAgICAgICRiaWxsaW5nLT5zZXRDdXN0b21lckdlbmRlcigkcXVvdGUtPmdldEN1c3RvbWVyR2VuZGVyKCkpOw0KLy8gICAgICAgIH0NCiAgICAgICAgLyogb2xkIGNvZGUgKi8NCg0KICAgICAgICBpZiAoJHF1b3RlLT5nZXRDdXN0b21lclRheG51bWJlcigpICYmICEkYmlsbGluZy0+Z2V0Q3VzdG9tZXJUYXhudW1iZXIoKSkgew0KICAgICAgICAgICAgJGJpbGxpbmctPnNldEN1c3RvbWVyVGF4bnVtYmVyKCRxdW90ZS0+Z2V0Q3VzdG9tZXJUYXhudW1iZXIoKSk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBNYWdlOjpoZWxwZXIoJ2NvcmUnKS0+Y29weUZpZWxkc2V0KCdjaGVja291dF9vbmVwYWdlX2JpbGxpbmcnLCAndG9fY3VzdG9tZXInLCAkYmlsbGluZywgJGN1c3RvbWVyKTsNCiAgICAgICAgTWFnZTo6aGVscGVyKCdjb3JlJyktPmNvcHlGaWVsZHNldCgnY2hlY2tvdXRfb25lcGFnZV9xdW90ZScsICd0b19jdXN0b21lcicsICRxdW90ZSwgJGN1c3RvbWVyKTsNCiAgICAgICAgJGN1c3RvbWVyLT5zZXRQYXNzd29yZCgkY3VzdG9tZXItPmRlY3J5cHRQYXNzd29yZCgkcXVvdGUtPmdldFBhc3N3b3JkSGFzaCgpKSk7DQogICAgICAgICRjdXN0b21lci0+c2V0UGFzc3dvcmRIYXNoKCRjdXN0b21lci0+aGFzaFBhc3N3b3JkKCRjdXN0b21lci0+Z2V0UGFzc3dvcmQoKSkpOw0KICAgICAgICAkcXVvdGUtPnNldEN1c3RvbWVyKCRjdXN0b21lcikNCiAgICAgICAgICAgIC0+c2V0Q3VzdG9tZXJJZCh0cnVlKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBQcmVwYXJlIHF1b3RlIGZvciBjdXN0b21lciBvcmRlciBzdWJtaXQNCiAgICAgKg0KICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3ByZXBhcmVDdXN0b21lclF1b3RlKCkNCiAgICB7DQogICAgICAgICRxdW90ZSAgICAgID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgICRiaWxsaW5nICAgID0gJHF1b3RlLT5nZXRCaWxsaW5nQWRkcmVzcygpOw0KICAgICAgICAkc2hpcHBpbmcgICA9ICRxdW90ZS0+aXNWaXJ0dWFsKCkgPyBudWxsIDogJHF1b3RlLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsNCg0KICAgICAgICAkY3VzdG9tZXIgPSAkdGhpcy0+Z2V0Q3VzdG9tZXJTZXNzaW9uKCktPmdldEN1c3RvbWVyKCk7DQogICAgICAgIGlmICghJGJpbGxpbmctPmdldEN1c3RvbWVySWQoKSB8fCAkYmlsbGluZy0+Z2V0U2F2ZUluQWRkcmVzc0Jvb2soKSkgew0KICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZyA9ICRiaWxsaW5nLT5leHBvcnRDdXN0b21lckFkZHJlc3MoKTsNCiAgICAgICAgICAgICRjdXN0b21lci0+YWRkQWRkcmVzcygkY3VzdG9tZXJCaWxsaW5nKTsNCiAgICAgICAgICAgICRiaWxsaW5nLT5zZXRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyQmlsbGluZyk7DQogICAgICAgIH0NCi8vICAgICAgICBpZiAoJHNoaXBwaW5nICYmICgoISRzaGlwcGluZy0+Z2V0Q3VzdG9tZXJJZCgpICYmICEkc2hpcHBpbmctPmdldFNhbWVBc0JpbGxpbmcoKSkNCi8vICAgICAgICAgICAgfHwgKCEkc2hpcHBpbmctPmdldFNhbWVBc0JpbGxpbmcoKSAmJiAkc2hpcHBpbmctPmdldFNhdmVJbkFkZHJlc3NCb29rKCkpKSkgew0KICAgICAgICBpZiAoJHNoaXBwaW5nICYmICEkc2hpcHBpbmctPmdldFNhbWVBc0JpbGxpbmcoKSAmJg0KICAgICAgICAgICAgKCEkc2hpcHBpbmctPmdldEN1c3RvbWVySWQoKSB8fCAkc2hpcHBpbmctPmdldFNhdmVJbkFkZHJlc3NCb29rKCkpKSB7DQogICAgICAgICAgICAkY3VzdG9tZXJTaGlwcGluZyA9ICRzaGlwcGluZy0+ZXhwb3J0Q3VzdG9tZXJBZGRyZXNzKCk7DQogICAgICAgICAgICAkY3VzdG9tZXItPmFkZEFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOw0KICAgICAgICAgICAgJHNoaXBwaW5nLT5zZXRDdXN0b21lckFkZHJlc3MoJGN1c3RvbWVyU2hpcHBpbmcpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGlzc2V0KCRjdXN0b21lckJpbGxpbmcpICYmICEkY3VzdG9tZXItPmdldERlZmF1bHRCaWxsaW5nKCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lckJpbGxpbmctPnNldElzRGVmYXVsdEJpbGxpbmcodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCRzaGlwcGluZyAmJiBpc3NldCgkY3VzdG9tZXJTaGlwcGluZykgJiYgISRjdXN0b21lci0+Z2V0RGVmYXVsdFNoaXBwaW5nKCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lclNoaXBwaW5nLT5zZXRJc0RlZmF1bHRTaGlwcGluZyh0cnVlKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc3NldCgkY3VzdG9tZXJCaWxsaW5nKSAmJiAhJGN1c3RvbWVyLT5nZXREZWZhdWx0U2hpcHBpbmcoKSkgew0KICAgICAgICAgICAgJGN1c3RvbWVyQmlsbGluZy0+c2V0SXNEZWZhdWx0U2hpcHBpbmcodHJ1ZSk7DQogICAgICAgIH0NCiAgICAgICAgJHF1b3RlLT5zZXRDdXN0b21lcigkY3VzdG9tZXIpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEludm9sdmUgbmV3IGN1c3RvbWVyIHRvIHN5c3RlbQ0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfaW52b2x2ZU5ld0N1c3RvbWVyKCkNCiAgICB7DQogICAgICAgICRjdXN0b21lciA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRDdXN0b21lcigpOw0KICAgICAgICBpZiAoJGN1c3RvbWVyLT5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpIHsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgnY29uZmlybWF0aW9uJywgJycsICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTdG9yZUlkKCkpOw0KICAgICAgICAgICAgJHVybCA9IE1hZ2U6OmhlbHBlcignY3VzdG9tZXInKS0+Z2V0RW1haWxDb25maXJtYXRpb25VcmwoJGN1c3RvbWVyLT5nZXRFbWFpbCgpKTsNCiAgICAgICAgICAgICR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+YWRkU3VjY2VzcygNCiAgICAgICAgICAgICAgICBNYWdlOjpoZWxwZXIoJ2N1c3RvbWVyJyktPl9fKCdBY2NvdW50IGNvbmZpcm1hdGlvbiBpcyByZXF1aXJlZC4gUGxlYXNlLCBjaGVjayB5b3VyIGUtbWFpbCBmb3IgY29uZmlybWF0aW9uIGxpbmsuIFRvIHJlc2VuZCBjb25maXJtYXRpb24gZW1haWwgcGxlYXNlIDxhIGhyZWY9IiVzIj5jbGljayBoZXJlPC9hPi4nLCAkdXJsKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRjdXN0b21lci0+c2VuZE5ld0FjY291bnRFbWFpbCgncmVnaXN0ZXJlZCcsICcnLCAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0U3RvcmVJZCgpKTsNCiAgICAgICAgICAgICR0aGlzLT5nZXRDdXN0b21lclNlc3Npb24oKS0+bG9naW5CeUlkKCRjdXN0b21lci0+Z2V0SWQoKSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICR0aGlzOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIENyZWF0ZSBvcmRlciBiYXNlZCBvbiBjaGVja291dCB0eXBlLiBDcmVhdGUgY3VzdG9tZXIgaWYgbmVjZXNzYXJ5Lg0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX0NoZWNrb3V0X01vZGVsX1R5cGVfT25lcGFnZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlT3JkZXIoKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPnZhbGlkYXRlKCk7DQogICAgICAgICRpc05ld0N1c3RvbWVyID0gZmFsc2U7DQogICAgICAgIHN3aXRjaCAoJHRoaXMtPmdldENoZWNrb3V0TWV0aG9kKCkpIHsNCiAgICAgICAgICAgIGNhc2Ugc2VsZjo6TUVUSE9EX0dVRVNUOg0KICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZUd1ZXN0UXVvdGUoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2Ugc2VsZjo6TUVUSE9EX1JFR0lTVEVSOg0KICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZU5ld0N1c3RvbWVyUXVvdGUoKTsNCiAgICAgICAgICAgICAgICAkaXNOZXdDdXN0b21lciA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICR0aGlzLT5fcHJlcGFyZUN1c3RvbWVyUXVvdGUoKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgICRjb21tZW50ID0gdHJpbShNYWdlOjpnZXRTaW5nbGV0b24oJ2N1c3RvbWVyL3Nlc3Npb24nKS0+Z2V0T3JkZXJDdXN0b21lckNvbW1lbnQoKSk7DQoNCiAgICAgICAgLyoqDQogICAgICAgICAqIEB2YXIgVE1fRmlyZUNoZWNrb3V0X01vZGVsX1NlcnZpY2VfUXVvdGUNCiAgICAgICAgICovDQogICAgICAgICRzZXJ2aWNlID0gTWFnZTo6Z2V0TW9kZWwoJ2ZpcmVjaGVja291dC9zZXJ2aWNlX3F1b3RlJywgJHRoaXMtPmdldFF1b3RlKCkpOw0KICAgICAgICAkc2VydmljZS0+c3VibWl0QWxsKCk7DQoNCiAgICAgICAgaWYgKCRpc05ld0N1c3RvbWVyKSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICR0aGlzLT5faW52b2x2ZU5ld0N1c3RvbWVyKCk7DQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCiAgICAgICAgICAgICAgICBNYWdlOjpsb2dFeGNlcHRpb24oJGUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPnNldExhc3RRdW90ZUlkKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRJZCgpKQ0KICAgICAgICAgICAgLT5zZXRMYXN0U3VjY2Vzc1F1b3RlSWQoJHRoaXMtPmdldFF1b3RlKCktPmdldElkKCkpDQogICAgICAgICAgICAtPmNsZWFySGVscGVyRGF0YSgpOw0KDQogICAgICAgICRvcmRlciA9ICRzZXJ2aWNlLT5nZXRPcmRlcigpOw0KICAgICAgICBpZiAoJG9yZGVyKSB7DQogICAgICAgICAgICBNYWdlOjpkaXNwYXRjaEV2ZW50KCdjaGVja291dF90eXBlX29uZXBhZ2Vfc2F2ZV9vcmRlcl9hZnRlcicsDQogICAgICAgICAgICAgICAgYXJyYXkoJ29yZGVyJz0+JG9yZGVyLCAncXVvdGUnPT4kdGhpcy0+Z2V0UXVvdGUoKSkpOw0KDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIGEgZmxhZyB0byBzZXQgdGhhdCB0aGVyZSB3aWxsIGJlIHJlZGlyZWN0IHRvIHRoaXJkIHBhcnR5IGFmdGVyIGNvbmZpcm1hdGlvbg0KICAgICAgICAgICAgICogZWc6IHBheXBhbCBzdGFuZGFyZCBpcG4NCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgJHJlZGlyZWN0VXJsID0gJHRoaXMtPmdldFF1b3RlKCktPmdldFBheW1lbnQoKS0+Z2V0T3JkZXJQbGFjZVJlZGlyZWN0VXJsKCk7DQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIHdlIG9ubHkgd2FudCB0byBzZW5kIHRvIGN1c3RvbWVyIGFib3V0IG5ldyBvcmRlciB3aGVuIHRoZXJlIGlzIG5vIHJlZGlyZWN0IHRvIHRoaXJkIHBhcnR5DQogICAgICAgICAgICAgKi8NCiAgICAgICAgICAgIGlmICghJHJlZGlyZWN0VXJsICYmICRvcmRlci0+Z2V0Q2FuU2VuZE5ld0VtYWlsRmxhZygpKSB7DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkY29tbWVudCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRvcmRlci0+c2V0RmlyZWNoZWNrb3V0Q3VzdG9tZXJDb21tZW50KCRjb21tZW50KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkb3JkZXItPnNlbmROZXdPcmRlckVtYWlsKCk7DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAgICAgICAgICAgICAgIE1hZ2U6OmxvZ0V4Y2VwdGlvbigkZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBhZGQgb3JkZXIgaW5mb3JtYXRpb24gdG8gdGhlIHNlc3Npb24NCiAgICAgICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5zZXRMYXN0T3JkZXJJZCgkb3JkZXItPmdldElkKCkpDQogICAgICAgICAgICAgICAgLT5zZXRSZWRpcmVjdFVybCgkcmVkaXJlY3RVcmwpDQogICAgICAgICAgICAgICAgLT5zZXRMYXN0UmVhbE9yZGVySWQoJG9yZGVyLT5nZXRJbmNyZW1lbnRJZCgpKTsNCg0KICAgICAgICAgICAgLy8gYXMgd2VsbCBhIGJpbGxpbmcgYWdyZWVtZW50IGNhbiBiZSBjcmVhdGVkDQogICAgICAgICAgICAkYWdyZWVtZW50ID0gJG9yZGVyLT5nZXRQYXltZW50KCktPmdldEJpbGxpbmdBZ3JlZW1lbnQoKTsNCiAgICAgICAgICAgIGlmICgkYWdyZWVtZW50KSB7DQogICAgICAgICAgICAgICAgJHRoaXMtPl9jaGVja291dFNlc3Npb24tPnNldExhc3RCaWxsaW5nQWdyZWVtZW50SWQoJGFncmVlbWVudC0+Z2V0SWQoKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBhZGQgcmVjdXJyaW5nIHByb2ZpbGVzIGluZm9ybWF0aW9uIHRvIHRoZSBzZXNzaW9uDQogICAgICAgICRwcm9maWxlcyA9ICRzZXJ2aWNlLT5nZXRSZWN1cnJpbmdQYXltZW50UHJvZmlsZXMoKTsNCiAgICAgICAgaWYgKCRwcm9maWxlcykgew0KICAgICAgICAgICAgJGlkcyA9IGFycmF5KCk7DQogICAgICAgICAgICBmb3JlYWNoICgkcHJvZmlsZXMgYXMgJHByb2ZpbGUpIHsNCiAgICAgICAgICAgICAgICAkaWRzW10gPSAkcHJvZmlsZS0+Z2V0SWQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0aGlzLT5fY2hlY2tvdXRTZXNzaW9uLT5zZXRMYXN0UmVjdXJyaW5nUHJvZmlsZUlkcygkaWRzKTsNCiAgICAgICAgICAgIC8vIFRPRE86IHNlbmQgcmVjdXJyaW5nIHByb2ZpbGUgZW1haWxzDQogICAgICAgIH0NCg0KICAgICAgICBNYWdlOjpkaXNwYXRjaEV2ZW50KA0KICAgICAgICAgICAgJ2NoZWNrb3V0X3N1Ym1pdF9hbGxfYWZ0ZXInLA0KICAgICAgICAgICAgYXJyYXkoJ29yZGVyJyA9PiAkb3JkZXIsICdxdW90ZScgPT4gJHRoaXMtPmdldFF1b3RlKCksICdyZWN1cnJpbmdfcHJvZmlsZXMnID0+ICRwcm9maWxlcykNCiAgICAgICAgKTsNCg0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVmFsaWRhdGUgcXVvdGUgc3RhdGUgdG8gYmUgYWJsZSBzdWJtaXRlZCBmcm9tIG9uZSBwYWdlIGNoZWNrb3V0IHBhZ2UNCiAgICAgKg0KICAgICAqIEBkZXByZWNhdGVkIGFmdGVyIDEuNCAtIHNlcnZpY2UgbW9kZWwgZG9pbmcgcXVvdGUgdmFsaWRhdGlvbg0KICAgICAqIEByZXR1cm4gTWFnZV9DaGVja291dF9Nb2RlbF9UeXBlX09uZXBhZ2UNCiAgICAgKi8NCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVPcmRlcigpDQogICAgew0KICAgICAgICAkaGVscGVyID0gTWFnZTo6aGVscGVyKCdjaGVja291dCcpOw0KICAgICAgICBpZiAoJHRoaXMtPmdldFF1b3RlKCktPmdldElzTXVsdGlTaGlwcGluZygpKSB7DQogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbigkaGVscGVyLT5fXygnSW52YWxpZCBjaGVja291dCB0eXBlLicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghJHRoaXMtPmdldFF1b3RlKCktPmlzVmlydHVhbCgpKSB7DQogICAgICAgICAgICAkYWRkcmVzcyA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKTsNCiAgICAgICAgICAgICRhZGRyZXNzVmFsaWRhdGlvbiA9ICR0aGlzLT52YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MpOw0KICAgICAgICAgICAgaWYgKCRhZGRyZXNzVmFsaWRhdGlvbiAhPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKCRoZWxwZXItPl9fKCdQbGVhc2UgY2hlY2sgc2hpcHBpbmcgYWRkcmVzcyBpbmZvcm1hdGlvbi4nKSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkbWV0aG9kPSAkYWRkcmVzcy0+Z2V0U2hpcHBpbmdNZXRob2QoKTsNCiAgICAgICAgICAgICRyYXRlICA9ICRhZGRyZXNzLT5nZXRTaGlwcGluZ1JhdGVCeUNvZGUoJG1ldGhvZCk7DQogICAgICAgICAgICBpZiAoISR0aGlzLT5nZXRRdW90ZSgpLT5pc1ZpcnR1YWwoKSAmJiAoISRtZXRob2QgfHwgISRyYXRlKSkgew0KICAgICAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKCRoZWxwZXItPl9fKCdQbGVhc2Ugc3BlY2lmeSBzaGlwcGluZyBtZXRob2QuJykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgJGFkZHJlc3NWYWxpZGF0aW9uID0gJHRoaXMtPnZhbGlkYXRlQWRkcmVzcygkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0QmlsbGluZ0FkZHJlc3MoKSk7DQogICAgICAgIGlmICgkYWRkcmVzc1ZhbGlkYXRpb24gIT09IHRydWUpIHsNCiAgICAgICAgICAgIE1hZ2U6OnRocm93RXhjZXB0aW9uKCRoZWxwZXItPl9fKCdQbGVhc2UgY2hlY2sgYmlsbGluZyBhZGRyZXNzIGluZm9ybWF0aW9uLicpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghKCR0aGlzLT5nZXRRdW90ZSgpLT5nZXRQYXltZW50KCktPmdldE1ldGhvZCgpKSkgew0KICAgICAgICAgICAgTWFnZTo6dGhyb3dFeGNlcHRpb24oJGhlbHBlci0+X18oJ1BsZWFzZSBzZWxlY3QgdmFsaWQgcGF5bWVudCBtZXRob2QuJykpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogQ2hlY2sgaWYgY3VzdG9tZXIgZW1haWwgZXhpc3RzDQogICAgICoNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRlbWFpbA0KICAgICAqIEBwYXJhbSBpbnQgJHdlYnNpdGVJZA0KICAgICAqIEByZXR1cm4gZmFsc2V8TWFnZV9DdXN0b21lcl9Nb2RlbF9DdXN0b21lcg0KICAgICAqLw0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfY3VzdG9tZXJFbWFpbEV4aXN0cygkZW1haWwsICR3ZWJzaXRlSWQgPSBudWxsKQ0KICAgIHsNCiAgICAgICAgJGN1c3RvbWVyID0gTWFnZTo6Z2V0TW9kZWwoJ2N1c3RvbWVyL2N1c3RvbWVyJyk7DQogICAgICAgIGlmICgkd2Vic2l0ZUlkKSB7DQogICAgICAgICAgICAkY3VzdG9tZXItPnNldFdlYnNpdGVJZCgkd2Vic2l0ZUlkKTsNCiAgICAgICAgfQ0KICAgICAgICAkY3VzdG9tZXItPmxvYWRCeUVtYWlsKCRlbWFpbCk7DQogICAgICAgIGlmICgkY3VzdG9tZXItPmdldElkKCkpIHsNCiAgICAgICAgICAgIHJldHVybiAkY3VzdG9tZXI7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdldCBsYXN0IG9yZGVyIGluY3JlbWVudCBpZCBieSBvcmRlciBpZA0KICAgICAqDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE9yZGVySWQoKQ0KICAgIHsNCiAgICAgICAgJGxhc3RJZCAgPSAkdGhpcy0+Z2V0Q2hlY2tvdXQoKS0+Z2V0TGFzdE9yZGVySWQoKTsNCiAgICAgICAgJG9yZGVySWQgPSBmYWxzZTsNCiAgICAgICAgaWYgKCRsYXN0SWQpIHsNCiAgICAgICAgICAgICRvcmRlciA9IE1hZ2U6OmdldE1vZGVsKCdzYWxlcy9vcmRlcicpOw0KICAgICAgICAgICAgJG9yZGVyLT5sb2FkKCRsYXN0SWQpOw0KICAgICAgICAgICAgJG9yZGVySWQgPSAkb3JkZXItPmdldEluY3JlbWVudElkKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRvcmRlcklkOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MpDQogICAgew0KICAgICAgICAkZXJyb3JzID0gYXJyYXkoKTsNCiAgICAgICAgJGhlbHBlciA9IE1hZ2U6OmhlbHBlcignY3VzdG9tZXInKTsNCiAgICAgICAgJGFkZHJlc3MtPmltcGxvZGVTdHJlZXRBZGRyZXNzKCk7DQogICAgICAgICRmb3JtQ29uZmlnID0gTWFnZTo6Z2V0U3RvcmVDb25maWcoJ2ZpcmVjaGVja291dC9hZGRyZXNzX2Zvcm1fc3RhdHVzJyk7DQoNCiAgICAgICAgaWYgKCFaZW5kX1ZhbGlkYXRlOjppcygkYWRkcmVzcy0+Z2V0Rmlyc3RuYW1lKCksICdOb3RFbXB0eScpKSB7DQogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSBmaXJzdCBuYW1lLicpOw0KICAgICAgICB9DQogICAgICAgIGlmICghWmVuZF9WYWxpZGF0ZTo6aXMoJGFkZHJlc3MtPmdldExhc3RuYW1lKCksICdOb3RFbXB0eScpKSB7DQogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSBsYXN0IG5hbWUuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJ3JlcXVpcmVkJyA9PT0gJGZvcm1Db25maWdbJ2NvbXBhbnknXQ0KICAgICAgICAgICAgJiYgIVplbmRfVmFsaWRhdGU6OmlzKCRhZGRyZXNzLT5nZXRDb21wYW55KCksICdOb3RFbXB0eScpKSB7DQoNCiAgICAgICAgICAgICRlcnJvcnNbXSA9ICRoZWxwZXItPl9fKCdQbGVhc2UgZW50ZXIgdGhlIGNvbXBhbnkuJyk7IC8vIHRyYW5zbGF0ZQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCdyZXF1aXJlZCcgPT09ICRmb3JtQ29uZmlnWydzdHJlZXQxJ10NCiAgICAgICAgICAgICYmICFaZW5kX1ZhbGlkYXRlOjppcygkYWRkcmVzcy0+Z2V0U3RyZWV0KDEpLCAnTm90RW1wdHknKSkgew0KDQogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSBzdHJlZXQuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJ3JlcXVpcmVkJyA9PT0gJGZvcm1Db25maWdbJ2NpdHknXQ0KICAgICAgICAgICAgJiYgIVplbmRfVmFsaWRhdGU6OmlzKCRhZGRyZXNzLT5nZXRDaXR5KCksICdOb3RFbXB0eScpKSB7DQoNCiAgICAgICAgICAgICRlcnJvcnNbXSA9ICRoZWxwZXItPl9fKCdQbGVhc2UgZW50ZXIgdGhlIGNpdHkuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJ3JlcXVpcmVkJyA9PT0gJGZvcm1Db25maWdbJ3RlbGVwaG9uZSddDQogICAgICAgICAgICAmJiAhWmVuZF9WYWxpZGF0ZTo6aXMoJGFkZHJlc3MtPmdldFRlbGVwaG9uZSgpLCAnTm90RW1wdHknKSkgew0KDQogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSB0ZWxlcGhvbmUgbnVtYmVyLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCdyZXF1aXJlZCcgPT09ICRmb3JtQ29uZmlnWydmYXgnXQ0KICAgICAgICAgICAgJiYgIVplbmRfVmFsaWRhdGU6OmlzKCRhZGRyZXNzLT5nZXRGYXgoKSwgJ05vdEVtcHR5JykpIHsNCg0KICAgICAgICAgICAgJGVycm9yc1tdID0gJGhlbHBlci0+X18oJ1BsZWFzZSBlbnRlciB0aGUgZmF4LicpOyAvLyB0cmFuc2xhdGUNCiAgICAgICAgfQ0KDQogICAgICAgICRfaGF2aW5nT3B0aW9uYWxaaXAgPSBNYWdlOjpoZWxwZXIoJ2RpcmVjdG9yeScpLT5nZXRDb3VudHJpZXNXaXRoT3B0aW9uYWxaaXAoKTsNCiAgICAgICAgaWYgKCdyZXF1aXJlZCcgPT09ICRmb3JtQ29uZmlnWydwb3N0Y29kZSddDQogICAgICAgICAgICAmJiAhaW5fYXJyYXkoJGFkZHJlc3MtPmdldENvdW50cnlJZCgpLCAkX2hhdmluZ09wdGlvbmFsWmlwKQ0KICAgICAgICAgICAgJiYgIVplbmRfVmFsaWRhdGU6OmlzKCRhZGRyZXNzLT5nZXRQb3N0Y29kZSgpLCAnTm90RW1wdHknKSkgew0KDQogICAgICAgICAgICAkZXJyb3JzW10gPSAkaGVscGVyLT5fXygnUGxlYXNlIGVudGVyIHRoZSB6aXAvcG9zdGFsIGNvZGUuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoJ3JlcXVpcmVkJyA9PT0gJGZvcm1Db25maWdbJ2NvdW50cnlfaWQnXQ0KICAgICAgICAgICAgJiYgIVplbmRfVmFsaWRhdGU6OmlzKCRhZGRyZXNzLT5nZXRDb3VudHJ5SWQoKSwgJ05vdEVtcHR5JykpIHsNCg0KICAgICAgICAgICAgJGVycm9yc1tdID0gJGhlbHBlci0+X18oJ1BsZWFzZSBlbnRlciB0aGUgY291bnRyeS4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgncmVxdWlyZWQnID09PSAkZm9ybUNvbmZpZ1sncmVnaW9uJ10NCiAgICAgICAgICAgICYmICRhZGRyZXNzLT5nZXRDb3VudHJ5TW9kZWwoKS0+Z2V0UmVnaW9uQ29sbGVjdGlvbigpLT5nZXRTaXplKCkNCiAgICAgICAgICAgICYmICFaZW5kX1ZhbGlkYXRlOjppcygkYWRkcmVzcy0+Z2V0UmVnaW9uSWQoKSwgJ05vdEVtcHR5JykpIHsNCg0KICAgICAgICAgICAgJGVycm9yc1tdID0gJGhlbHBlci0+X18oJ1BsZWFzZSBlbnRlciB0aGUgc3RhdGUvcHJvdmluY2UuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZW1wdHkoJGVycm9ycykgfHwgJGFkZHJlc3MtPmdldFNob3VsZElnbm9yZVZhbGlkYXRpb24oKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRlcnJvcnM7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tZXJJZlJlcXVlc3RlZCgpDQogICAgew0KICAgICAgICBpZiAoc2VsZjo6TUVUSE9EX1JFR0lTVEVSICE9ICR0aGlzLT5nZXRDaGVja291dE1ldGhvZCgpKSB7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgJHRoaXMtPl9wcmVwYXJlTmV3Q3VzdG9tZXJRdW90ZSgpOw0KICAgICAgICAkdGhpcy0+Z2V0UXVvdGUoKS0+Z2V0Q3VzdG9tZXIoKS0+c2F2ZSgpOw0KICAgICAgICAkdGhpcy0+X2ludm9sdmVOZXdDdXN0b21lcigpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEBwYXJhbSBhcnJheSAkZGF0YQ0KICAgICAqIGRhdGUgPT4gc3RyaW5nW29wdGlvbmFsXQ0KICAgICAqIHRpbWUgPT4gc3RyaW5nW29wdGlvbmFsXQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlRGVsaXZlcnlEYXRlKGFycmF5ICRkYXRhKQ0KICAgIHsNCiAgICAgICAgJHF1b3RlID0gJHRoaXMtPmdldFF1b3RlKCk7DQogICAgICAgICRxdW90ZS0+c2V0RmlyZWNoZWNrb3V0RGVsaXZlcnlEYXRlKG51bGwpOw0KICAgICAgICAkcXVvdGUtPnNldEZpcmVjaGVja291dERlbGl2ZXJ5VGltZXJhbmdlKG51bGwpOw0KDQogICAgICAgICRzaGlwcGluZ01ldGhvZCA9ICR0aGlzLT5nZXRRdW90ZSgpLT5nZXRTaGlwcGluZ0FkZHJlc3MoKS0+Z2V0U2hpcHBpbmdNZXRob2QoKTsNCiAgICAgICAgLyoqDQogICAgICAgICAqIEB2YXIgVE1fRmlyZUNoZWNrb3V0X0hlbHBlcl9EZWxpdmVyeWRhdGUNCiAgICAgICAgICovDQogICAgICAgICRoZWxwZXIgPSBNYWdlOjpoZWxwZXIoJ2ZpcmVjaGVja291dC9kZWxpdmVyeWRhdGUnKTsNCiAgICAgICAgaWYgKCEkaGVscGVyLT5jYW5Vc2VEZWxpdmVyeURhdGUoJHNoaXBwaW5nTWV0aG9kKSkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGRhdGUgZm9yIHdlZWtlbmQgYW5kIGV4Y2x1ZGVkIGRheXMNCiAgICAgICAgaWYgKCFlbXB0eSgkZGF0YVsnZGF0ZSddKSkgew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAkZGF0ZSA9IG5ldyBaZW5kX0RhdGUoJGRhdGFbJ2RhdGUnXSwgTWFnZTo6YXBwKCktPmdldExvY2FsZSgpLT5nZXREYXRlRm9ybWF0KCkpOw0KICAgICAgICAgICAgfSBjYXRjaCAoWmVuZF9EYXRlX0V4Y2VwdGlvbiAkZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+IE1hZ2U6OmhlbHBlcignZmlyZWNoZWNrb3V0JyktPl9fKCdDYW5ub3QgcGFyc2UgZGVsaXZlcnkgZGF0ZS4gRm9sbG93aW5nIGZvcm1hdCBleHBlY3RlZDogJXMnLCBNYWdlOjphcHAoKS0+Z2V0TG9jYWxlKCktPmdldERhdGVGb3JtYXQoKSkNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoISRoZWxwZXItPmlzVmFsaWREYXRlKCRkYXRlKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+IE1hZ2U6OmhlbHBlcignZmlyZWNoZWNrb3V0JyktPl9fKCdXZSBjYW5ub3QgZGVsaXZlciB0aGUgcGFja2FnZSBhdCB0aGUgc2VsZWN0ZWQgZGF0ZS4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGRhdGUgZm9yIHRoZSBkZWxpdmVyeScpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRxdW90ZS0+c2V0RmlyZWNoZWNrb3V0RGVsaXZlcnlEYXRlKCRkYXRlLT50b1N0cmluZygneXl5eS1NTS1kZCcpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIHZhbGlkYXRlIHRpbWUgZm9yIHZhbGlkIHJhbmdlDQogICAgICAgIGlmICghZW1wdHkoJGRhdGFbJ3RpbWUnXSkpIHsNCiAgICAgICAgICAgIGlmICghJGhlbHBlci0+aXNWYWxpZFRpbWVSYW5nZSgkZGF0YVsndGltZSddKSkgew0KICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgNCiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnID0+IE1hZ2U6OmhlbHBlcignZmlyZWNoZWNrb3V0JyktPl9fKCdXZSBjYW5ub3QgZGVsaXZlciB0aGUgcGFja2FnZSBhdCB0aGUgc2VsZWN0ZWQgdGltZS4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIHRpbWUgZm9yIHRoZSBkZWxpdmVyeScpDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRxdW90ZS0+c2V0RmlyZWNoZWNrb3V0RGVsaXZlcnlUaW1lcmFuZ2UoJGRhdGFbJ3RpbWUnXSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2UoKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0aGlzLT5fY3VzdG9tZXJFbWFpbEV4aXN0c01lc3NhZ2U7DQogICAgfQ0KfQ==
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement