# Name: kuo_file_stats v0.1 # Type: Admin/Public plugin # Collecting data about Textpattern's Files to understand when they are accessed and by whom. # Author: Petri Ikonen # URL: http://kuopassa.net/txp/ # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern CMS - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE0OiJrdW9fZmlsZV9zdGF0cyI7czo2OiJhdXRob3IiO3M6 MTI6IlBldHJpIElrb25lbiI7czoxMDoiYXV0aG9yX3VyaSI7czoyNDoiaHR0cDovL2t1b3Bh c3NhLm5ldC90eHAvIjtzOjc6InZlcnNpb24iO3M6MzoiMC4xIjtzOjExOiJkZXNjcmlwdGlv biI7czo5MToiQ29sbGVjdGluZyBkYXRhIGFib3V0IFRleHRwYXR0ZXJuJ3MgRmlsZXMgdG8g dW5kZXJzdGFuZCB3aGVuIHRoZXkgYXJlIGFjY2Vzc2VkIGFuZCBieSB3aG9tLiI7czo0OiJj b2RlIjtzOjEyMDg5OiINCiMgQkVHSU5TOiBBRE1JTi1TSURFIEZVTkNUSU9OUw0KaWYgKEB0 eHBpbnRlcmZhY2UgPT09ICdhZG1pbicpIHsNCiAgICByZWdpc3Rlcl9jYWxsYmFjaygna3Vv X2ZpbGVfc3RhdHNfdW5pbnN0YWxsJywncGx1Z2luX2xpZmVjeWNsZS5rdW9fZmlsZV9zdGF0 cycsJ2Rpc2FibGVkJyk7DQogICAgcmVnaXN0ZXJfY2FsbGJhY2soJ2t1b19maWxlX3N0YXRz X2RlbGV0ZWQnLCdwbHVnaW5fbGlmZWN5Y2xlLmt1b19maWxlX3N0YXRzJywnZGVsZXRlZCcp Ow0KICAgIHJlZ2lzdGVyX2NhbGxiYWNrKCdrdW9fZmlsZV9zdGF0c19pbnN0YWxsJywncGx1 Z2luX2xpZmVjeWNsZS5rdW9fZmlsZV9zdGF0cycsJ2luc3RhbGxlZCcpOw0KICAgIHJlZ2lz dGVyX2NhbGxiYWNrKCdrdW9fZmlsZV9zdGF0c19pbnN0YWxsJywncGx1Z2luX2xpZmVjeWNs ZS5rdW9fZmlsZV9zdGF0cycsJ2VuYWJsZWQnKTsNCiAgICByZWdpc3Rlcl9jYWxsYmFjaygn a3VvX2ZpbGVfc3RhdHNfaW5mb3JtYXRpb24nLCdmaWxlX3VpJywnZXh0ZW5kX2RldGFpbF9m b3JtJyk7DQoNCiAgICAjIFRISVMgUkVNT1ZFUyBKVVNUIFRIRSBTRVRUSU5HUyBGT1IgVEhJ UyBQTFVHSU4NCiAgICBmdW5jdGlvbiBrdW9fZmlsZV9zdGF0c191bmluc3RhbGwoKSB7DQog ICAgICAgIHNhZmVfcXVlcnkoIkRST1AgVEFCTEUgSUYgRVhJU1RTIGAiLnNhZmVfcGZ4KCdr dW9fZmlsZV9zdGF0cycpLiJgIiwwKTsNCiAgICB9DQoNCiAgICAjIElGIFBMVUdJTiBJUyBT SU1QTFkgREVMRVRFRCBUSEVOIFRISVMgSVMgVFJJR0dFUkVEDQogICAgZnVuY3Rpb24ga3Vv X2ZpbGVfc3RhdHNfZGVsZXRlZCgpIHsNCiAgICAgICAga3VvX2ZpbGVfc3RhdHNfdW5pbnN0 YWxsKCk7DQogICAgfQ0KDQogICAgIyBUSElTIElOIFRVUk4gQ1JFQVRFUyBBIFBMQUNFIFdI RVJFIEZJTEUgRE9XTkxPQUQgREFUQSBJUyBTQVZFRA0KICAgIGZ1bmN0aW9uIGt1b19maWxl X3N0YXRzX2luc3RhbGwoKSB7DQogICAgICAgIHNhZmVfcXVlcnkoIkNSRUFURSBUQUJMRSBJ RiBOT1QgRVhJU1RTICIuc2FmZV9wZngoJ2t1b19maWxlX3N0YXRzJykuIiAoDQogICAgICAg ICAgICBgaWRgIElOVCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsDQogICAgICAgICAg ICBgZmlsZV9pZGAgU01BTExJTlQgVU5TSUdORUQgTk9UIE5VTEwsDQogICAgICAgICAgICBg ZmlsZV9uYW1lYCBWQVJDSEFSKDI1NSkgTk9UIE5VTEwsDQogICAgICAgICAgICBgaXBgIFZB UkNIQVIoNDUpIE5PVCBOVUxMLA0KICAgICAgICAgICAgYHVzZXJuYW1lYCBWQVJDSEFSKDI1 NSkgTlVMTCBERUZBVUxUIE5VTEwgQ09NTUVOVCAnSWYgdXNlciBpcyBsb2dnZWQgaW4nLA0K ICAgICAgICAgICAgYHByaXZzYCBUSU5ZSU5UKDEpIFVOU0lHTkVEIE5VTEwgREVGQVVMVCBO VUxMIENPTU1FTlQgJ0lmIHVzZXIgaXMgbG9nZ2VkIGluJywNCiAgICAgICAgICAgIGB3aGVu YCBUSU1FU1RBTVAgTk9UIE5VTEwgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwNCiAgICAg ICAgICAgIGBtaXNjYCBURVhUIE5PVCBOVUxMIENPTU1FTlQgJ0NvbnRhaW5zIHNlcmlhbGl6 ZWQgZGF0YScsDQogICAgICAgICAgICBQUklNQVJZIEtFWShgaWRgKQ0KICAgICAgICApIiww KTsNCiAgICB9DQogICAgDQogICAgIyBUSElTIElTIFRIRSBGVU5DVElPTiBUSEFUIElTIExB VU5DSEVEIFdIRU4gQURNSU4gSVMgVklFV0lORyBBIFNQRUNJRklDIChTSU5HTEUpIEZJTEUN CiAgICBmdW5jdGlvbiBrdW9fZmlsZV9zdGF0c19pbmZvcm1hdGlvbigpIHsNCiAgICAgICAg aWYgKChpc3NldCgkX0dFVFsnaWQnXSkpICYmICghZW1wdHkoJF9HRVRbJ2lkJ10pKSAmJiAo aXNfbnVtZXJpYygkX0dFVFsnaWQnXSkpICYmIChzYWZlX2NvdW50KCdrdW9fZmlsZV9zdGF0 cycsJ2BmaWxlX2lkYCA9ICInLmRvU2xhc2goJF9HRVRbJ2lkJ10pLiciJywwKSAhPSAwKSkg ew0KICAgICAgICAgICAgDQogICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHMgPSBzYWZlX3Jv d3MoImBpZGAsIGBpcGAsIGB1c2VybmFtZWAsIGBwcml2c2AsIGB3aGVuYCwgYG1pc2NgIiwi a3VvX2ZpbGVfc3RhdHMiLCJgZmlsZV9pZGAgPSAnIi5kb1NsYXNoKCRfR0VUWydpZCddKS4i JyBPUkRFUiBCWSBgaWRgIERFU0MgTElNSVQgMTAiLDApOw0KICAgICAgICAgICAgDQogICAg ICAgICAgICAka3VvX2ZpbGVfc3RhdHNfaHRtbCA9IE5VTEw7DQogICAgICAgICAgICBkZWZp bmUoJ0tVT19GSUxFX1NUQVRTX05CU1AnLCcmbmJzcDsnKTsNCiAgICAgICAgICAgIA0KICAg ICAgICAgICAgIyBMRVRTJ1MgU0VFIElGIERBVEFCQVNFIEhBUyBNQVRDSElORyBEQVRBDQog ICAgICAgICAgICBpZiAoKCRrdW9fZmlsZV9zdGF0cykgJiYgKCFlbXB0eSgka3VvX2ZpbGVf c3RhdHMpKSkgew0KICAgICAgICAgICAgICAgICRrdW9fc3RhdHNfY291bnRlciA9IDE7DQog ICAgICAgICAgICAgICAgZm9yZWFjaCAoJGt1b19maWxlX3N0YXRzIGFzICRrdW9fc3RhdHMp IHsNCg0KICAgICAgICAgICAgICAgICAgICAjIElGIElQIEFERFJFU1MgT0YgU09NRSBTT1JU IElTIEFWQUlMQUJMRQ0KICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfaXAg PSBmaWx0ZXJfdmFyKCRrdW9fc3RhdHNbJ2lwJ10sRklMVEVSX1NBTklUSVpFX1NUUklORyk7 DQogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgka3VvX2ZpbGVfc3RhdHNfaXApKSB7 DQogICAgICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfaXAgPSBLVU9fRklM RV9TVEFUU19OQlNQOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAg ICAgICAgIyBJRiBVU0VSTkFNRSBJUyBBVkFJTEFCTEUNCiAgICAgICAgICAgICAgICAgICAg JGt1b19maWxlX3N0YXRzX3VzZXJuYW1lID0gZmlsdGVyX3Zhcigka3VvX3N0YXRzWyd1c2Vy bmFtZSddLEZJTFRFUl9TQU5JVElaRV9TVFJJTkcpOw0KICAgICAgICAgICAgICAgICAgICBp ZiAoZW1wdHkoJGt1b19maWxlX3N0YXRzX3VzZXJuYW1lKSkgew0KICAgICAgICAgICAgICAg ICAgICAgICAgJGt1b19maWxlX3N0YXRzX3VzZXJuYW1lID0gS1VPX0ZJTEVfU1RBVFNfTkJT UDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICANCiAgICAg ICAgICAgICAgICAgICAgIyBJRiBQUklWSUxFR0VTIElTIEFWQUlMQUJMRQ0KICAgICAgICAg ICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfcHJpdnMgPSBmaWx0ZXJfdmFyKCRrdW9fc3Rh dHNbJ3ByaXZzJ10sRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpOw0KICAgICAgICAgICAg ICAgICAgICBpZiAoKGVtcHR5KCRrdW9fZmlsZV9zdGF0c19wcml2cykpIG9yICgka3VvX2Zp bGVfc3RhdHNfcHJpdnMgPT09ICcwJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRr dW9fZmlsZV9zdGF0c19wcml2cyA9IGdUeHQoJ3ByaXZzX25vbmUnKTsNCiAgICAgICAgICAg ICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKCRrdW9fZmlsZV9zdGF0 c19wcml2cyA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3Rh dHNfcHJpdnMgPSBnVHh0KCdwdWJsaXNoZXInKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKCRrdW9fZmlsZV9zdGF0c19wcml2cyA9PSAy KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfcHJpdnMgPSBn VHh0KCdtYW5hZ2luZ19lZGl0b3InKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAg ICAgICAgICAgICAgICBlbHNlaWYgKCRrdW9fZmlsZV9zdGF0c19wcml2cyA9PSAzKSB7DQog ICAgICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfcHJpdnMgPSBnVHh0KCdj b3B5X2VkaXRvcicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAg ICAgIGVsc2VpZiAoJGt1b19maWxlX3N0YXRzX3ByaXZzID09IDQpIHsNCiAgICAgICAgICAg ICAgICAgICAgICAgICRrdW9fZmlsZV9zdGF0c19wcml2cyA9IGdUeHQoJ3N0YWZmX3dyaXRl cicpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2Vp ZiAoJGt1b19maWxlX3N0YXRzX3ByaXZzID09IDUpIHsNCiAgICAgICAgICAgICAgICAgICAg ICAgICRrdW9fZmlsZV9zdGF0c19wcml2cyA9IGdUeHQoJ2ZyZWVsYW5jZXInKTsNCiAgICAg ICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKCRrdW9fZmls ZV9zdGF0c19wcml2cyA9PSA2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAka3VvX2Zp bGVfc3RhdHNfcHJpdnMgPSBnVHh0KCdkZXNpZ25lcicpOw0KICAgICAgICAgICAgICAgICAg ICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIyBXSEVOIEZJTEUgV0FTIEFDQ0VTU0VEDQog ICAgICAgICAgICAgICAgICAgICRrdW9fZmlsZV9zdGF0c193aGVuID0gZmlsdGVyX3Zhcigk a3VvX3N0YXRzWyd3aGVuJ10sRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpOw0KICAgICAg ICAgICAgICAgICAgICBpZiAoZW1wdHkoJGt1b19maWxlX3N0YXRzX3doZW4pKSB7DQogICAg ICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfd2hlbiA9IEtVT19GSUxFX1NU QVRTX05CU1A7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAg ZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAg ICAgICMgQ0hFQ0sgSE9XIERBVEUgQU5EIFRJTUUgU0hPVUxEIEJFIEZPUk1BVFRFRA0KICAg ICAgICAgICAgICAgICAgICAgICAgIyBBVCBTT01FIFBPSU5UIFNIT1VMRCBDSEVDSyBIT1cg VVMvVUsgREFURSBGT1JNQVQgSVMNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaXNz ZXQoJEdMT0JBTFNbJ3ByZWZzJ11bJ2xhbmd1YWdlJ10pKSAmJiAoIWVtcHR5KCRHTE9CQUxT WydwcmVmcyddWydsYW5ndWFnZSddKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpZiAoaW5fYXJyYXkoJEdMT0JBTFNbJ3ByZWZzJ11bJ2xhbmd1YWdlJ10sYXJyYXkoJ2Vu LWdiJywnZW4tdXMnKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGt1 b19maWxlX3N0YXRzX3doZW5fZm9ybWF0ID0gJ20vZC9ZIEg6aSc7DQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfd2hlbl9m b3JtYXQgPSAnai5uLlkgSC5pJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQog ICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNl IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfd2hlbl9m b3JtYXQgPSAnbS9kL1kgSDppJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAg ICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgJGt1b19maWxl X3N0YXRzX3doZW4gPSBkYXRlKCRrdW9fZmlsZV9zdGF0c193aGVuX2Zvcm1hdCxzdHJ0b3Rp bWUoJGt1b19maWxlX3N0YXRzX3doZW4pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAg ICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgIyBNSVNDIERBVEEgQUJP VVQgVVNFUiBXSE8gQUNDRVNTRUQgRklMRQ0KICAgICAgICAgICAgICAgICAgICAka3VvX2Zp bGVfc3RhdHNfbWlzYyA9IGZpbHRlcl92YXJfYXJyYXkodW5zZXJpYWxpemUoJGt1b19zdGF0 c1snbWlzYyddKSxGSUxURVJfU0FOSVRJWkVfU1RSSU5HKTsNCiAgICAgICAgICAgICAgICAg ICAgaWYgKCghZW1wdHkoJGt1b19maWxlX3N0YXRzX21pc2MpKSAmJiAoaXNfYXJyYXkoJGt1 b19maWxlX3N0YXRzX21pc2MpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIyBCRUdJ TlM6IElGIFZJRVdJTkcgREVUQUlMUw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChp c3NldCgkX0dFVFsna3VvX2ZpbGVfc3RhdHNfZGV0YWlscyddKSkgJiYgKCFlbXB0eSgkX0dF VFsna3VvX2ZpbGVfc3RhdHNfZGV0YWlscyddKSkgJiYgKGlzX251bWVyaWMoJF9HRVRbJ2t1 b19maWxlX3N0YXRzX2RldGFpbHMnXSkpICYmIA0KICAgICAgICAgICAgICAgICAgICAgICAg KCRfR0VUWydrdW9fZmlsZV9zdGF0c19kZXRhaWxzJ10gPT0gZmlsdGVyX3Zhcigka3VvX3N0 YXRzWydpZCddLEZJTFRFUl9TQU5JVElaRV9OVU1CRVJfSU5UKSkpIHsNCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfbWlzYyA9ICc8dWw+DQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48c3Ryb25nPlVzZXIgYWdlbnQ6PC9zdHJv bmc+ICcuZmlsdGVyX3Zhcigka3VvX2ZpbGVfc3RhdHNfbWlzY1sndXNlcl9hZ2VudCddLEZJ TFRFUl9TQU5JVElaRV9TVFJJTkcpLic8L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8bGk+PHN0cm9uZz5IVFRQIHJlZmVycmVyOjwvc3Ryb25nPiAnLmZpbHRlcl92 YXIoJGt1b19maWxlX3N0YXRzX21pc2NbJ2h0dHBfcmVmZXJyZXInXSxGSUxURVJfU0FOSVRJ WkVfU1RSSU5HKS4nPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxp PjxzdHJvbmc+PGEgaHJlZj0iP2V2ZW50PWZpbGUmYW1wO3N0ZXA9ZmlsZV9lZGl0JmFtcDtp ZD0nLmZpbHRlcl92YXIoJF9HRVRbJ2lkJ10sRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQp LiciPicuZ1R4dCgnY2xvc2UnKS4nPC9hPjwvc3Ryb25nPjwvbGk+DQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgPC91bD4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAg ICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgJGt1b19maWxlX3N0YXRzX21pc2MgPSAnPGEgaHJlZj0iP2V2ZW50PWZpbGUmYW1wO3N0 ZXA9ZmlsZV9lZGl0JmFtcDtpZD0nLmZpbHRlcl92YXIoJF9HRVRbJ2lkJ10sRklMVEVSX1NB TklUSVpFX05VTUJFUl9JTlQpLicmYW1wO2t1b19maWxlX3N0YXRzX2RldGFpbHM9Jy5maWx0 ZXJfdmFyKCRrdW9fc3RhdHNbJ2lkJ10sRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpLici PicuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3ZhcihzdWJzdHIoJGt1 b19maWxlX3N0YXRzX21pc2NbJ3VzZXJfYWdlbnQnXSwwLDIwKSxGSUxURVJfU0FOSVRJWkVf U1RSSU5HKS4nJmhlbGxpcDs8L2E+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAg ICAgICAgICAgICAgICAgICAgICAgICMgRU5EUzogSUYgVklFV0lORyBERVRBSUxTDQogICAg ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAg ICAgICAgICAgICAgICAgICAka3VvX2ZpbGVfc3RhdHNfbWlzYyA9IEtVT19GSUxFX1NUQVRT X05CU1A7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQog ICAgICAgICAgICAgICAgICAgICRrdW9fZmlsZV9zdGF0c19odG1sIC49ICc8dHI+DQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgPHRkPicuJGt1b19zdGF0c19jb3VudGVyKysuJy48 L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4nLiRrdW9fZmlsZV9zdGF0 c19pcC4nPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Jy4ka3VvX2Zp bGVfc3RhdHNfdXNlcm5hbWUuJzwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg PHRkPicuJGt1b19maWxlX3N0YXRzX3ByaXZzLic8L3RkPg0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDx0ZD4nLiRrdW9fZmlsZV9zdGF0c193aGVuLic8L3RkPg0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDx0ZD4nLiRrdW9fZmlsZV9zdGF0c19taXNjLic8L3RkPg0K ICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4nOw0KICAgICAgICAgICAgICAgIH0NCiAg ICAgICAgICAgICAgICAjIEZPUkVBQ0ggRU5EUw0KICAgICAgICAgICAgfQ0KICAgICAgICB9 DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgJGt1b19maWxlX3N0YXRzX2h0bWwgPSAn PHRyPjx0ZCBjb2xzcGFuPSI2Ij4nLmdUeHQoJ25vbmUnKS4nPC90ZD48L3RyPic7DQogICAg ICAgIH0NCiAgICAgICAgZWNobyAnPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCiAgICAgICAg ICAgICNrdW9fZmlsZV9zdGF0cyB7DQogICAgICAgICAgICAgICAgYm9yZGVyOiAxMHB4IHNv bGlkICNmMGYwZjA7DQogICAgICAgICAgICAgICAgcGFkZGluZzogMyU7DQogICAgICAgICAg ICAgICAgbWFyZ2luOiAxJSBhdXRvOw0KICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICNm ZmY7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgI2t1b19maWxlX3N0YXRzIHRh YmxlIHsNCiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgICAgICAgICBi b3JkZXI6IDA7DQogICAgICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsN CiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAja3VvX2ZpbGVfc3RhdHMgdGgsDQog ICAgICAgICAgICAja3VvX2ZpbGVfc3RhdHMgdGQgew0KICAgICAgICAgICAgICAgIHBhZGRp bmc6IDVweDsNCiAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Yw ZjBmMDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAja3VvX2ZpbGVfc3RhdHMg dHI6bnRoLWNoaWxkKG9kZCkgdGQgew0KICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICNm ZmM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgPC9zdHlsZT4NCiAgICAgICAg PGRpdiBpZD0ia3VvX2ZpbGVfc3RhdHMiPg0KICAgICAgICAgICAgPGgzPlJlY2VudCBmaWxl IGFjY2VzcyBsb2dzPC9oMz4NCiAgICAgICAgICAgIDx0YWJsZT4NCiAgICAgICAgICAgICAg ICA8dGhlYWQ+DQogICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAg ICAgICAgIDx0aD4jPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5JUDwvdGg+ DQogICAgICAgICAgICAgICAgICAgICAgICA8dGg+VXNlcm5hbWU8L3RoPg0KICAgICAgICAg ICAgICAgICAgICAgICAgPHRoPlByaXZzPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAg IDx0aD5XaGVuPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5EZXRhaWxzPC90 aD4NCiAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8L3RoZWFk Pg0KICAgICAgICAgICAgICAgIDx0Ym9keT4NCiAgICAgICAgICAgICAgICAgICAgJy4ka3Vv X2ZpbGVfc3RhdHNfaHRtbC4nDQogICAgICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAg ICAgIDwvdGFibGU+DQogICAgICAgIDwvZGl2Pic7DQogICAgICAgIHVuc2V0KCRrdW9fZmls ZV9zdGF0cyk7DQogICAgICAgIHVuc2V0KCRrdW9fZmlsZV9zdGF0c19odG1sKTsNCiAgICB9 DQogICAgIyBGVU5DVElPTiBFTkRTDQoNCn0NCiMgRU5EUzogQURNSU4tU0lERSBGVU5DVElP TlMNCg0KIyBCRUdJTlM6IFBVQkxJQy1TSURFIEZVTkNUSU9OUw0KaWYgKEB0eHBpbnRlcmZh Y2UgPT09ICdwdWJsaWMnKSB7DQoNCiAgICByZWdpc3Rlcl9jYWxsYmFjaygna3VvX2ZpbGVf c3RhdHNfZnVuY3Rpb25zJywnZmlsZV9kb3dubG9hZCcpOw0KDQogICAgZnVuY3Rpb24ga3Vv X2ZpbGVfc3RhdHNfZnVuY3Rpb25zKCkgew0KICAgICAgICAjIEdFVFRJTkcgRklMRSBJRA0K ICAgICAgICAka3VvX2ZpbGVfaWQgPSBleHBsb2RlKCdmaWxlX2Rvd25sb2FkLycscGFyc2Vf dXJsKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddLFBIUF9VUkxfUEFUSCkpOw0KICAgICAgICBp ZiAoKCFlbXB0eSgka3VvX2ZpbGVfaWQpKSAmJiAoaXNfYXJyYXkoJGt1b19maWxlX2lkKSkp IHsNCiAgICAgICAgICAgIGRlZmluZSgnS1VPX0ZJTEVfU1RBVFNfUkVRVUVTVF9JRCcsZmls dGVyX3ZhcihzdWJzdHIoJGt1b19maWxlX2lkWzFdLDAsc3RycG9zKCRrdW9fZmlsZV9pZFsx XSwnLycpKSksRklMVEVSX1NBTklUSVpFX05VTUJFUl9JTlQpOw0KICAgICAgICAgICAgdW5z ZXQoJGt1b19maWxlX2lkKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgIyBHRVRU SU5HIEZJTEUgTkFNRQ0KICAgICAgICBkZWZpbmUoJ0tVT19GSUxFX1NUQVRTX1JFUVVFU1Rf RklMRV9OQU1FJyxiYXNlbmFtZShwYXJzZV91cmwoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10s UEhQX1VSTF9QQVRIKSkpOw0KICAgICAgICANCiAgICAgICAgIyBHRVRUSU5HIFNPTUUgSVAN CiAgICAgICAgZGVmaW5lKCdLVU9fRklMRV9TVEFUU19JUCcsZmlsdGVyX3ZhcigkX1NFUlZF UlsnUkVNT1RFX0FERFInXSxGSUxURVJfU0FOSVRJWkVfU1RSSU5HKSk7DQogICAgICAgIA0K ICAgICAgICAjIEdFVFRJTkcgTUlTQyBEQVRBDQogICAgICAgIGRlZmluZSgnS1VPX0ZJTEVf U1RBVFNfTUlTQycsc2VyaWFsaXplKGZpbHRlcl92YXJfYXJyYXkoYXJyYXkoDQogICAgICAg ICAgICAndXNlcl9hZ2VudCc9PiRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwNCiAgICAg ICAgICAgICdodHRwX3JlZmVycmVyJz0+JF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddLA0KICAg ICAgICAgICAgJ3NjcmlwdF9maWxlbmFtZSc9PiRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUn XSwNCiAgICAgICAgICAgICdyZXF1ZXN0X3RpbWUnPT4kX1NFUlZFUlsnUkVRVUVTVF9USU1F J10NCiAgICAgICAgKSxGSUxURVJfU0FOSVRJWkVfU1RSSU5HKSkpOw0KICAgICAgICANCiAg ICAgICAgIyBHRVRUSU5HIFVTRVIgREFUQSBJRiBBVkFJTEFCTEUNCiAgICAgICAgaWYgKGlz X2xvZ2dlZF9pbigpKSB7DQogICAgICAgICAgICBkZWZpbmUoJ0tVT19GSUxFX1NUQVRTX1VT RVJOQU1FJyxmaWx0ZXJfdmFyKGlzX2xvZ2dlZF9pbigpWyduYW1lJ10sRklMVEVSX1NBTklU SVpFX1NUUklORykpOw0KICAgICAgICAgICAgZGVmaW5lKCdLVU9fRklMRV9TVEFUU19QUklW UycsZmlsdGVyX3Zhcihpc19sb2dnZWRfaW4oKVsncHJpdnMnXSxGSUxURVJfU0FOSVRJWkVf TlVNQkVSX0lOVCkpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAg ZGVmaW5lKCdLVU9fRklMRV9TVEFUU19VU0VSTkFNRScsTlVMTCk7DQogICAgICAgICAgICBk ZWZpbmUoJ0tVT19GSUxFX1NUQVRTX1BSSVZTJyxOVUxMKTsNCiAgICAgICAgfQ0KICAgICAg ICANCiAgICAgICAgIyBTQVZJTkcgREFUQQ0KICAgICAgICBpZiAoKGRlZmluZWQoJ0tVT19G SUxFX1NUQVRTX1JFUVVFU1RfSUQnKSkgJiYgKEtVT19GSUxFX1NUQVRTX1JFUVVFU1RfSUQg IT0gTlVMTCkgJiYgKGRlZmluZWQoJ0tVT19GSUxFX1NUQVRTX1JFUVVFU1RfRklMRV9OQU1F JykpICYmIChLVU9fRklMRV9TVEFUU19SRVFVRVNUX0ZJTEVfTkFNRSAhPSBOVUxMKQ0KICAg ICAgICAmJiAoZGVmaW5lZCgnS1VPX0ZJTEVfU1RBVFNfSVAnKSkgJiYgKEtVT19GSUxFX1NU QVRTX0lQICE9IE5VTEwpICYmIChkZWZpbmVkKCdLVU9fRklMRV9TVEFUU19NSVNDJykpICYm IChLVU9fRklMRV9TVEFUU19NSVNDICE9IE5VTEwpKSB7DQogICAgICAgICAgICBzYWZlX3F1 ZXJ5KCdJTlNFUlQgSU5UTyBgJy5zYWZlX3BmeCgna3VvX2ZpbGVfc3RhdHMnKS4nYCAoZmls ZV9pZCwgZmlsZV9uYW1lLCBpcCwgdXNlcm5hbWUsIHByaXZzLCBtaXNjKSBWQUxVRVMgKCIn LmRvU2xhc2goS1VPX0ZJTEVfU1RBVFNfUkVRVUVTVF9JRCkuJyIsICInLmRvU2xhc2goS1VP X0ZJTEVfU1RBVFNfUkVRVUVTVF9GSUxFX05BTUUpLiciLCANCiAgICAgICAgICAgICInLmRv U2xhc2goS1VPX0ZJTEVfU1RBVFNfSVApLiciLCAiJy5kb1NsYXNoKEtVT19GSUxFX1NUQVRT X1VTRVJOQU1FKS4nIiwgIicuZG9TbGFzaChLVU9fRklMRV9TVEFUU19QUklWUykuJyIsICIn LmRvU2xhc2goS1VPX0ZJTEVfU1RBVFNfTUlTQykuJyIpJywxKTsNCiAgICAgICAgfSAgIA0K ICAgIH0NCiAgICAjIEZVTkNUSU9OUyBFTkRTDQp9DQojIEVORFM6IFBVQkxJQy1TSURFIEZV TkNUSU9OUyI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6NToib3JkZXIiO3M6MToiNSI7czo1OiJm bGFncyI7czoxOiIyIjtzOjQ6ImhlbHAiO3M6MTc3NDoiPHVsIGlkPSJsaW5rcyI+CjxsaSBp ZD0ia3VvX2ZpbGVfc3RhdHMiPjxhIGhyZWY9IiNrdW9fZmlsZV9zdGF0cyI+a3VvX2ZpbGVf c3RhdHM8L2E+PC9saT4KPGxpIGlkPSJleHRlcm5hbCI+PGEgaHJlZj0iaHR0cDovL2t1b3Bh c3NhLm5ldC90eHAvIiByZWw9ImV4dGVybmFsIj5rdW9wYXNzYS5uZXQvdHhwPC9hPjwvbGk+ CjwvdWw+CjxkaXYgaWQ9ImJyaWVmbHkiPgo8aDI+QWJvdXQgdGhpcyBwbHVnaW48L2gyPgo8 cD5FYWNoIHRpbWUgc29tZW9uZSBvcGVucyBhIGZpbGUgdGhhdCdzIHNhdmVkIHRvIFRleHRw YXR0ZXJuJ3MgRmlsZXMnIHNlY3Rpb24sIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVz ZXIgaXMgc2F2ZWQgdG8gdGhlIGRhdGFiYXNlLiBUaGF0IGluZm9ybWF0aW9uIGNhbiB0aGVu IGJlIGFjY2Vzc2VkIGZyb20gRmlsZXMuIFRoZSBwbHVnaW4gc2F2ZXMgZGF0ZSBhbmQgdGlt ZSB3aGVuIGZpbGUgd2FzIGFjY2Vzc2VkLCB0aGUgSVAgYWRkcmVzcywgYXMgd2VsbCBUZXh0 cGF0dGVybiB1c2VybmFtZSBhbmQgcHJpdmlsZWdlIChpZiB0aGUgdXNlciBpbiBxdWVzdGlv biB3YXMgbG9nZ2VkIGluIHRvIFRleHRwYXR0ZXJuIHdoZW4gYWNjZXNzaW5nIGEgZmlsZSks IGFuZCBvdGhlciBkZXRhaWxzLjwvcD4KPGgzPkluc3RhbGxpbmc8L2gzPgo8b2w+CjxsaT5B Y3RpdmF0ZSB0aGUgVGV4dHBhdHRlcm4gcGx1Z2luIDxjb2RlPmt1b19maWxlX3N0YXRzPC9j b2RlPi48L2xpPgo8L29sPgo8aDM+VW5pbnN0YWxsaW5nPC9oMz4KPG9sPgo8bGk+RGVhY3Rp dmF0ZSB0aGUgVGV4dHBhdHRlcm4gcGx1Z2luIDxjb2RlPmt1b19maWxlX3N0YXRzPC9jb2Rl Pi48L2xpPgo8L29sPgo8L2Rpdj4KPCEtLSAqKiogQkVHSU4gUExVR0lOIENTUyAqKiogLS0+ CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+I2JyaWVmbHkgeyBwYWRkaW5nOiAzJTsgZm9udC1z aXplOiAxLjJlbTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMjBweCAjY2NjOyAtd2Via2l0LWJv eC1zaGFkb3c6IDAgMCAyMHB4ICNjY2M7IGJveC1zaGFkb3c6IDAgMCAyMHB4ICNjY2M7IH0j bm90aWNlIHsgcGFkZGluZzogMSU7IG1hcmdpbjogMC41JSAwOyBiYWNrZ3JvdW5kOiAjZmZj OyBib3JkZXI6IDFweCBkYXNoZWQgI2ZjYzsgfSBsaSBzcGFuIHsgY29sb3I6ICM2NjY7IH0g LmxhcmdlIGNvZGUgeyBmb250LXNpemU6IDEuM2VtOyBwYWRkaW5nOiAxJTsgYm9yZGVyOiAx cHggc29saWQgIzY5MDsgfSBociB7IGJvcmRlcjogM3B4IHNvbGlkICNjY2M7IGZvbnQ6IDFl bSBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30jbGlua3MgeyBkaXNwbGF5OiB0YWJs ZTsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgY2xlYXI6IGJvdGg7IHBhZGRpbmc6IDA7 IG1hcmdpbjogMCAwIDVweCAwOyBsaXN0LXN0eWxlOiBub25lOyB9I2xpbmtzIGxpIHsgZmxv YXQ6IGxlZnQ7IGRpc3BsYXk6IGlubGluZTsgfSAjbGlua3MgYSB7IGZsb2F0OiBsZWZ0OyBt YXJnaW4tcmlnaHQ6IDVweDsgYmFja2dyb3VuZDogIzhBQzZFRDsgY29sb3I6ICMzMzM7IHBh ZGRpbmc6IDVweCAxMHB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0gI2xpbmtzIGxpOmxh c3QtY2hpbGQgYSB7IGJhY2tncm91bmQ6ICM5REJCNzg7IH0jbGlua3MgbGk6bGFzdC1jaGls ZCBhOmhvdmVyLCNsaW5rcyBsaTpsYXN0LWNoaWxkIGE6Zm9jdXMsI2xpbmtzIGxpOmxhc3Qt Y2hpbGQgYTphY3RpdmUge2JhY2tncm91bmQ6ICNFMjgyNkI7IH08L3N0eWxlPgo8IS0tICoq KiBFTkQgUExVR0lOIENTUyAqKiogLS0+CiI7czozOiJtZDUiO3M6MzI6IjM5NmE2YjIwYTQ1 MTVlYTMyZGQxMjI5MzE4ZWRmMGNiIjt9