pwa-amp-sw.js ยท UTF-8
Save encrypted
Delete
Paste the console unlock script to edit this file.
Y29uc3QgQ0FDSEVfVkVSU0lPTiA9ICcxLjcuODcnOw0KDQpjb25zdCBCQVNFX0NBQ0hFX0ZJTEVTID0gWw0KICAgICdodHRwczovL3ByZW1tZWRpY2FsLmluL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIyLzA4L1BNUE5HLnBuZycsCicnLAonaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wOC9QTV8xLXBuZy5wbmcnLAonJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8xMTM2eDY0MC5wbmcnLAonaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi93cC1jb250ZW50L3VwbG9hZHMvcHdhLXNwbGFzaC1zY3JlZW4vc3BsYXNoc2NyZWVucy9pY29uXzY0MHgxMTM2LnBuZycsCidodHRwczovL3ByZW1tZWRpY2FsLmluL3dwLWNvbnRlbnQvdXBsb2Fkcy9wd2Etc3BsYXNoLXNjcmVlbi9zcGxhc2hzY3JlZW5zL2ljb25fMjY4OHgxMjQyLnBuZycsCidodHRwczovL3ByZW1tZWRpY2FsLmluL3dwLWNvbnRlbnQvdXBsb2Fkcy9wd2Etc3BsYXNoLXNjcmVlbi9zcGxhc2hzY3JlZW5zL2ljb25fMTc5Mng4MjgucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8xMTI1eDI0MzYucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl84Mjh4MTc5Mi5wbmcnLAonaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi93cC1jb250ZW50L3VwbG9hZHMvcHdhLXNwbGFzaC1zY3JlZW4vc3BsYXNoc2NyZWVucy9pY29uXzI0MzZ4MTEyNS5wbmcnLAonaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi93cC1jb250ZW50L3VwbG9hZHMvcHdhLXNwbGFzaC1zY3JlZW4vc3BsYXNoc2NyZWVucy9pY29uXzEyNDJ4MjIwOC5wbmcnLAonaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi93cC1jb250ZW50L3VwbG9hZHMvcHdhLXNwbGFzaC1zY3JlZW4vc3BsYXNoc2NyZWVucy9pY29uXzIyMDh4MTI0Mi5wbmcnLAonaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi93cC1jb250ZW50L3VwbG9hZHMvcHdhLXNwbGFzaC1zY3JlZW4vc3BsYXNoc2NyZWVucy9pY29uXzEzMzR4NzUwLnBuZycsCidodHRwczovL3ByZW1tZWRpY2FsLmluL3dwLWNvbnRlbnQvdXBsb2Fkcy9wd2Etc3BsYXNoLXNjcmVlbi9zcGxhc2hzY3JlZW5zL2ljb25fNzUweDEzMzQucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8yNzMyeDIwNDgucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8yMDQ4eDI3MzIucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8yMzg4eDE2NjgucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8xNjY4eDIzODgucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8yMjI0eDE2NjgucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8xMjQyeDI2ODgucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8xNjY4eDIyMjQucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8xNTM2eDIwNDgucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzL3B3YS1zcGxhc2gtc2NyZWVuL3NwbGFzaHNjcmVlbnMvaWNvbl8yMDQ4eDE1MzYucG5nJywKJ2h0dHBzOi8vcHJlbW1lZGljYWwuaW4vd3AtY29udGVudC91cGxvYWRzLzIwMjIvMDgvUE1fMS1wbmcucG5nJywKDQpdOw0KDQpjb25zdCBPRkZMSU5FX0NBQ0hFX0ZJTEVTID0gWw0KICAgICAnaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi8/YW1wPTEnLA0KXTsNCg0KY29uc3QgTk9UX0ZPVU5EX0NBQ0hFX0ZJTEVTID0gWw0KICAgICdodHRwczovL3ByZW1tZWRpY2FsLmluLz9hbXA9MScsDQpdOw0KDQpjb25zdCBPRkZMSU5FX1BBR0UgPSAnaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi8/YW1wPTEnOw0KY29uc3QgTk9UX0ZPVU5EX1BBR0UgPSAnaHR0cHM6Ly9wcmVtbWVkaWNhbC5pbi8/YW1wPTEnOw0KDQpjb25zdCBDQUNIRV9WRVJTSU9OUyA9IHsNCiAgICBjb250ZW50OiAnY29udGVudC12JyArIENBQ0hFX1ZFUlNJT04sDQogICAgbm90Rm91bmQ6ICc0MDQtdicgKyBDQUNIRV9WRVJTSU9OLA0KICAgIG9mZmxpbmU6ICdvZmZsaW5lLXYnICsgQ0FDSEVfVkVSU0lPTiwNCn07DQoNCi8vIERlZmluZSBNQVhfVFRMJ3MgaW4gU0VDT05EUyBmb3Igc3BlY2lmaWMgZmlsZSBleHRlbnNpb25zDQpjb25zdCBNQVhfVFRMID0gew0KICAgICcvJzogMzYwMCwNCiAgICBodG1sOiAzNjAwLA0KICAgIGpzb246IDg2NDAwLA0KICAgIGpzOiA4NjQwMCwNCiAgICBjc3M6IDg2NDAwLA0KICAgIHBuZzogODY0MDAsDQogICAganBnOiA4NjQwMCwNCn07DQoNCmNvbnN0IENBQ0hFX1NUUkFURUdZID0gew0KICAgIGRlZmF1bHQ6ICduZXR3b3JrRmlyc3QnLA0KICAgIGNzc19qczogJ2NhY2hlRmlyc3QnLA0KICAgIGltYWdlczogJ2NhY2hlRmlyc3QnLA0KICAgIGZvbnRzOiAnY2FjaGVGaXJzdCcsDQp9Ow0KDQpjb25zdCBDQUNIRV9CTEFDS0xJU1QgPSAgWw0KLy8gICAgKHN0cikgPT4gew0KLy8gICAgICAgIHJldHVybiAhc3RyLmluY2x1ZGVzKCcvd3AtYWRtaW4vJykgfHwgIXN0ci5zdGFydHNXaXRoKCdodHRwczovL3ByZW1tZWRpY2FsLmluLy93cC1hZG1pbi8nKTsNCi8vICAgIH0sDQpdOw0KY29uc3QgbmV2ZXJDYWNoZVVybHMgPSBbL1wvd3AtYWRtaW4vLC9cL3dwLWxvZ2luLywvcHJldmlldz10cnVlLywvXC9jYXJ0LywvYWpheC8sL2xvZ2luLyxdOw0KDQpjb25zdCBQV0FfVklTSUJJTElUWV9CWVBBU1NfUEFUSFMgPSBbXTsNCg0KLyoqDQogKiBTYW1lIHBhdGggcnVsZXMgYXMgZnJvbnRlbmQgdmlzaWJpbGl0eV9leGNsdWRlczogZXhhY3QgcGF0aCBvciBzdWJwYXRocy4NCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRobmFtZSByZXF1ZXN0IFVSTCBwYXRobmFtZQ0KICogQHJldHVybnMge2Jvb2xlYW59DQogKi8NCmZ1bmN0aW9uIHB3YUZvcldwVmlzaWJpbGl0eUJ5cGFzc1BhdGgocGF0aG5hbWUpIHsNCiAgICBpZiAoIVBXQV9WSVNJQklMSVRZX0JZUEFTU19QQVRIUy5sZW5ndGgpIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgICB2YXIgbm9ybSA9IHBhdGhuYW1lLnJlcGxhY2UoL1wvKyQvLCAnJyk7DQogICAgaWYgKG5vcm0gPT09ICcnKSB7DQogICAgICAgIG5vcm0gPSAnLyc7DQogICAgfQ0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUFdBX1ZJU0lCSUxJVFlfQllQQVNTX1BBVEhTLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBwcmVmaXggPSBTdHJpbmcoUFdBX1ZJU0lCSUxJVFlfQllQQVNTX1BBVEhTW2ldKS5yZXBsYWNlKC9cLyskLywgJycpOw0KICAgICAgICBpZiAobm9ybSA9PT0gcHJlZml4IHx8IG5vcm0uaW5kZXhPZihwcmVmaXggKyAnLycpID09PSAwKSB7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQp9DQoNCmNvbnN0IFNVUFBPUlRFRF9NRVRIT0RTID0gWw0KICAgICdHRVQnLA0KXTsNCi8vIENoZWNrIGlmIGN1cnJlbnQgdXJsIGlzIGluIHRoZSBuZXZlckNhY2hlVXJscyBsaXN0DQpmdW5jdGlvbiBwd2FGb3JXcGNoZWNrTmV2ZXJDYWNoZUxpc3QodXJsKSB7DQogICAgaWYgKCB0aGlzLm1hdGNoKHVybCkgKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgcmV0dXJuIHRydWU7DQp9DQovKioNCiAqIHB3YUZvcldwaXNCbGFja0xpc3RlZA0KICogQHBhcmFtIHtzdHJpbmd9IHVybA0KICogQHJldHVybnMge2Jvb2xlYW59DQogKi8NCmZ1bmN0aW9uIHB3YUZvcldwaXNCbGFja0xpc3RlZCh1cmwpIHsNCiAgICByZXR1cm4gKENBQ0hFX0JMQUNLTElTVC5sZW5ndGggPiAwKSA/ICFDQUNIRV9CTEFDS0xJU1QuZmlsdGVyKChydWxlKSA9PiB7DQogICAgICAgIGlmKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICByZXR1cm4gIXJ1bGUodXJsKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0pLmxlbmd0aCA6IGZhbHNlDQp9DQoNCi8qKg0KICogcHdhRm9yV3BnZXRGaWxlRXh0ZW5zaW9uDQogKiBAcGFyYW0ge3N0cmluZ30gdXJsDQogKiBAcmV0dXJucyB7c3RyaW5nfQ0KICovDQpmdW5jdGlvbiBwd2FGb3JXcGdldEZpbGVFeHRlbnNpb24odXJsKSB7DQogICAgDQogICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7DQogICAgIA0KICAgICAgICBsZXQgc3BsaXRfdHdvID0gdXJsLnNwbGl0KCc/Jyk7DQogICAgICAgIGxldCBzcGxpdF91cmwgPSBzcGxpdF90d29bMF07DQoNCiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IHNwbGl0X3VybC5zcGxpdCgnLicpLnJldmVyc2UoKVswXS5zcGxpdCgnPycpWzBdOwkJDQogICAgICAgIHJldHVybiAoZXh0ZW5zaW9uLmVuZHNXaXRoKCcvJykpID8gJy8nIDogZXh0ZW5zaW9uOw0KICAgICAgICANCiAgICB9ZWxzZXsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfSAgICAgICAgICAgIA0KfQ0KLyoqDQogKiBwd2FGb3JXcGdldFRUTA0KICogQHBhcmFtIHtzdHJpbmd9IHVybA0KICovDQpmdW5jdGlvbiBwd2FGb3JXcGdldFRUTCh1cmwpIHsNCiAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHsNCiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IHB3YUZvcldwZ2V0RmlsZUV4dGVuc2lvbih1cmwpOw0KICAgICAgICBpZiAodHlwZW9mIE1BWF9UVExbZXh0ZW5zaW9uXSA9PT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgIHJldHVybiBNQVhfVFRMW2V4dGVuc2lvbl07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1cm4gTUFYX1RUTFsiLyJdOw0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIE1BWF9UVExbIi8iXTsNCiAgICB9DQp9DQoNCi8qKg0KICogcHdhRm9yV3BpbnN0YWxsU2VydmljZVdvcmtlcg0KICogQHJldHVybnMge1Byb21pc2V9DQogKi8NCmZ1bmN0aW9uIHB3YUZvcldwaW5zdGFsbFNlcnZpY2VXb3JrZXIoKSB7DQogICAgcmV0dXJuIFByb21pc2UuYWxsKA0KICAgICAgICBbDQogICAgICAgICAgICBjYWNoZXMub3BlbihDQUNIRV9WRVJTSU9OUy5jb250ZW50KQ0KICAgICAgICAgICAgICAgIC50aGVuKA0KICAgICAgICAgICAgICAgICAgICAoY2FjaGUpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkFTRV9DQUNIRV9GSUxFUy5sZW5ndGggPjApew0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBCQVNFX0NBQ0hFX0ZJTEVTLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3YUZvcldwcHJlY2FjaGVVcmwoQkFTRV9DQUNIRV9GSUxFU1tpXSkgDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gY2FjaGUuYWRkQWxsKEJBU0VfQ0FDSEVfRklMRVMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGNhY2hlcy5vcGVuKENBQ0hFX1ZFUlNJT05TLm9mZmxpbmUpDQogICAgICAgICAgICAgICAgLnRoZW4oDQogICAgICAgICAgICAgICAgICAgIChjYWNoZSkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmFkZEFsbChPRkZMSU5FX0NBQ0hFX0ZJTEVTKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICBjYWNoZXMub3BlbihDQUNIRV9WRVJTSU9OUy5ub3RGb3VuZCkNCiAgICAgICAgICAgICAgICAudGhlbigNCiAgICAgICAgICAgICAgICAgICAgKGNhY2hlKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuYWRkQWxsKE5PVF9GT1VORF9DQUNIRV9GSUxFUyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICApDQogICAgICAgIF0NCiAgICApDQogICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNraXBXYWl0aW5nKCk7DQogICAgICAgIH0pOw0KfQ0KDQovKioNCiAqIHB3YUZvcldwY2xlYW51cExlZ2FjeUNhY2hlDQogKiBAcmV0dXJucyB7UHJvbWlzZX0NCiAqLw0KZnVuY3Rpb24gcHdhRm9yV3BjbGVhbnVwTGVnYWN5Q2FjaGUoKSB7DQoNCiAgICBsZXQgY3VycmVudENhY2hlcyA9IE9iamVjdC5rZXlzKENBQ0hFX1ZFUlNJT05TKQ0KICAgICAgICAubWFwKA0KICAgICAgICAgICAgKGtleSkgPT4gew0KICAgICAgICAgICAgICAgIHJldHVybiBDQUNIRV9WRVJTSU9OU1trZXldOw0KICAgICAgICAgICAgfQ0KICAgICAgICApOw0KDQogICAgcmV0dXJuIG5ldyBQcm9taXNlKA0KICAgICAgICAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQoNCiAgICAgICAgICAgIGNhY2hlcy5rZXlzKCkNCiAgICAgICAgICAgICAgICAudGhlbigNCiAgICAgICAgICAgICAgICAgICAgKGtleXMpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWdhY3lLZXlzID0ga2V5cy5maWx0ZXIoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIX5jdXJyZW50Q2FjaGVzLmluZGV4T2Yoa2V5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIC50aGVuKA0KICAgICAgICAgICAgICAgICAgICAobGVnYWN5KSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVnYWN5Lmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kubWFwKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlZ2FjeUtleSkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZXMuZGVsZXRlKGxlZ2FjeUtleSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycikgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgLmNhdGNoKA0KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICk7DQoNCiAgICAgICAgfQ0KICAgICk7DQp9DQoNCmZ1bmN0aW9uIHB3YUZvcldwcHJlY2FjaGVVcmwodXJsKSB7DQoNCiAgICBpZighcHdhRm9yV3Bpc0JsYWNrTGlzdGVkKHVybCkpIHsNCiAgICAgICAgY2FjaGVzLm9wZW4oQ0FDSEVfVkVSU0lPTlMuY29udGVudCkNCiAgICAgICAgICAgIC50aGVuKChjYWNoZSkgPT4gew0KICAgICAgICAgICAgICAgIGNhY2hlLm1hdGNoKHVybCkNCiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZighcmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2godXJsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGluIGNhY2hlLCBub3RoaW5nIHRvIGRvLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UpIHsJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaCh1cmwpLnRoZW4oZGF0YVdyYXBwZWRCeVByb21pc2UgPT4gZGF0YVdyYXBwZWRCeVByb21pc2UudGV4dCgpKQkJCQkJCQkJCQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHsNCgkJCQkJCQkgaWYoZGF0YSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gLzxhbXAtaW1nW14+XStzcmM9IihodHRwczpcL1wvW14iPl0rKSIvZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobSA9IHJlZ2V4LmV4ZWMoZGF0YSkpICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS5pbmRleCA9PT0gcmVnZXgubGFzdEluZGV4KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4Lmxhc3RJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5mb3JFYWNoKChtYXRjaCwgZ3JvdXBJbmRleCkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihncm91cEluZGV4ID09IDEpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV3IFVSTChtYXRjaCkub3JpZ2luID09IGxvY2F0aW9uLm9yaWdpbil7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2gobWF0Y2gpLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbigoaW1hZ2VkYXRhKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coaW1hZ2VkYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucHV0KG1hdGNoLCBpbWFnZWRhdGEuY2xvbmUoKSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCgkJCQkJfSk7DQoJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLnB1dCh1cmwsIHJlc3BvbnNlLmNsb25lKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KQ0KICAgIH0NCn0NCg0KdmFyIGZldGNoUmVuZ2VEYXRhID0gZnVuY3Rpb24oZXZlbnQpew0KICAgIHZhciBwb3MgPSBOdW1iZXIoL15ieXRlc1w9KFxkKylcLSQvZy5leGVjKGV2ZW50LnJlcXVlc3QuaGVhZGVycy5nZXQoJ3JhbmdlJykpWzFdKTsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSYW5nZSByZXF1ZXN0IGZvcicsIGV2ZW50LnJlcXVlc3QudXJsLCAnLCBzdGFydGluZyBwb3NpdGlvbjonLCBwb3MpOw0KICAgICAgICAgICAgZXZlbnQucmVzcG9uZFdpdGgoDQogICAgICAgICAgICAgIGNhY2hlcy5vcGVuKENBQ0hFX1ZFUlNJT05TLmNvbnRlbnQpDQogICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGNhY2hlKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLm1hdGNoKGV2ZW50LnJlcXVlc3QudXJsKTsNCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihyZXMpIHsNCiAgICAgICAgICAgICAgICBpZiAoIXJlcykgew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKGV2ZW50LnJlcXVlc3QpDQogICAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4gew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmFycmF5QnVmZmVyKCk7DQogICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5hcnJheUJ1ZmZlcigpOw0KICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGFiKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgNCiAgICAgICAgICAgICAgICAgIGFiLnNsaWNlKHBvcyksDQogICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHN0YXR1czogMjA2LA0KICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiAnUGFydGlhbCBDb250ZW50JywNCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogWw0KICAgICAgICAgICAgICAgICAgICAgIC8vIFsnQ29udGVudC1UeXBlJywgJ3ZpZGVvL3dlYm0nXSwNCiAgICAgICAgICAgICAgICAgICAgICBbJ0NvbnRlbnQtUmFuZ2UnLCAnYnl0ZXMgJyArIHBvcyArICctJyArDQogICAgICAgICAgICAgICAgICAgICAgICAoYWIuYnl0ZUxlbmd0aCAtIDEpICsgJy8nICsgYWIuYnl0ZUxlbmd0aF1dDQogICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgfSkpOw0KfQ0KDQpsZXQgY2FjaGluZ1N0cmF0ZWd5ID0gew0KICAgICAgICBub3RHZXRNZXRob2RzOiBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICAvLyBJZiBub24tR0VUIHJlcXVlc3QsIHRyeSB0aGUgbmV0d29yayBmaXJzdCwgZmFsbCBiYWNrIHRvIHRoZSBvZmZsaW5lIHBhZ2UNCiAgICAgICAgICAgIGlmIChldmVudC5yZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcpIHsNCiAgICAgICAgICAgICAgICBldmVudC5yZXNwb25kV2l0aCgNCiAgICAgICAgICAgICAgICAgICAgZmV0Y2goZXZlbnQucmVxdWVzdCkNCiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlcy5tYXRjaChvZmZsaW5lUGFnZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KDQogICAgICAgIGZldGNoRnJvbUNhY2hlOiBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgIC8qIHJldHVybiBuZXcgUHJvbWlzZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzb2x2ZSkgPT4geyovDQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlcy5vcGVuKENBQ0hFX1ZFUlNJT05TLmNvbnRlbnQpDQogICAgICAgICAgICAgICAgICAgIC50aGVuKA0KICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlKSA9PiB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUubWF0Y2goZXZlbnQucmVxdWVzdCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycy5lbnRyaWVzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbnVsbDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwYWlyIG9mIGhlYWRlcnMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyWzBdID09PSAnZGF0ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUocGFpclsxXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFnZSA9IHBhcnNlSW50KChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZSgpKS8xMDAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0dGwgPSBwd2FGb3JXcGdldFRUTChldmVudC5yZXF1ZXN0LnVybCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZ2UgPiB0dGwpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc29sdmUpID0+IHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKGV2ZW50LnJlcXVlc3QuY2xvbmUoKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZWRSZXNwb25zZSkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRSZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnB1dChldmVudC5yZXF1ZXN0LCB1cGRhdGVkUmVzcG9uc2UuY2xvbmUoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1cGRhdGVkUmVzcG9uc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChldmVudC5yZXF1ZXN0LmNsb25lKCksIHtjYWNoZTogIm5vLXN0b3JlIn0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2UpID0+IHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXMgPCAzMDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh+U1VQUE9SVEVEX01FVEhPRFMuaW5kZXhPZihldmVudC5yZXF1ZXN0Lm1ldGhvZCkgJiYgIXB3YUZvcldwaXNCbGFja0xpc3RlZChldmVudC5yZXF1ZXN0LnVybCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXQoZXZlbnQucmVxdWVzdCwgcmVzcG9uc2UuY2xvbmUoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlcy5vcGVuKENBQ0hFX1ZFUlNJT05TLm5vdEZvdW5kKS50aGVuKChjYWNoZSkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5tYXRjaChOT1RfRk9VTkRfUEFHRSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hpbmdTdHJhdGVneS5PZmZsaW5lcGFnZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoaW5nU3RyYXRlZ3kuT2ZmbGluZXBhZ2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCcgIEVycm9yIGluIGZldGNoIGhhbmRsZXI6JywgZXJyb3IpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoaW5nU3RyYXRlZ3kuT2ZmbGluZXBhZ2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgLyp9KSovDQoNCiAgICAgICAgfSwNCiAgICAgICAgZmV0Y2huZXR3b3JrOiBmdW5jdGlvbihldmVudCl7DQogICAgICAgICAgICByZXR1cm4gY2FjaGVzLm9wZW4oQ0FDSEVfVkVSU0lPTlMuY29udGVudCkNCiAgICAgICAgICAgICAgICAgICAgLnRoZW4oDQogICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGUpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChldmVudC5yZXF1ZXN0LmNsb25lKCkpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoflNVUFBPUlRFRF9NRVRIT0RTLmluZGV4T2YoZXZlbnQucmVxdWVzdC5tZXRob2QpICYmICFwd2FGb3JXcGlzQmxhY2tMaXN0ZWQoZXZlbnQucmVxdWVzdC51cmwpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucHV0KGV2ZW50LnJlcXVlc3QsIHJlc3BvbnNlLmNsb25lKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocmVzcG9uc2Uuc3RhdHVzPT00MDQpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hpbmdTdHJhdGVneS5Ob3Rmb3VuZHBhZ2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUubWF0Y2goZXZlbnQucmVxdWVzdCkudGhlbihmdW5jdGlvbiAoY2FjaGVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkIHx8IGNhY2hpbmdTdHJhdGVneS5PZmZsaW5lcGFnZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLm1hdGNoKGV2ZW50LnJlcXVlc3QpLnRoZW4oZnVuY3Rpb24gKGNhY2hlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkIHx8IGNhY2hpbmdTdHJhdGVneS5PZmZsaW5lcGFnZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgKS5jYXRjaCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hpbmdTdHJhdGVneS5PZmZsaW5lcGFnZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgIH0sDQogICAgICAgIGFkZENhY2hlOiBmdW5jdGlvbihldmVudCx1cGRhdGVkUmVzcG9uc2Upew0KICAgICAgICAgICAgY2FjaGUucHV0KGV2ZW50LnJlcXVlc3QsIHVwZGF0ZWRSZXNwb25zZS5jbG9uZSgpKTsNCiAgICAgICAgICAgICByZXNvbHZlKHVwZGF0ZWRSZXNwb25zZSk7DQogICAgICAgIH0sDQogICAgICAgIE9mZmxpbmVwYWdlOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgdmFyIGZhbGxiYWNrSHRtbCA9ICc8aHRtbD48aGVhZD48dGl0bGU+T2ZmbGluZTwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT5Zb3UgYXJlIG9mZmxpbmU8L2gxPjxwPlBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24uPC9wPjwvYm9keT48L2h0bWw+JzsNCiAgICAgICAgICAgIHZhciBmYWxsYmFjayA9IG5ldyBSZXNwb25zZShmYWxsYmFja0h0bWwsIHsNCiAgICAgICAgICAgICAgICBzdGF0dXM6IDUwMywNCiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiAnU2VydmljZSBVbmF2YWlsYWJsZScsDQogICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoew0KICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gY2FjaGVzLm9wZW4oQ0FDSEVfVkVSU0lPTlMub2ZmbGluZSkudGhlbihmdW5jdGlvbiAoY2FjaGUpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUubWF0Y2goT0ZGTElORV9QQUdFKS50aGVuKGZ1bmN0aW9uIChyKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByIHx8IGNhY2hlLm1hdGNoKE9GRkxJTkVfUEFHRSwgeyBpZ25vcmVTZWFyY2g6IHRydWUgfSk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZSB8fCBmYWxsYmFjazsNCiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSwNCiAgICAgICAgTm90Zm91bmRwYWdlOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlcy5vcGVuKENBQ0hFX1ZFUlNJT05TLm5vdEZvdW5kKS50aGVuKChjYWNoZSkgPT4gew0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5tYXRjaChOT1RfRk9VTkRfUEFHRSk7DQogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJzxodG1sPjxoZWFkPjx0aXRsZT5QYWdlIE5vdCBGb3VuZDwvdGl0bGU+PC9oZWFkPjxib2R5PjxoMT40MDQgLSBQYWdlIE5vdCBGb3VuZDwvaDE+PC9ib2R5PjwvaHRtbD4nLCB7DQogICAgICAgICAgICAgICAgICAgIHN0YXR1czogNDA0LA0KICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiAnTm90IEZvdW5kJywNCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoew0KICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSwNCiAgICAgICAgLypTdHJhdGVnaWVzKi8NCiAgICAgICAgbmV0d29ya09ubHlTdHJhdGVneTogZnVuY3Rpb24oZXZlbnQpew0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlcy5vcGVuKENBQ0hFX1ZFUlNJT05TLmNvbnRlbnQpDQogICAgICAgICAgICAgICAgICAgIC50aGVuKA0KICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2goZXZlbnQucmVxdWVzdC5jbG9uZSgpKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXMgPCAzMDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh+U1VQUE9SVEVEX01FVEhPRFMuaW5kZXhPZihldmVudC5yZXF1ZXN0Lm1ldGhvZCkgJiYgIXB3YUZvcldwaXNCbGFja0xpc3RlZChldmVudC5yZXF1ZXN0LnVybCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXQoZXZlbnQucmVxdWVzdCwgcmVzcG9uc2UuY2xvbmUoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlc3BvbnNlLnN0YXR1cz09NDA0KXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoaW5nU3RyYXRlZ3kuTm90Zm91bmRwYWdlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLm1hdGNoKGV2ZW50LnJlcXVlc3QpLnRoZW4oZnVuY3Rpb24gKGNhY2hlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZCB8fCBjYWNoaW5nU3RyYXRlZ3kuT2ZmbGluZXBhZ2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycikgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoaW5nU3RyYXRlZ3kuT2ZmbGluZXBhZ2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgKS5jYXRjaCgNCiAgICAgICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoaW5nU3RyYXRlZ3kuT2ZmbGluZXBhZ2UoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICB9LA0KICAgICAgICBjYWNoZUZpcnN0U3RyYXRlZ3k6IGZ1bmN0aW9uKGV2ZW50cyl7DQogICAgICAgICAgICByZXR1cm4gY2FjaGluZ1N0cmF0ZWd5LmZldGNoRnJvbUNhY2hlKGV2ZW50cykuY2F0Y2goDQogICAgICAgICAgICAgICAgICAgICAgICAoZXJyKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGluZ1N0cmF0ZWd5Lk9mZmxpbmVwYWdlKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgfSwNCiAgICAgICAgTmV3b3JrRmlyc3RTdHJhdGVneTogZnVuY3Rpb24oZXZlbnRzKXsNCiAgICAgICAgICAgIHJldHVybiBjYWNoaW5nU3RyYXRlZ3kuZmV0Y2huZXR3b3JrKGV2ZW50cykuY2F0Y2goDQogICAgICAgICAgICAgICAgICAgICAgICAoZXJyKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hpbmdTdHJhdGVneS5mZXRjaEZyb21DYWNoZShldmVudHMpDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICkuY2F0Y2goDQogICAgICAgICAgICAgICAgICAgICAgICAoZXJyKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGluZ1N0cmF0ZWd5Lk9mZmxpbmVwYWdlKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQoNCn0NCg0KLyoqDQogKiBHdWFyYW50ZWVzIGV2ZW50LnJlc3BvbmRXaXRoKCkgYWx3YXlzIHJlY2VpdmVzIGEgUHJvbWlzZTxSZXNwb25zZT4uDQogKiBGaXhlcyBuZXR3b3JrRmlyc3Qgd2hlbiBhIGJyYW5jaCByZXNvbHZlcyB3aXRoIHVuZGVmaW5lZCAoZS5nLiBtaXNzaW5nIDQwNC9vZmZsaW5lIGNhY2hlKS4NCiAqLw0KZnVuY3Rpb24gcHdhRm9yV3BFbnN1cmVSZXNwb25zZShwcm9taXNlKSB7DQogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsNCiAgICAgICAgaWYgKHJlcyAmJiByZXMgaW5zdGFuY2VvZiBSZXNwb25zZSkgew0KICAgICAgICAgICAgcmV0dXJuIHJlczsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gY2FjaGluZ1N0cmF0ZWd5Lk9mZmxpbmVwYWdlKCk7DQogICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gY2FjaGluZ1N0cmF0ZWd5Lk9mZmxpbmVwYWdlKCk7DQogICAgfSk7DQp9DQoNCg0Kc2VsZi5hZGRFdmVudExpc3RlbmVyKA0KICAgICdpbnN0YWxsJywgZXZlbnQgPT4gew0KICAgICAgICBldmVudC53YWl0VW50aWwoDQogICAgICAgICAgICBQcm9taXNlLmFsbChbDQogICAgICAgICAgICAgICAgcHdhRm9yV3BpbnN0YWxsU2VydmljZVdvcmtlcigpLA0KICAgICAgICAgICAgICAgIHNlbGYuc2tpcFdhaXRpbmcoKSwNCiAgICAgICAgICAgIF0pDQogICAgICAgICk7DQogICAgfQ0KKTsNCg0KLy8gVGhlIGFjdGl2YXRlIGhhbmRsZXIgdGFrZXMgY2FyZSBvZiBjbGVhbmluZyB1cCBvbGQgY2FjaGVzLg0Kc2VsZi5hZGRFdmVudExpc3RlbmVyKA0KICAgICdhY3RpdmF0ZScsIGV2ZW50ID0+IHsNCiAgICAgICAgZXZlbnQud2FpdFVudGlsKA0KICAgICAgICAgICAgUHJvbWlzZS5hbGwoDQogICAgICAgICAgICAgICAgWw0KICAgICAgICAgICAgICAgICAgICBwd2FGb3JXcGNsZWFudXBMZWdhY3lDYWNoZSgpLA0KICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHMuY2xhaW0oKSwNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwV2FpdGluZygpLA0KICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAuY2F0Y2goDQogICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcFdhaXRpbmcoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgKTsNCiAgICB9DQopOw0Kc2VsZi5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCBldmVudCA9PiB7DQogICAgaWYgKG5hdmlnYXRvci5vbkxpbmUgJiYgbmF2aWdhdG9yLnN0YW5kYWxvbmUgPT09IHRydWUpIHsNCiAgICAgICAgaXNSZWFjaGFibGUoZXZlbnQucmVxdWVzdC51cmwpLnRoZW4oZnVuY3Rpb24ob25saW5lKSB7DQogICAgICAgICAgaWYgKG9ubGluZSkgew0KICAgICAgICAgICAgLy9oYW5kbGUgb25saW5lIHN0YXR1cw0KICAgICAgICAgICAgY2FjaGVzLmRlbGV0ZShldmVudC5yZXF1ZXN0LnVybCk7DQogICAgICAgICAgICBjb25zb2xlLmxvZygnb25saW5lJyk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdubyBjb25uZWN0aXZpdHknKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0gZWxzZSB7DQogICAgICAgIC8vaGFuZGxlIG9mZmxpbmUgc3RhdHVzDQogICAgICAgIGNvbnNvbGUubG9nKCdvZmZsaW5lJyk7DQogICAgfQ0KfSk7DQoNCmZ1bmN0aW9uIGlzUmVhY2hhYmxlKHVybCkgew0KICAvKioNCiAgICogTm90ZTogZmV0Y2goKSBzdGlsbCAic3VjY2VlZHMiIGZvciA0MDRzIG9uIHN1YmRpcmVjdG9yaWVzLA0KICAgKiB3aGljaCBpcyBvayB3aGVuIG9ubHkgdGVzdGluZyBmb3IgZG9tYWluIHJlYWNoYWJpbGl0eS4NCiAgICovDQogIHJldHVybiBmZXRjaCh1cmwsIHsgbWV0aG9kOiAnSEVBRCcsIG1vZGU6ICduby1jb3JzJyB9KQ0KICAgIC50aGVuKGZ1bmN0aW9uKHJlc3ApIHsNCiAgICAgIHJldHVybiByZXNwICYmIChyZXNwLm9rIHx8IHJlc3AudHlwZSA9PT0gJ29wYXF1ZScpOw0KICAgIH0pDQogICAgLmNhdGNoKGZ1bmN0aW9uKGVycikgew0KICAgICAgY29uc29sZS53YXJuKCdbY29ubiB0ZXN0IGZhaWx1cmVdOicsIGVycik7DQogICAgfSk7DQp9DQoNCnNlbGYuYWRkRXZlbnRMaXN0ZW5lcigNCiAgICAnZmV0Y2gnLCBldmVudCA9PiB7DQogICAgICAgIC8vIFJldHVybiBpZiB0aGUgY3VycmVudCByZXF1ZXN0IHVybCBpcyBpbiB0aGUgbmV2ZXIgY2FjaGUgbGlzdA0KICAgICAgICBpZiAoICEgbmV2ZXJDYWNoZVVybHMuZXZlcnkocHdhRm9yV3BjaGVja05ldmVyQ2FjaGVMaXN0LCBldmVudC5yZXF1ZXN0LnVybCkgKSB7DQogICAgICAgICAgIC8vY29uc29sZS5sb2coICdQV0EgU2VydmljZVdvcmtlcjogVVJMIGV4aXN0cyBpbiBleGNsdWRlZCBsaXN0IG9mIGNhY2hlLicgKyBldmVudC5yZXF1ZXN0LnVybCk7DQogICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmKCEgbmV2ZXJDYWNoZVVybHMuZXZlcnkocHdhRm9yV3BjaGVja05ldmVyQ2FjaGVMaXN0LCBldmVudC5yZXF1ZXN0LnJlZmVycmVyKSApew0KICAgICAgICAgICAvL2NvbnNvbGUubG9nKCAnUFdBIFNlcnZpY2VXb3JrZXI6IFJlZi1VUkwgZXhpc3RzIGluIGV4Y2x1ZGVkIGxpc3Qgb2YgY2FjaGUuJyArIGV2ZW50LnJlcXVlc3QucmVmZXJyZXIpOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmKHB3YUZvcldwaXNCbGFja0xpc3RlZChldmVudC5yZXF1ZXN0LnVybCkpew0KICAgICAgICAgICAgcmV0dXJuOyAgIA0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChldmVudC5yZXF1ZXN0LnVybCk7DQoNCiAgICAgICAgaWYgKHB3YUZvcldwVmlzaWJpbGl0eUJ5cGFzc1BhdGgodXJsLnBhdGhuYW1lKSkgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgcGF0aF9hcnJheSA9IHVybC5wYXRobmFtZS5zcGxpdCgnLycpDQogICAgICAgIGlmIChldmVudC5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnICYmIHBhdGhfYXJyYXkuaW5jbHVkZXMoJ2FjdGl2aXR5JykpIHsNCiAgICAgICAgICAgIHJldHVybiBldmVudC5yZXNwb25kV2l0aCgoYXN5bmMgKCkgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gYXdhaXQgZXZlbnQucmVxdWVzdC5mb3JtRGF0YSgpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZm9ybURhdGEuZ2V0KCd0aXRsZScpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBmb3JtRGF0YS5nZXQoJ3RleHQnKTsNCiAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gZm9ybURhdGEuZ2V0KCd1cmwnKTsNCiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGZvcm1EYXRhLmdldCgnZXh0ZXJuYWxNZWRpYScpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7DQoNCiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gYXN5bmMgKGV2ZW50KSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7DQoNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuRGF0YWJhc2UoKTsNCiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2F2ZURhdGEoZGIsIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnc2hhcmVkRGF0YScsDQogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBsaW5rLA0KICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IGltYWdlRGF0YQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGF0YSBzYXZlZCB0byBJbmRleGVkREInKTsNCiAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBSZXNwb25zZS5yZWRpcmVjdCgnLz9zaGFyZS10YXJnZXQnLCAzMDMpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QodXJsLnBhdGhuYW1lKycvP3NoYXJlLXRhcmdldCcsIDMwMyk7DQogICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGltYWdlKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QodXJsLnBhdGhuYW1lKycvP3NoYXJlLXRhcmdldCcsIDMwMyk7DQogICAgICAgICAgICAgICAgLy8gcmV0dXJuIFJlc3BvbnNlLnJlZGlyZWN0KCcvP3NoYXJlLXRhcmdldCcsIDMwMyk7DQogICAgICAgICAgICB9KSgpKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gUmV0dXJuIGlmIHJlcXVlc3QgdXJsIHByb3RvY2FsIGlzbid0IGh0dHAgb3IgaHR0cHMNCiAgICAgICAgaWYgKCAhIGV2ZW50LnJlcXVlc3QudXJsLm1hdGNoKC9eKGh0dHB8aHR0cHMpOlwvXC8vaSkgKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICBpZiAoIGV2ZW50LnJlcXVlc3QucmVmZXJyZXIubWF0Y2goL14od3AtYWRtaW4pOlwvXC8vaSkgKQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgaWYgKCBuZXcgVVJMKGV2ZW50LnJlcXVlc3QudXJsKS5vcmlnaW4gIT09IGxvY2F0aW9uLm9yaWdpbiApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KDQogICAgICAgIGlmKGV2ZW50LnJlcXVlc3QubWV0aG9kICE9PSAnR0VUJyApew0KICAgICAgICAgICAgZXZlbnQucmVzcG9uZFdpdGgoDQogICAgICAgICAgICAgICAgZmV0Y2goZXZlbnQucmVxdWVzdCkNCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZXMub3BlbihDQUNIRV9WRVJTSU9OUy5vZmZsaW5lKS50aGVuKGZ1bmN0aW9uKGNhY2hlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLm1hdGNoKE9GRkxJTkVfUEFHRSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyB8fCBuZXcgUmVzcG9uc2UoJycsIHsgc3RhdHVzOiA1MDMsIHN0YXR1c1RleHQ6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICApOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQucmVxdWVzdC5kZXN0aW5hdGlvbjsNCiAgICAgICAgc3dpdGNoIChkZXN0aW5hdGlvbikgew0KICAgICAgICAgICAgY2FzZSAnc3R5bGUnOg0KICAgICAgICAgICAgY2FzZSAnc2NyaXB0JzoNCiAgICAgICAgICAgICAgY2FjaGluZ1N0cmF0ZWd5VHlwZSA9IENBQ0hFX1NUUkFURUdZLmNzc19qczsNCiAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6DQogICAgICAgICAgICAgIGNhY2hpbmdTdHJhdGVneVR5cGUgPSBDQUNIRV9TVFJBVEVHWS5kZWZhdWx0DQogICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnaW1hZ2UnOiANCiAgICAgICAgICAgICAgICBjYWNoaW5nU3RyYXRlZ3lUeXBlID0gQ0FDSEVfU1RSQVRFR1kuaW1hZ2VzOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2ZvbnQnOiANCiAgICAgICAgICAgICAgICBjYWNoaW5nU3RyYXRlZ3lUeXBlID0gQ0FDSEVfU1RSQVRFR1kuZm9udHM7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIC8vIEFsbCBgWE1MSHR0cFJlcXVlc3RgIG9yIGBmZXRjaCgpYCBjYWxscyB3aGVyZQ0KICAgICAgICAgICAgLy8gYFJlcXVlc3QuZGVzdGluYXRpb25gIGlzIHRoZSBlbXB0eSBzdHJpbmcgZGVmYXVsdCB2YWx1ZQ0KICAgICAgICAgICAgZGVmYXVsdDogDQogICAgICAgICAgICAgIGNhY2hpbmdTdHJhdGVneVR5cGUgPSBDQUNIRV9TVFJBVEVHWS5kZWZhdWx0DQogICAgICAgIH0NCiAgICAgICAgdmFyIGNhY2hlID0gbnVsbDsNCiAgICAgICAgc3dpdGNoKGNhY2hpbmdTdHJhdGVneVR5cGUpew0KICAgICAgICAgICAgY2FzZSAibmV0d29ya0ZpcnN0IjoNCiAgICAgICAgICAgICAgIGNhY2hlID0gY2FjaGluZ1N0cmF0ZWd5Lk5ld29ya0ZpcnN0U3RyYXRlZ3koZXZlbnQpDQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIm5ldHdvcmtPbmx5IjoNCiAgICAgICAgICAgICAgIGNhY2hlID0gY2FjaGluZ1N0cmF0ZWd5Lm5ldHdvcmtPbmx5U3RyYXRlZ3koZXZlbnQpDQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIC8vYnJlYWs7DQogICAgICAgICAgICBjYXNlICJjYWNoZUZpcnN0IjoNCiAgICAgICAgICAgIGNhc2UgInN0YWxlV2hpbGVSZXZhbGlkYXRlIjogDQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgY2FjaGUgPSBjYWNoaW5nU3RyYXRlZ3kuY2FjaGVGaXJzdFN0cmF0ZWd5KGV2ZW50KQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgZXZlbnQucmVzcG9uZFdpdGgocHdhRm9yV3BFbnN1cmVSZXNwb25zZShjYWNoZSkpOw0KDQogICAgfQ0KKTsNCg0KZnVuY3Rpb24gb3BlbkRhdGFiYXNlKCkgew0KICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oJ3NoYXJlVGFyZ2V0REInLCAxKTsNCiAgDQogICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4gew0KICAgICAgICBjb25zdCBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7DQogICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdzaGFyZWREYXRhJywgeyBrZXlQYXRoOiAnaWQnIH0pOw0KICAgICAgfTsNCiAgDQogICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChldmVudCkgPT4gew0KICAgICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpOw0KICAgICAgfTsNCiAgDQogICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHsNCiAgICAgICAgcmVqZWN0KGV2ZW50LnRhcmdldC5lcnJvcik7DQogICAgICB9Ow0KICAgIH0pOw0KICB9DQogIA0KICBmdW5jdGlvbiBzYXZlRGF0YShkYiwgZGF0YSkgew0KICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdzaGFyZWREYXRhJywgJ3JlYWR3cml0ZScpOw0KICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnc2hhcmVkRGF0YScpOw0KICANCiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wdXQoZGF0YSk7DQogIA0KICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7DQogICAgICAgIHJlc29sdmUoKTsNCiAgICAgIH07DQogIA0KICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50KSA9PiB7DQogICAgICAgIHJlamVjdChldmVudC50YXJnZXQuZXJyb3IpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgfQ0KDQoNCnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4gew0KDQogICAgaWYoDQogICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSAnb2JqZWN0JyAmJg0KICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YS5hY3Rpb24gPT09ICdzdHJpbmcnDQogICAgKSB7DQogICAgICAgIHN3aXRjaChldmVudC5kYXRhLmFjdGlvbikgew0KICAgICAgICAgICAgY2FzZSAnY2FjaGUnIDogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBwd2FGb3JXcHByZWNhY2hlVXJsKGV2ZW50LmRhdGEudXJsKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZGVmYXVsdCA6DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1Vua25vd24gYWN0aW9uOiAnICsgZXZlbnQuZGF0YS5hY3Rpb24pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KDQp9KTsNCg0KDQo=
Working...