Login   Register  
PHP Classes
elePHPant
Icontem

File: lib/pss.inc.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Roman Shneer  >  PHP Security Scanner  >  lib/pss.inc.php  >  Download  
File: lib/pss.inc.php
Role: Class source
Content type: text/plain
Description: Class source
Class: PHP Security Scanner
Stop security attacks blocking malicious values
Author: By
Last change:
Date: 1 year ago
Size: 67,960 bytes
 

Contents

Class file image Download
<?php
/**
*Class PSS - P.W.S.M.
*Main P.W.S.M functions 
*Author Roman Shneer romanshneer@gmail.com
*1.02.2012
*Any changes at your risk and criminal responsibility
*/
eval(base64_decode('Q2xhc3MgUFNTDQp7DQp2YXIgJGRiLCRyZXN1bHRzX2NvdW50LCRvYmplY3RfbmFtZTsNCnZhciAkcmVzdWx0c19zdGVwPTEwMDsNCnZhciAkbWVtY2FjaGVfb2JqOw0KdmFyICRsdT1mYWxzZTsNCiBmdW5jdGlvbiBQU1MoKQ0KIHsNCiBnbG9iYWwgJHN0YXJ0Ow0KIC8vZXh0ZW5kaW5nIGRiIGNsYXNzDQogJHRoaXMtPmRiPSRzdGFydC0+ZGI7DQogJHRoaXMtPmx1PSRzdGFydC0+dHJ1c3Q7DQogICAjJHRoaXMtPmNoa19kYigpOw0KIH0NCiAjIyMgbWVudSAjIyMNCiBmdW5jdGlvbiBkcmF3X21lbnUoKQ0KIHsNCg0KIAlyZXR1cm4gJHRoaXMtPmNoZWNrX2llKCkuJw0KIAk8dGFibGUgYm9yZGVyPTAgIGNsYXNzPSJtZW51Ij4NCiAJPHRyPg0KICAJPHRkPjxhIGhyZWY9Ij9xPWFnZW50c19saXN0Ij5PYmplY3RzIGxpc3Q8L2E+PC90ZD4NCiAgCTx0ZD48YSBocmVmPSI/cT1jb25maWciPkNvbmZpZyBzZWN1cml0eSBmaWx0ZXJzPC9hPjwvdGQ+DQogIAk8dGQ+PGEgaHJlZj0iP3E9dGVzdF9mb3JtIj5UZXN0IGZvcm08L2E+PC90ZD4NCiAgCTx0ZD48YSBocmVmPSI/cT11c2VycyI+VXNlcnM8L2E+PC90ZD48dGQ+PGEgaHJlZj0iP3E9YWJvdXQiPkFib3V0PC9hPjwvdGQ+JyAuDQogIAknPHRkPjxhIGhyZWY9Ij9xPWV4aXQiPkV4aXQ8L2E+PC90ZD4NCiAJPC90cj4NCiAJPC90YWJsZT4NCiAJJzsNCiB9DQpmdW5jdGlvbiBhYm91dF9wYWdlKCkNCnsNCmdsb2JhbCAkc3RhcnQ7DQppZihpc3NldCgkX1BPU1RbJ2FjdCddKSYmaXNzZXQoJF9QT1NUWydudW1iZXInXSkmJigkX1BPU1RbJ2FjdCddPT0nSW5pdGlhbGl6YXRlIFJlZ2lzdGVyZWQgUHJvZHVjdCcpKQ0Kew0KJHRoaXMtPmluaXRfbGljZW5zZSgkX1BPU1RbJ251bWJlciddKTsNCn0NCiRodG1sPSc8ZGl2IGNsYXNzPSJib3giIHN0eWxlPSJ3aWR0aDo1NTBweDttYXJnaW46MCBhdXRvOyI+JzsNCmlmKCEkdGhpcy0+bHUpDQp7DQokaHRtbC49JzxoMiBjbGFzcz0idGl0bGUiPkJ1eSBub3cgUEhQIFdlYiBTZWN1cml0eSBNb25pdG9yIGFuZCBzYXZlIHlvdXIgc2l0ZSBmcm9tIGhhY2tlciBhbmQgdmlydXMgYXR0YWNzITwvaDI+JzsNCg0KJGh0bWwuPSc8Zm9ybSBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+DQo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siPg0KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaG9zdGVkX2J1dHRvbl9pZCIgdmFsdWU9IkxIV0NOVDQ2VThBU1kiPg0KPGlucHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbG9iamVjdHMuY29tL2VuX1VTL0lML2kvYnRuL2J0bl9idXlub3dDQ19MRy5naWYiIGJvcmRlcj0iMCIgbmFtZT0ic3VibWl0IiBhbHQ9IlBheVBhbCAtIFRoZSBzYWZlciwgZWFzaWVyIHdheSB0byBwYXkgb25saW5lISI+DQo8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZW5fVVMvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4NCjwvZm9ybT4nOw0KfWVsc2V7DQokaHRtbC49JzxoMiBjbGFzcz0idGl0bGUiPlJlZ2lzdGVyZWQgUHJvZHVjdDwvaDI+JzsNCn0NCiRodG1sLj0nPGZvcm0gYWN0aW9uPSI/cT1hYm91dCIgbWV0aG9kPSJQT1NUIj4NCjxiPlNlYyBDb2RlPC9iPiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibnVtYmVyIiB2YWx1ZT0iJy4kc3RhcnQtPmxpY2Vuc2Vfa2V5LiciIHBsYWNlaG9sZGVyPSJFbnRlciB5b3UgTGljZW5zZSBrZXkgSGVyZSI+Jm5ic3A7DQo8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJhY3QiIHZhbHVlPSJJbml0aWFsaXphdGUgUmVnaXN0ZXJlZCBQcm9kdWN0IiBjbGFzcz0iZ3JlZW5fY2wgYnRuIj4NCjwvZm9ybT4NCjxwPjxiPlBsZWFzZSB2aXNpdCBvdXIgPGEgaHJlZj0iaHR0cDovL3JvbWFuc2huZWVyLmluZm8vcHdzbS9zdXBwb3J0LnBocCIgdGFyZ2V0PSJfYmxhbmsiPlN1cHBvcnQgcGFnZTwvYT4NCiZuYnNwO29yIDxhIGhyZWY9Imh0dHA6Ly9yb21hbnNobmVlci5pbmZvL3B3c20vY29udGFjdHMucGhwIiB0YXJnZXQ9Il9ibGFuayI+Y29udGFjdCBBdXRob3I8L2E+IGZvciBoZWxwIGFuZCBhbnkgcXVlc3Rpb25zPC9iPjwvcD4NCjwvZGl2Pic7DQpyZXR1cm4gJGh0bWw7CQ0KfSANCiBmdW5jdGlvbiBjaGVja19pZSgpDQogew0KIHJldHVybiBmYWxzZTsNCiBpZiAocHJlZ19tYXRjaCgnfE1TSUUgKFswLTldLlswLTldezEsMn0pfCcsJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCRtYXRjaGVkKSkgew0KICAgICRicm93c2VyX3ZlcnNpb249JG1hdGNoZWRbMV07DQogICAgcmV0dXJuICI8ZGl2IGNsYXNzPSdlcnJvcic+PGgxPkRvbnQgdXNlIEludGVybmV0IEV4cGxvcmVyIHdpdGggd29yayBvbiBzeXN0ZW0sIGl0J3Mgbm90IHdvcmtpbmcgY29ycmVjdHkhISE8L2gxPg0KICAgIDxwPldlIGJlbGlldmUgaW4gb3BlbiBzb3VyY2U6IDxhIGhyZWY9J2h0dHA6Ly93d3cubW96aWxsYS5vcmcvJyB0YXJnZXQ9X2JsYW5rPkZpcmVmb3g8L2E+LCA8YSBocmVmPSdodHRwOi8vd3d3Lmdvb2dsZS5jb20vY2hyb21lLycgdGFyZ2V0PV9ibGFuaz5DaHJvbWU8L2E+LCA8YSBocmVmPSdodHRwOi8vd3d3LmFwcGxlLmNvbS9ydS9zYWZhcmkvZG93bmxvYWQvJyB0YXJnZXQ9X2JsYW5rPlNhZmFyeTwvYT4sIDxhIGhyZWY9J2h0dHA6Ly93d3cub3BlcmEuY29tLycgdGFyZ2V0PV9ibGFuaz5PcGVyYTwvYT48L3A+DQogICAgPC9kaXY+IjsNCgl9DQoNCiB9DQogZnVuY3Rpb24gdXNlcnNfZm9ybSgpDQogew0KICBpZihpc3NldCgkX0dFVFsnaWQnXSkpDQogIHsNCiAgJHVzZXI9JHRoaXMtPmdldF91c2VyKCRfR0VUWydpZCddKTsNCiAgcmV0dXJuICR0aGlzLT5lZGl0X3VzZXJfZm9ybSgkdXNlcik7DQogIH0NCiAkdXNlcnM9JHRoaXMtPmdldF91c2VycygpOw0KIA0KICRodG1sPSc8cCBjbGFzcz0iZ3JlZW5fY2wgYnRuIHVzciIgIj48YSBocmVmPSJpbmRleC5waHA/cT11c2VycyZpZD0wIj5OZXcgVXNlcjwvYT48L3A+DQogPHVsIGNsYXNzPSJ1c2Vyc19saXN0Ij4nOw0KIGZvcmVhY2goJHVzZXJzIGFzICR1KQ0KICB7DQogICRodG1sLj0nPGxpPicuJHVbJ25hbWUnXS4nIDxhIGhyZWY9Ij9xPXVzZXJzJmlkPScuJHVbJ2lkJ10uJyIgY2xhc3M9ImdyZWVuX2NsIGJ0biI+ZWRpdDwvYT48L2xpPic7DQogIH0NCiAkaHRtbC49Jzx1bD4nOw0KIHJldHVybiAkaHRtbDsNCiB9DQogZnVuY3Rpb24gZGVsZXRlX3VzZXIoJHVzZXIpDQogew0KICRzcWw9IkRFTEVURSBGUk9NIHB3c21fdXNlcnMgV0hFUkUgaWQ9Ii4kdGhpcy0+ZGItPlEoJHVzZXJbJ2lkJ10pOwkNCiAkdGhpcy0+ZGItPlFVRVJZKCRzcWwpOw0KIGhlYWRlcigiTG9jYXRpb246aW5kZXgucGhwP3E9dXNlcnMiKTsJDQogZXhpdCgpOw0KIH0NCiBmdW5jdGlvbiBzYXZlX3VzZXIoJHVzZXIpDQogew0KIGlmKCR1c2VyWydpZCddKQ0KIHsJDQogJHNxbD0iVVBEQVRFIHB3c21fdXNlcnMgU0VUIG5hbWU9JyIuJHRoaXMtPmRiLT5RKCR1c2VyWyduYW1lJ10pLiInLGVtYWlsPSciLiR0aGlzLT5kYi0+USgkdXNlclsnZW1haWwnXSkuIiciOw0KIAlpZigoJHVzZXJbJ3Bhc3N3b3JkMSddKSYmKCR1c2VyWydwYXNzd29yZDEnXT09JHVzZXJbJ3Bhc3N3b3JkMiddKSkNCiAJew0KIAkkc3FsLj0iLHBhc3M9JyIubWQ1KCR1c2VyWydwYXNzd29yZDEnXSkuIiciOw0KIAl9DQogJHNxbC49IiBXSEVSRSBpZD0iLiR0aGlzLT5kYi0+USgkdXNlclsnaWQnXSk7DQogfWVsc2V7DQogJHNxbD0iSU5TRVJUIElOVE8gcHdzbV91c2VycyAobmFtZSxlbWFpbCxwYXNzKSBWQUxVRVMgKCciLiR0aGlzLT5kYi0+USgkdXNlclsnbmFtZSddKS4iJywnIi4kdGhpcy0+ZGItPlEoJHVzZXJbJ2VtYWlsJ10pLiInLCciLm1kNSgkdXNlclsncGFzc3dvcmQxJ10pLiInKSI7DQogfQ0KICR0aGlzLT5kYi0+UVVFUlkoJHNxbCk7DQogaGVhZGVyKCJMb2NhdGlvbjppbmRleC5waHA/cT11c2VycyIpOwkNCiBleGl0KCk7DQogfQ0KIGZ1bmN0aW9uIGVkaXRfdXNlcl9mb3JtKCR1c2VyKQ0KIHsNCiBpZihpc3NldCgkX1BPU1RbJ29wJ10pJiYoJF9QT1NUWydvcCddPT0ndXBkYXRlJykpDQogCXsNCiAJJHRoaXMtPnNhdmVfdXNlcigkX1BPU1QpOw0KIAl9ZWxzZWlmKGlzc2V0KCRfUE9TVFsnb3AnXSkmJigkX1BPU1RbJ29wJ109PSdkZWxldGUnKSkNCiAJew0KIAkkdGhpcy0+ZGVsZXRlX3VzZXIoJF9QT1NUKTsNCiAJfQ0KIAkNCiAkaHRtbD0nPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCIgbmFtZT0idXNlcl9lZGl0Ij48dGFibGUgaWQ9InVzZXJfZWRpdCIgY2xhc3M9ImJveCI+JzsNCiAkaHRtbC49Jzx0cj48dGg+TmFtZTwvdGg+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuYW1lIiB2YWx1ZT0iJy4kdXNlclsnbmFtZSddLiciPjwvdGQ+PC90cj4NCiA8dHI+PHRoPkVtYWlsPC90aD48dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImVtYWlsIiB2YWx1ZT0iJy4kdXNlclsnZW1haWwnXS4nIj48L3RkPjwvdHI+DQogPHRyPjx0aD5OZXcgUGFzc3dvcmQ8L3RoPjx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkMSI+PC90ZD48L3RyPg0KIDx0cj48dGg+UmV0eXBlIE5ldyBQYXNzd29yZDwvdGg+PHRkPjxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQyIj48L3RkPjwvdHI+DQogPHRyPjx0ZD48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iZ3JlZW5fY2wgYnRuIiBuYW1lPSJvcCIgdmFsdWU9InVwZGF0ZSIgb25DbGljaz0icmV0dXJuIGNoa191c2VyX2VkaXRfZm9ybSgpOyI+PC90ZD4nIC4oKCgkdXNlclsnaWQnXSkmJigkdXNlclsnaWQnXSE9JF9TRVNTSU9OWyd1c2VyJ11bJ2lkJ10pKT8NCiAJCSc8dGQ+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ib3AiIHZhbHVlPSJkZWxldGUiIG9uQ2xpY2s9ImlmKGNvbmZpcm0oXCdTdXJlIHdhbnQgZGVsZXRlIHVzZXI/XCcpKSByZXR1cm4gdHJ1ZTtlbHNlIHJldHVybiBmYWxzZTsiIGNsYXNzPSJyZWRfY2wgYnRuIj48L3RkPjwvdHI+JzonJykgLg0KIAkJJw0KIDwvdGFibGU+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaWQiIHZhbHVlPSInLiR1c2VyWydpZCddLiciPjwvZm9ybT4nOw0KIHJldHVybiAkaHRtbDsNCiB9DQogZnVuY3Rpb24gZ2V0X3VzZXIoJGlkKQ0KIHsNCiByZXR1cm4gJHRoaXMtPmRiLT5ST1dfUSgiU0VMRUNUICogRlJPTSBwd3NtX3VzZXJzIFdIRVJFIGlkPSIuJHRoaXMtPmRiLT5RKCRpZCkpOw0KIH0NCiBmdW5jdGlvbiBnZXRfdXNlcnMoKQ0KIHsNCiByZXR1cm4gJHRoaXMtPmRiLT5MSVNUX1EoIlNFTEVDVCAqIEZST00gcHdzbV91c2VycyIpOw0KIH0NCiAjIyMgYnJvd3NlIGZpbGVzeXN0ZW0gZnJvbSBkb2N1bWVudF9yb290IGZvciBwYXRjaGluZyBmaWxlcyAjIyMjDQogZnVuY3Rpb24gd2lzYXJkX25ld19hZ2VudCgpDQogew0KICRodG1sPScnOw0KIGlmKGlzc2V0KCRfR0VUWydwYXRjaCddKSYmKHN0cmxlbigkX0dFVFsncGF0Y2gnXSkpKQ0KIHsNCiAJJGh0bWwuPSI8ZGl2IGNsYXNzPSdtZXNzYWdlJz4iLiR0aGlzLT53aXNhcmRfcGF0Y2hfZmlsZSgkX0dFVFsncGF0Y2gnXSkuJzwvZGl2Pic7DQogfWVsc2VpZigoaXNzZXQoJF9HRVRbJ3VucGF0Y2gnXSkpJiYoc3RybGVuKCRfR0VUWyd1bnBhdGNoJ10pKSkNCiB7DQogICAgJGh0bWwuPSI8ZGl2IGNsYXNzPSdtZXNzYWdlJz4iLiR0aGlzLT53aXNhcmRfdW5wYXRjaF9maWxlKCRfR0VUWyd1bnBhdGNoJ10pLic8L2Rpdj4nOw0KIH0NCiAkaHRtbC49Ig0KIDxoND5GaXJzdCBicm93c2UgdG8gdGFyZ2V0IHN5c3RlbSAsY2hvaXNlIG1haW4gbG9hZGluZyBmaWxlIG9yIGhlYWRlciBmaWxlIGluIHByb2plY3Q8L2g0PiIuJHRoaXMtPmJyb3dzZV9maWxlc3lzdGVtKCk7DQogcmV0dXJuICRodG1sOw0KIH0NCiBmdW5jdGlvbiBicm93c2VfZmlsZXN5c3RlbSgpDQogew0KCSBpZigoaXNzZXQoJF9HRVRbJ2RpciddKSkmJihzdHJsZW4oJF9HRVRbJ2RpciddKSkpDQoJIHsNCgkgCSRwYXRoPSRfR0VUWydkaXInXTsNCgkgfWVsc2UgJHBhdGg9JF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXTsNCgkgDQoJICRodG1sPSR0aGlzLT5icm93c2VfZm9sZGVyKCRwYXRoKTsNCgkgcmV0dXJuICRodG1sOw0KIH0NCiAjIyMgdmlldyBmaWxlcyZmb2xkZXJzIHZpYSBwYXRoDQogZnVuY3Rpb24gYnJvd3NlX2ZvbGRlcigkcGF0aCkNCiB7DQogJGh0bWw9Jyc7DQogDQogaWYoc3Vic3RyKCRwYXRoLHN0cmxlbigkcGF0aCktMSkhPScvJykkcGF0aC49Ii8iOw0KICRsaXN0PWdsb2IoJHBhdGguIioiKTsNCiAkaHRtbC49JzxkaXYgY2xhc3M9ImxlZnQiPjxwPjxpPjxhIGhyZWY9Ij9xPW5ld19hZ2VudCZkaXI9Jy5zdWJzdHIoJHBhdGgsMCxzdHJycG9zKCRwYXRoLCIvIikpLiciIGNsYXNzPSJzdGF0dXNfaW5saW5lIGdyZWVuIj5VUCB0byAnLnN1YnN0cigkcGF0aCwwLHN0cnJwb3MoJHBhdGgsIi8iKSkuJzwvYT4mbmJzcDsNCiA8YSBocmVmPSI/cT1uZXdfYWdlbnQmZGlyPScuJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4nIiAgY2xhc3M9InN0YXR1c19pbmxpbmUgcmVkIj5CYWNrIHRvIERPQ1VNRU5UX1JPT1QgJy4kX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddLic8L2E+PC9pPjwvcD4nOw0KICRodG1sLj0nPHVsIHN0eWxlPWxpc3Qtc3R5bGU6bm9uZTsiIj4nOw0KCSBmb3JlYWNoKCRsaXN0IGFzICRsKQ0KCSB7DQoJICRodG1sLj0nPGxpPicuKGlzX2ZpbGUoJGwpPyR0aGlzLT5kcmF3X2ZpbGU0YnJvd3NlKCc/cT1uZXdfYWdlbnQmcGF0Y2g9Jy4kbC4nJmRpcj0nLigoaXNzZXQoJF9HRVRbJ2RpciddKSk/JF9HRVRbJ2RpciddOiIiKSwnP3E9bmV3X2FnZW50JnVucGF0Y2g9Jy4kbC4nJmRpcj0nLigoaXNzZXQoJF9HRVRbJ2RpciddKSk/JF9HRVRbJ2RpciddOiIiKSwkbCk6JHRoaXMtPmRyYXdfZm9sZGVyNGJyb3dzZSgnP3E9bmV3X2FnZW50JmRpcj0nLiRsLCRsKSkuJzwvbGk+JzsNCgkgfQ0KICRodG1sLj0nPC91bD48L2Rpdj4nOw0KIHJldHVybiAkaHRtbDsNCiB9DQogDQogIyMjIERyYXcgZmlsZS1saW5rIGZvciBicm93c2UgZmlsZXN5c3RlbSAgIyMjDQogZnVuY3Rpb24gZHJhd19maWxlNGJyb3dzZSgkdXJsLCR1cmxfdW5wYXRjaCwkdGV4dCkNCiB7DQoJIGlmKGZpbGVfZXhpc3RzKCJiYWNrdXBzLyIudXJsZW5jb2RlKCR0ZXh0KSkpDQoJIHsNCgkgIGlmKCR0aGlzLT5jaGtfYWdlbnRfY29kZSgkdGV4dCkpDQoJICB7DQoJICAgICRvYmplY3Q9JHRoaXMtPmRiLT5ST1dfUSgiU0VMRUNUICogRlJPTSBwd3NtX29iamVjdHMgV0hFUkUgb2JqZWN0X3NvdXJjZT0nIi4kdGhpcy0+ZGItPlEoJHRleHQpLiInIik7DQoJICAgIGlmKCRvYmplY3RbJ2lkJ10pJGh0bWw9JyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxhIGhyZWY9Ij9xPXZpZXdfZmlsZSZpZD0nLiRvYmplY3RbJ2lkJ10uJyIgc3R5bGU9ImNvbG9yOicuKHN0cnN0cigkdGV4dCwiaW5kZXgucGhwIik/J21hcm9vbic6KHN0cnN0cigkdGV4dCwiLnBocCIpPydtYXJvb24nOidicm93bicpKS4nIj4nLiR0ZXh0Lic8L2E+PHNwYW4gc3R5bGU9ImNvbG9yOnJlZDtmb250LXdlaWdodDpib2xkOyI+UGF0Y2hlZDwvc3Bhbj4nOw0KCSAgICBlbHNlICRodG1sPScmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSJqYXZhc2NyaXB0Oi8vIiBvbkNsaWNrPSJzaG93X2luZm8oZSxcJ3dhaVwnLFwnJy51cmxlbmNvZGUoJHRleHQpLid8Jy51cmxlbmNvZGUoJHVybF91bnBhdGNoKS4nXCcpIiBzdHlsZT0iY29sb3I6Jy4oc3Ryc3RyKCR0ZXh0LCJpbmRleC5waHAiKT8nbWFyb29uJzooc3Ryc3RyKCR0ZXh0LCIucGhwIik/J21hcm9vbic6J2Jyb3duJykpLiciPicuJHRleHQuJzwvYT48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW47Zm9udC13ZWlnaHQ6Ym9sZDsiPldhaXRpbmcgYWdlbnQgaW5pdGlsaXNhdGlvbjwvc3Bhbj4nOw0KCSAgIA0KCSAgfWVsc2UNCgkgIHsNCgkgICRodG1sPScmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8YSBocmVmPSInLiR1cmwuJyIgY2xhc3M9ImZpbGVfbGluayIgc3R5bGU9ImNvbG9yOicuKHN0cnN0cigkdGV4dCwiaW5kZXgucGhwIik/J3JlZCc6KHN0cnN0cigkdGV4dCwiLnBocCIpPydkYXJrZ3JlZW4nOidkaW1ncmF5JykpLiciPicuJHRleHQuJzwvYT48c3BhbiBzdHlsZT0iY29sb3I6cmVkO2ZvbnQtd2VpZ2h0OmJvbGQ7Ij5CYWNrdXAgZXhpc3RzLGJ1dCBjb2RlIG5vdCBmb3VuZCE8L3NwYW4+JzsgDQoJICANCgkgIH0NCgkgDQoJIH1lbHNlew0KCSAkaHRtbD0nJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PGEgaHJlZj0iJy4kdXJsLiciIGNsYXNzPSJmaWxlX2xpbmsiIHN0eWxlPSJjb2xvcjonLihzdHJzdHIoJHRleHQsImluZGV4LnBocCIpPydyZWQnOihzdHJzdHIoJHRleHQsIi5waHAiKT8nZGFya2dyZWVuJzonZGltZ3JheScpKS4nIj4nLiR0ZXh0Lic8L2E+JzsNCgkgfQ0KDQoJIHJldHVybiAkaHRtbDsNCgkgfQ0KICMjIyBEcmF3IGZvbGRlci1saW5rIGZvciBicm93c2UgZmlsZXN5c3RlbSAgIyMjDQogZnVuY3Rpb24gZHJhd19mb2xkZXI0YnJvd3NlKCR1cmwsJHRleHQpDQogew0KIHJldHVybiAnPGEgaHJlZj0iJy4kdXJsLiciIGNsYXNzPSJmb2xkZXJfbGluayI+PGltZyBzcmM9ImltZy9mb2xkZXIuZ2lmIj4mbmJzcDsnLiR0ZXh0Lic8L2E+JzsNCiB9DQogIyMjIGNoZWtpbmcgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgIyMjDQogZnVuY3Rpb24gd2lzYXJkX3BhdGNoX2ZpbGUoJGZpbGVuYW1lKQ0KIHsNCgkgaWYoZmlsZXNpemUoJGZpbGVuYW1lKT4yMDAwMDApcmV0dXJuICR0aGlzLT5zdG9wX3BhdGNoKCJGaWxlIGlzIHRvbyBsYXJnZSwgaW1wb3JzdGFibGUgdG8gcGF0Y2giKTsNCgkgaWYoIWlzX3dyaXRhYmxlKCRmaWxlbmFtZSkpcmV0dXJuICR0aGlzLT5zdG9wX3BhdGNoKCJDaGVjayBwZXJtaXNzaW9uIGZvciBmaWxlIHdyaXRpbmcsIGltcG9yc3RhYmxlIHRvIHBhdGNoIik7DQoJIGlmKCEkdGhpcy0+Y2hrX3BocF9maWxlKCRmaWxlbmFtZSkpcmV0dXJuICR0aGlzLT5zdG9wX3BhdGNoKCJJcyBub3QgcGhwIGZpbGUsIGltcG9yc3RhYmxlIHRvIHBhdGNoIik7DQoNCgkgJGJhY2t1cGZpbGU9dXJsZW5jb2RlKCRmaWxlbmFtZSk7DQoJIGlmKGZpbGVfZXhpc3RzKCRiYWNrdXBmaWxlKSlyZXR1cm4gJHRoaXMtPnN0b3BfcGF0Y2goIkJhY2t1cCBmaWxlICIuJGJhY2t1cGZpbGUuIiBhbHJlYWR5IGV4aXN0cywgY2Fubm90IGNvbnRpbnVlIGJhY2t1cCIpOw0KCSAjaWYoZmlsZV9leGlzdHMoImJhY2t1cHMvIi4kYmFja3VwZmlsZSkpcmV0dXJuICR0aGlzLT5zdG9wX3BhdGNoKCJGaWxlIGFscmVhZHkgcGF0Y2hlZCwgaW1wb3JzdGFibGUgdG8gcGF0Y2giKTsNCgkgaWYoISR0aGlzLT5iYWNrdXBmaWxlKCRmaWxlbmFtZSkpcmV0dXJuICR0aGlzLT5zdG9wX3BhdGNoKCJDYW5ub3QgYmFja3VwIGZpbGVtICxjaGVjayBwZXJtaXNzaW9ucyBvZiBiYWNrdXAvIGRpcmVjdG9yeSwgaW1wb3JzdGFibGUgdG8gcGF0Y2giKTsNCg0KICAgICBpZigkdGhpcy0+Y2hrX2FnZW50X2NvZGUoJGZpbGVuYW1lKSkgcmV0dXJuICR0aGlzLT5zdG9wX3BhdGNoKCJDYW5ub3QgcGF0Y2gsY29kZSBhbHJlYWR5IGluamVjdGVkIik7DQoNCiAgICAgZWxzZWlmKCR0aGlzLT5wYXRjaF90YXJnZXQoJGZpbGVuYW1lKSkNCgkgew0KDQoJIGhlYWRlcignTG9jYXRpb246P3E9YWdlbnRzX2xpc3QmbmV3X2FnZW50PScudXJsZW5jb2RlKCRmaWxlbmFtZSkpOw0KCSB9ZWxzZSByZXR1cm4gJHRoaXMtPnN0b3BfcGF0Y2goIkNhbm5vdCBwYXRjaCxjaGVjayBwZXJtaXNzaW9ucyIpOw0KIH0NCiAjIyMgZGlzYWJsZSBhZ2VudCBjb2RlIGFuZCByZXN0b3JlIG9yaWdpbmFsIChmb3IgbWlzdGFrZXMpIyMjDQogZnVuY3Rpb24gd2lzYXJkX3VucGF0Y2hfZmlsZSgkZmlsZW5hbWUpDQogew0KICAgIGlmKCEkdGhpcy0+Y2hrX2FnZW50X2NvZGUoJGZpbGVuYW1lKSlyZXR1cm4gJHRoaXMtPnN0b3BfcGF0Y2goIkFnZW50IGNvZGUgbm90IGV4aXN0cyBpbiB0aGUgZmlsZTo8Yj4iLiRmaWxlbmFtZS4iPC9iPiwgaW1wb3JzdGFibGUgdW5wYXRjaCIpOw0KICAgICRiYWNrdXBmaWxlPSJiYWNrdXBzLyIudXJsZW5jb2RlKCRmaWxlbmFtZSk7DQogICAgaWYoIWZpbGVfZXhpc3RzKCRiYWNrdXBmaWxlKSlyZXR1cm4gJHRoaXMtPnN0b3BfcGF0Y2goIkJhY2t1cCBmaWxlICIuJGJhY2t1cGZpbGUuIiBkb2VzbnQgZXhpc3RzLCBpbXBvcnN0YWJsZSByZXR1cm4gb3JpZ2luYWwgZmlsZSIpOw0KDQogICAgaWYoJHRoaXMtPnJlc3RvcmVfb3JpZ2luYWwoJGZpbGVuYW1lKSkNCgkgew0KDQogICAgIHVubGluaygkYmFja3VwZmlsZSk7DQogICAgIHJldHVybiAiVW5QYXRjaGVkIjsNCgkgI2hlYWRlcignTG9jYXRpb246P3E9YWdlbnRzX2xpc3QmbmV3X2FnZW50PScudXJsZW5jb2RlKCRmaWxlbmFtZSkpOw0KCSB9ZWxzZSByZXR1cm4gJHRoaXMtPnN0b3BfcGF0Y2goIkNhbm5vdCB1bnBhdGNoLGNoZWNrIHBlcm1pc3Npb25zIik7DQogfQ0KICMjIyBjaGVraW5nIGlmIGNvZGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGZpbGUgIyMjDQogZnVuY3Rpb24gY2hrX2FnZW50X2NvZGUoJGZpbGVuYW1lKQ0KIHsNCgkgJGNvbnRlbnQ9ZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsNCgkgJGFnZW50X2NvZGU9JHRoaXMtPmluc2VydF9hZ2VudF9jYWxsKCk7DQoJIGlmKHN1YnN0cigkY29udGVudCwwLHN0cmxlbigkYWdlbnRfY29kZSkpPT0kYWdlbnRfY29kZSkNCgkgew0KCSAJIyR0aGlzLT5zdG9wX3BhdGNoKCJDYW5ub3QgcGF0Y2gsY29kZSBhbHJlYWR5IGluamVjdGVkIik7DQoJIAlyZXR1cm4gdHJ1ZTsNCgkgfWVsc2UgcmV0dXJuIGZhbHNlOw0KIH0NCiAjIyMgcGF0Y2hpbmcgZmlsZSAjIyMNCiBmdW5jdGlvbiBwYXRjaF90YXJnZXQoJGZpbGVuYW1lKQ0KIHsNCgkgJGNvbnRlbnQ9ZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsNCgkgJGFnZW50X2NvZGU9JHRoaXMtPmluc2VydF9hZ2VudF9jYWxsKCk7DQoJICRuZXdfY29udGVudD0kYWdlbnRfY29kZS4kY29udGVudDsNCgkgcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlbmFtZSwkbmV3X2NvbnRlbnQpOw0KIH0NCiAjIyMgcmV0dXJuIHBocCBjb2RlIG9mIGFic29sdXRlIGFnZW50IGNhbGxpbmcgIyMjDQogZnVuY3Rpb24gaW5zZXJ0X2FnZW50X2NhbGwoKQ0KIHsNCiAjcHJpbnQgIjxwcmU+IjsNCiAgJGFnZW50X3BhdGg9c3Vic3RyKCRfU0VSVkVSWydTQ1JJUFRfRklMRU5BTUUnXSwwLHN0cnJwb3MoJF9TRVJWRVJbJ1NDUklQVF9GSUxFTkFNRSddLCIvIikrMSkuImFnZW50LnBocCI7DQogIHJldHVybiAiPD9waHAgQGluY2x1ZGVfb25jZSAnIi4kYWdlbnRfcGF0aC4iJzs/PiI7DQogfQ0KIyMjIyByZXR1cm4gcGF0Y2hpbmcgZXJyb3IgdGV4dCAjIyMNCiBmdW5jdGlvbiBzdG9wX3BhdGNoKCRyZWFzb24pDQogew0KIAlyZXR1cm4gIjxmb250IGNvbG9yPSdyZWQnPlBhdGNoaW5nIHN0b3BwZWQuPGJyPiIuJHJlYXNvbi4iPC9mb250PiI7DQogfQ0KICMjIyBjaGVja2luZyBpZiBwaHAgZmlsZSAjIyMNCiBmdW5jdGlvbiBjaGtfcGhwX2ZpbGUoJGZpbGVuYW1lKQ0KIHsNCg0KCSRjb250ZW50PUBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpOw0KDQogICAgaWYoc3Ryc3RyKCRjb250ZW50LCI8PyIpfHxzdHJzdHIoJGNvbnRlbnQsIjw/cGhwIikpe3JldHVybiB0cnVlO30NCiAgICBlbHNlIGZhbHNlOw0KIH0NCiAjIyMgY3JlYXRlIGJhY2t1cCBmaWxlIGZyb20gb3JpZ2luYWwgc291cmNlICMjIw0KIGZ1bmN0aW9uIGJhY2t1cGZpbGUoJGZpbGVuYW1lKQ0KIHsNCgkgJGJhY2t1cGZpbGU9dXJsZW5jb2RlKCRmaWxlbmFtZSk7DQoNCgkgJGY9Zm9wZW4oImJhY2t1cHMvIi4kYmFja3VwZmlsZSwidyIpOw0KCSBmd3JpdGUoJGYsZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKSk7DQoJIGZjbG9zZSgkZik7DQoJIHJldHVybiB0cnVlOw0KIH0NCiAjIyMgZHJhdyB0ZW1wbGF0ZXMgbGlzdCAjIyMNCiBmdW5jdGlvbiB0YmxfdGVtcGxhdGVzX2xpc3QoKQ0KIHsNCiAkZGI9JHRoaXMtPmRiOw0KDQoJICRodG1sPScnOw0KCSBpZighaXNzZXQoJF9HRVRbJ2FjdCddKSkkX0dFVFsnYWN0J109bnVsbDsNCgkgc3dpdGNoKCRfR0VUWydhY3QnXSkNCgkgew0KCSBjYXNlICduZXdfdGVtcGxhdGUnOg0KCSAgJGh0bWwuPSR0aGlzLT5fbmV3X3RlbXBsYXRlX2Zvcm0oKTsNCgkgYnJlYWs7DQoJIGNhc2UgJ25ld194bWxfbG9hZCc6DQoJICAkaHRtbC49JHRoaXMtPl9uZXdfeG1sX2xvYWRfZm9ybSgpOw0KCSBicmVhazsNCgkgY2FzZSAnZXhwb3J0X3htbCc6DQoJIGlmKCR0aGlzLT5sdSkJJGh0bWwuPSR0aGlzLT5leHBvcnRfeG1sX2Zvcm0oKTsNCgkgYnJlYWs7DQoJIGRlZmF1bHQ6DQoJICRodG1sLj0nPGRpdiBjbGFzcz0ibmV3X2RpdiI+PGEgaHJlZj0iP3E9Y29uZmlnJmFjdD1uZXdfdGVtcGxhdGUiIGNsYXNzPSJuZXdfYnRuIj5OZXcgU2VjdXJpdHkgUGF0dGVybjwvYT4mbmJzcDsNCgkgPGEgaHJlZj0iP3E9Y29uZmlnJmFjdD1uZXdfeG1sX2xvYWQiIGNsYXNzPSJuZXdfYnRuIj5Mb2FkIFNlY3VyaXR5IHBhdHRlcm5zIGZyb20gWE1MIFVybDwvYT4NCgkgPGEgaHJlZj0iP3E9Y29uZmlnJmFjdD1leHBvcnRfeG1sIiBjbGFzcz0ibmV3X2J0biI+RXhwb3J0IFhNTCBmaWxlPC9hPg0KCSA8L2Rpdj4nOw0KCSB9DQoJICAkaHRtbC49JHRoaXMtPl90ZW1wbGF0ZXNfbGlzdCgpOw0KCSAgcmV0dXJuICRodG1sOw0KIH0NCiBmdW5jdGlvbiBleHBvcnRfeG1sX2Zvcm0oKQ0KIHsNCiAgJHRlbXBsYXRlcz0kdGhpcy0+ZGItPkxJU1RfUSgiU0VMRUNUICogRlJPTSBwd3NtX3RlbXBsYXRlcyBPUkRFUiBCWSBuYW1lIik7DQogICR4bWw9Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCjwhLS0gRWRpdGVkIGJ5ICcuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uJyAtLT4NCjxwYXR0ZXJucz4nOw0KZm9yZWFjaCgkdGVtcGxhdGVzIGFzICR0ZW1wbGF0ZSkNCgl7DQogICAgJHhtbC49JzxwYXR0ZXJuPg0KCTxuYW1lPicuJHRlbXBsYXRlWyduYW1lJ10uJzwvbmFtZT4NCgk8Y29kZT48IVtDREFUQVsnLiR0ZW1wbGF0ZVsnY29kZSddLiddXT48L2NvZGU+DQoJPHByb3RvY29sPicuJHRlbXBsYXRlWydwcm90b2NvbCddLic8L3Byb3RvY29sPg0KCTxkZXNjcmlwdGlvbj4nLiR0ZW1wbGF0ZVsnZGVzY3JpcHRpb24nXS4nPC9kZXNjcmlwdGlvbj4NCgk8cmVnX2RhdGU+Jy5kYXRlKCJZLW0tZCBIOmk6cyIsJHRlbXBsYXRlWydyZWdfZGF0ZSddKS4nPC9yZWdfZGF0ZT4NCgk8YXV0aG9yPicuJHRlbXBsYXRlWydhdXRob3InXS4nPC9hdXRob3I+DQo8L3BhdHRlcm4+JzsNCgl9DQokeG1sLj0nPC9wYXR0ZXJucz4nOw0KaGVhZGVyICgiQ29udGVudC1UeXBlOnRleHQveG1sIik7DQpoZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPScuYmFzZW5hbWUoJ3BhdHRlcm5zLnhtbCcpKTsNCnByaW50ICR4bWw7DQpleGl0KCk7DQogfQ0KIGZ1bmN0aW9uIF9pbnNlcnRfdGVtcGxhdGUoKQ0KIHsNCgkNCgkkcmVnX2RhdGU9KGVtcHR5KCRfUE9TVFsncmVnX2RhdGUnXSk/dGltZSgpOnN0cnRvdGltZSgkX1BPU1RbJ3JlZ19kYXRlJ10pKTsNCgkkc3FsPSJJTlNFUlQgSU5UTyBwd3NtX3RlbXBsYXRlcyhuYW1lLHByb3RvY29sLGNvZGUsZGVzY3JpcHRpb24scmVnX2RhdGUsYXV0aG9yKSBWQUxVRVMgKCciLiR0aGlzLT5kYi0+USgkX1BPU1RbJ25hbWUnXSwxKS4iJywnIi4kdGhpcy0+ZGItPlEoJF9QT1NUWydwcm90b2NvbCddLDEpLiInLCciLiR0aGlzLT5kYi0+USgkX1BPU1RbJ2NvZGUnXSwxKS4iJywnIi4kdGhpcy0+ZGItPlEoJF9QT1NUWydkZXNjcmlwdGlvbiddLDEpLiInLCIuJHRoaXMtPmRiLT5RKCRyZWdfZGF0ZSkuIiwnIi4kdGhpcy0+ZGItPlEoJF9QT1NUWydhdXRob3InXSwxKS4iJykiOw0KCQ0KCSRyZXo9JHRoaXMtPmRiLT5RVUVSWSgkc3FsKTsNCglyZXR1cm4gJHJlej8nPGRpdj5UZW1wbGF0ZSA8Yj48Zm9udCBjb2xvcj0iYmx1ZSI+Jy4kX1BPU1RbJ25hbWUnXS4iPC9mb250PjwvYj4gY3JlYXRlZDwvZGl2PiI6IjxkaXY+U29tZXRoaW5nIHdyb25nITwvZGl2PiI7DQogfQ0KIGZ1bmN0aW9uIF91cGRhdGVfdGVtcGxhdGUoKQ0KIHsNCiAgJHJlej0kdGhpcy0+ZGItPlFVRVJZKCJVUERBVEUgcHdzbV90ZW1wbGF0ZXMgU0VUIG5hbWU9JyIuJHRoaXMtPmRiLT5RKCRfUE9TVFsnbmFtZSddLDEpLiInLA0KCSAgCQkJCQkJCQkJCXByb3RvY29sPSciLiR0aGlzLT5kYi0+USgkX1BPU1RbJ3Byb3RvY29sJ10sMSkuIicsDQoJICAJCQkJCQkJCQkJY29kZT0nIi4kdGhpcy0+ZGItPlEoJF9QT1NUWydjb2RlJ10sMSkuIicsDQoJICAJCQkJCQkJCQkJZGVzY3JpcHRpb249JyIuJHRoaXMtPmRiLT5RKCRfUE9TVFsnZGVzY3JpcHRpb24nXSwxKS4iJywNCgkgIAkJCQkJCQkJCQlyZWdfZGF0ZT0nIi4kdGhpcy0+ZGItPlEoc3RydG90aW1lKCRfUE9TVFsncmVnX2RhdGUnXSksMSkuIicsDQoJICAJCQkJCQkJCQkJYXV0aG9yPSciLiR0aGlzLT5kYi0+USgkX1BPU1RbJ2F1dGhvciddLDEpLiInIFdIRVJFIGlkPSIuJHRoaXMtPmRiLT5RKCRfUE9TVFsnaWQnXSkpOw0KICByZXR1cm4gJHJlej8nPGRpdj5UZW1wbGF0ZSA8Yj48Zm9udCBjb2xvcj0iYmx1ZSI+Jy4kX1BPU1RbJ25hbWUnXS4iPC9mb250PjwvYj4gc2F2ZWQ8L2Rpdj4iOiI8ZGl2PlNvbWV0aGluZyB3cm9uZzwvZGl2PiI7DQogfQ0KIGZ1bmN0aW9uIF9kZWxldGVfdGVtcGxhdGUoKQ0KIHsNCiAgJHJlej0kdGhpcy0+ZGItPlFVRVJZKCJERUxFVEUgRlJPTSBwd3NtX3RlbXBsYXRlcyBXSEVSRSBpZD0iLiR0aGlzLT5kYi0+USgkX1BPU1RbJ2lkJ10pKTsNCiAgJHRoaXMtPmRiLT5RVUVSWSgiREVMRVRFIEZST00gcHdzbV90ZW1wbGF0ZXNfb2JqZWN0cyBXSEVSRSB0ZW1wbGF0ZV9pZD0iLiR0aGlzLT5kYi0+USgkX1BPU1RbJ2lkJ10pKTsNCiAgcmV0dXJuICRyZXo/JzxkaXY+VGVtcGxhdGUgPGI+PGZvbnQgY29sb3I9ImJsdWUiPicuJF9QT1NUWyduYW1lJ10uIjwvZm9udD48L2I+IGRlbGV0ZWQ8L2Rpdj4iOiI8ZGl2PlNvbWV0aGluZyB3cm9uZyE8L2Rpdj4iOw0KIH0NCiBmdW5jdGlvbiBfbmV3X3RlbXBsYXRlX2Zvcm0oKQ0KIHsNCiAkaHRtbD0nJzsNCg0KICAgaWYoaXNzZXQoJF9QT1NUWyduYW1lJ10pKQ0KCSB7DQoNCgkgc3dpdGNoKCRfUE9TVFsnb3AnXSkNCgkgCXsNCgkgCQljYXNlICdzYXZlJzoNCgkgCQlpZighJHRoaXMtPmx1KQ0KCSAJCXsNCgkgCQkkX1NFU1NJT05bJ2Vycm9yJ10JPSc8ZGl2IGNsYXNzPSJlcnJvciI+SW1wb3JzdGFibGUgdG8gc2F2ZSB0ZW1wbGF0ZXMgaW4gRGVtbyB2ZXJzaW9uPC9kaXY+JzsNCgkgCQl9ZWxzZWlmKCEkdGhpcy0+Y2hrX2R1YmxpY2F0ZV90ZW1wbGF0ZSgoaXNzZXQoJF9QT1NUWydpZCddKT8kX1BPU1RbJ2lkJ106IiIpLCRfUE9TVFsnY29kZSddLCRfUE9TVFsncHJvdG9jb2wnXSkpDQoJIAkJew0KCSAJCWlmKGlzc2V0KCRfUE9TVFsnaWQnXSkpDQoJCQkgew0KDQoJCQkgICRodG1sLj0kdGhpcy0+X3VwZGF0ZV90ZW1wbGF0ZSgpOw0KCQkJIH1lbHNlew0KCQkJIA0KCQkJICAkaHRtbC49JHRoaXMtPl9pbnNlcnRfdGVtcGxhdGUoKTsNCgkJCSB9DQoJCQl9ZWxzZXsNCgkJCSRfU0VTU0lPTlsnZXJyb3InXQk9JzxkaXYgY2xhc3M9ImVycm9yIj5JbXBvcnN0YWJsZSB0byBzYXZlIHRlbXBsYXRlIGR1YmxpY2F0ZWQ8L2Rpdj4nOw0KCQkJfQ0KCQkJaGVhZGVyKCJMb2NhdGlvbjo/cT1jb25maWciKTsNCgkJCWV4aXQoKTsNCgkgCQlicmVhazsNCgkgCQljYXNlICdkZWxldGUnOg0KCSAJCWlmKCEkdGhpcy0+bHUpDQoJIAkJew0KCSAJCSRfU0VTU0lPTlsnZXJyb3InXQk9JzxkaXYgY2xhc3M9ImVycm9yIj5JbXBvcnN0YWJsZSB0byBzYXZlIHRlbXBsYXRlcyBpbiBEZW1vIHZlcnNpb248L2Rpdj4nOw0KCSAJCX1lbHNlew0KCQkJJGh0bWwuPSR0aGlzLT5fZGVsZXRlX3RlbXBsYXRlKCk7DQoJCQl9DQoJICAJCWhlYWRlcigiTG9jYXRpb246P3E9Y29uZmlnIik7DQoJICAJCWV4aXQoKTsNCgkgCQlicmVhazsNCgkgCQljYXNlICdjYW5jZWwnOg0KCSAJCWhlYWRlcigiTG9jYXRpb246P3E9Y29uZmlnIik7DQoJIAkJZXhpdCgpOw0KCSAJCWJyZWFrOw0KCSAJfQ0KDQoNCiAgICAgfQ0KICAgIGlmKGlzc2V0KCRfR0VUWydpZCddKSkNCiAgIHsNCiAgIAkkdGVtcD0kdGhpcy0+ZGItPlJPV19RKCJTRUxFQ1QgKiBGUk9NIHB3c21fdGVtcGxhdGVzIFdIRVJFIGlkPSIuJHRoaXMtPmRiLT5RKCRfR0VUWydpZCddLDApKTsNCiAgIAkkdGl0bGU9IkVkaXQgU2VjdXJpdHkgcGF0dGVybiAiLiR0ZW1wWyduYW1lJ10uIiwgZm9yIHlvdXIgcmlzayBhbmQgZ2FyYW50eSI7DQogICB9ZWxzZXsNCiAgICR0aXRsZT0iQ3JlYXRlIG5ldyBzZWN1cml0eSBwYXR0ZXJuIGJ5IHlvdXIgc2VsZiBhbmQgc2hhcmUgd2l0aCBmcmVuZHMiOw0KICAgfQ0KICAgJHByb3RvY29scz1hcnJheSgnR0VUJywnUE9TVCcsJ0NPT0tJRScpOw0KIAkkaHRtbC49Jzxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIG5hbWU9InBhdHRlcm5fZm9ybSIgc3R5bGU9Im1hcmdpbjowcHg7Ij4NCiAJPHRhYmxlIGNsYXNzPSJ0YmxfZm9ybSI+DQogCTx0cj48dGQgY29sc3Bhbj0yPjxoNT4nLiR0aXRsZS4nPC9oNT48L3RkPjwvdHI+DQogCTx0cj48dGg+TmFtZTwvdGg+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuYW1lIiB2YWx1ZT0iJy4oaXNzZXQoJHRlbXBbJ25hbWUnXSk/JHRlbXBbJ25hbWUnXTonJykuJyI+PC90ZD48L3RyPg0KIAk8dHI+PHRoPlByb3RvY29sPC90aD48dGQ+DQogCTxzZWxlY3QgbmFtZT0icHJvdG9jb2wiPic7DQogCWZvcmVhY2goJHByb3RvY29scyBhcyAkcHJvdG9jb2wpDQogCSRodG1sLj0iPG9wdGlvbiIuKCgoaXNzZXQoJHRlbXBbJ3Byb3RvY29sJ10pKSYmKCR0ZW1wWydwcm90b2NvbCddPT0kcHJvdG9jb2wpKT8nIHNlbGVjdGVkJzonJykuIj4iLiRwcm90b2NvbDsNCiAJJGh0bWwuPSc8L3NlbGVjdD48L3RkPjwvdHI+DQogCTx0cj48dGg+Q29kZTwvdGg+PHRkPjxjb2RlPjx0ZXh0YXJlYSBuYW1lPSJjb2RlIj4nLihpc3NldCgkdGVtcFsnY29kZSddKT8kdGVtcFsnY29kZSddOicnKS4nPC90ZXh0YXJlYT48L2NvZGU+PC90ZD48L3RyPg0KICAgIDx0cj48dGg+RGVzY3JpcHRpb248L3RoPjx0ZD48dGV4dGFyZWEgbmFtZT0iZGVzY3JpcHRpb24iPicuKGlzc2V0KCR0ZW1wWydkZXNjcmlwdGlvbiddKT8kdGVtcFsnZGVzY3JpcHRpb24nXTonJykuJzwvdGV4dGFyZWE+PC90ZD48L3RyPg0KICAgIDx0cj48dGg+UmVnaXN0ZXIgRGF0ZTwvdGg+PHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyZWdfZGF0ZSIgdmFsdWU9IicuKGlzc2V0KCR0ZW1wWydyZWdfZGF0ZSddKT9kYXRlKCJkLW0tWSIsJHRlbXBbJ3JlZ19kYXRlJ10pOicnKS4nIj48L3RkPjwvdHI+DQogICAgPHRyPjx0aD5BdXRob3IoTmFtZSxlbWFpbCk8L3RoPjx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iYXV0aG9yIiB2YWx1ZT0iJy4oaXNzZXQoJHRlbXBbJ2F1dGhvciddKT8kdGVtcFsnYXV0aG9yJ106JycpLiciPjwvdGQ+PC90cj4NCiAJPHRyPjx0ZCBjb2xzcGFuPTI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUiIG5hbWU9Im9wIiBjbGFzcz0iZ3JlZW5fY2wgYnRuIiAgb25DbGljaz0icmV0dXJuIGNoa19wYXR0ZXJuX2Zvcm0oKSI+Jm5ic3A7DQogCScuKGlzc2V0KCRfR0VUWydpZCddKT8nPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9ImRlbGV0ZSIgbmFtZT0ib3AiIG9uQ2xpY2s9ImlmKGNvbmZpcm0oXCdTdXJlIGRlbGV0ZT9cJykpcmV0dXJuIHRydWU7ZWxzZSByZXR1cm4gZmFsc2U7IiAgY2xhc3M9InJlZF9jbCBidG4iPiZuYnNwOyc6JycpDQogCS4nPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9ImNhbmNlbCIgbmFtZT0ib3AiICBjbGFzcz0iZ3JheV9jbCBidG4iPjwvdGQ+PC90cj4NCiAJPC90YWJsZT4nOw0KIAlpZihpc3NldCgkdGVtcFsnaWQnXSkpJGh0bWwuPSc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9IicuJHRlbXBbJ2lkJ10uJyI+JzsNCiAJJGh0bWwuPSc8L2Zvcm0+JzsNCiAJcmV0dXJuICRodG1sOw0KIH0NCiBmdW5jdGlvbiBjaGtfZHVibGljYXRlX3RlbXBsYXRlKCRpZCwkY29kZSwkcHJvdG9jb2wpDQogew0KIAkkc3FsPSJTRUxFQ1QgKiBGUk9NIHB3c21fdGVtcGxhdGVzIFdIRVJFIGNvZGU9JyIuJHRoaXMtPmRiLT5RKCRjb2RlLDEpLiInIEFORCBwcm90b2NvbD0nIi4kdGhpcy0+ZGItPlEoJHByb3RvY29sKS4iJyI7DQogCWlmKCRpZCkkc3FsLj0iIEFORCBpZCE9Ii4kdGhpcy0+ZGItPlEoJGlkKTsNCiAJJHI9JHRoaXMtPmRiLT5RVUVSWSgkc3FsKTsNCiAJcmV0dXJuICR0aGlzLT5kYi0+TlVNX1JPV1MoJHIpOw0KIH0NCiAgZnVuY3Rpb24gX25ld194bWxfbG9hZF9mb3JtKCkNCiB7DQogZ2xvYmFsICRzdGFydDsNCiAgICAkaHRtbD0nJzsNCiAJaWYoaXNzZXQoJF9QT1NUWyd1cmwnXSkpDQogCXsNCgkkeG1sPSRzdGFydC0+cmVxdWVzdCgkX1BPU1RbJ3VybCddKTsNCiAJJGRhdGE9JHRoaXMtPnhtbDJhcnJheSgkeG1sKTsNCgkkX1NFU1NJT05bJ2Vycm9yJ109JHRoaXMtPmxvYWRfcGF0dGVybnMyZGIoJGRhdGEpOw0KCWhlYWRlcigiTG9jYXRpb246P3E9Y29uZmlnIik7DQoJZXhpdCgpOw0KIAl9ZWxzZXsNCiAJDQoJJGh0bWwuPSINCgk8Zm9ybSBhY3Rpb249JycgbWV0aG9kPSdQT1NUJyBuYW1lPSd0aGVmb3JtJyBzdHlsZT0nbWFyZ2luOjBweDsnPg0KICAgIDx0YWJsZSBjbGFzcz0ndGJsX2Zvcm0nPg0KICA8dHI+PHRkIGNvbHNwYW49Mj48aDU+TG9hZGluZyB4bWwgU2VjdXJpdHkgcGF0dGVybnMgdmlhIHVybCBvZiB4bWwgZmlsZTwvaDU+PC90ZD48L3RyPg0KICAgIDx0cj48dGg+SW5wdXQgdmFsaWQgeG1sIHVybDo8L3RoPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgd2lkdGg9JzI1NicgbmFtZT0ndXJsJyBpZD1cInVybFwiIHZhbHVlPSdodHRwOi8vcm9tYW5zaG5lZXIuaW5mby9wd3NtL3BhdHRlcm5zLnhtbCc+DQoJPGlucHV0IHR5cGU9J2hpZGRlbicgaWQ9J2RhdGEnIG5hbWU9J2RhdGEnIHZhbHVlPScnPjwvdGQ+PC90cj4NCgk8dHI+PHRkIGNvbHNwYW49Mj4NCgk8aW5wdXQgdHlwZT0nYnV0dG9uJyBuYW1lPSdvcCcgdmFsdWU9J2xvYWQnIG9uQ2xpY2s9J3N1Ym1pdCgpJyBjbGFzcz0nZ3JlZW5fY2wgYnRuJz4NCgk8aW5wdXQgdHlwZT0nYnV0dG9uJyBuYW1lPSdvcCcgdmFsdWU9J2NhbmNlbCcgb25DbGljaz0nZG9jdW1lbnQubG9jYXRpb249XCI/cT1jb25maWdcIjsnIGNsYXNzPSdncmF5X2NsIGJ0bic+DQoJPC90ZD48L3RyPg0KCTwvdGFibGU+DQoJPC9mb3JtPiI7DQoJfQ0KCXJldHVybiAkaHRtbDsNCiB9DQogZnVuY3Rpb24gbG9hZF9wYXR0ZXJuczJkYigkZGF0YSkNCiB7DQogI3ByaW50ICI8cHJlPiI7DQogJGh0bWw9Jyc7DQogaWYoaXNzZXQoJGRhdGFbJ3BhdHRlcm5zJ11bJ3BhdHRlcm4nXSkpDQogew0KICNkaWUoIjxocj4iKTsNCiAkbmV2ZXI9dHJ1ZTsNCglmb3JlYWNoKCRkYXRhWydwYXR0ZXJucyddWydwYXR0ZXJuJ10gYXMgJHBhdHRlcm4pDQoJew0KCSRzcWw9IlNFTEVDVCBpZCBGUk9NIHB3c21fdGVtcGxhdGVzIFdIRVJFIG5hbWU9JyIuJHRoaXMtPmRiLT5RKCRwYXR0ZXJuWyduYW1lJ10sMSkuIicgQU5EIHByb3RvY29sPSciLiR0aGlzLT5kYi0+USgkcGF0dGVyblsncHJvdG9jb2wnXSkuIicgQU5EIGNvZGU9JyIuJHRoaXMtPmRiLT5RKCRwYXR0ZXJuWydjb2RlJ10pLiInIjsNCgkjcHJpbnQgJHNxbC4iPGhyPiI7DQoJJHRlbXA9JHRoaXMtPmRiLT5ST1dfUSgkc3FsKTsNCgkgICAgaWYoISR0ZW1wKQ0KCSAgICB7DQoJICAgICAkdGhpcy0+ZGItPlFVRVJZKCJJTlNFUlQgSU5UTyBwd3NtX3RlbXBsYXRlcyhuYW1lLHByb3RvY29sLGNvZGUscmVnX2RhdGUsc3RhcnRfZGF0ZSxhdXRob3IsZGVzY3JpcHRpb24pIFZBTFVFUyAoJyIuJHRoaXMtPmRiLT5RKCRwYXR0ZXJuWyduYW1lJ10sMSkuIicsJyIuJHRoaXMtPmRiLT5RKCRwYXR0ZXJuWydwcm90b2NvbCddLDEpLiInLCciLiR0aGlzLT5kYi0+USgkcGF0dGVyblsnY29kZSddLDEpLiInLCciLiR0aGlzLT5kYi0+UShzdHJ0b3RpbWUoJHBhdHRlcm5bJ3JlZ19kYXRlJ10pLDEpLiInLCIudGltZSgpLiIsJyIuJHRoaXMtPmRiLT5RKCRwYXR0ZXJuWydhdXRob3InXSwxKS4iJywnIi4kdGhpcy0+ZGItPlEoJHBhdHRlcm5bJ2Rlc2NyaXB0aW9uJ10sMSkuIicpIik7DQoJICAgICAkaHRtbC49IjxwPjxiPiIuJHBhdHRlcm5bJ25hbWUnXS4iPC9iPiAtICIuJHBhdHRlcm5bJ2Rlc2NyaXB0aW9uJ10uIjwvcD4iOw0KCSAgICAgJG5ldmVyPWZhbHNlOw0KCSAgICB9DQoJfQ0KCQ0KaWYoJG5ldmVyKSRodG1sLj0nPGRpdiBjbGFzcz0iZXJyb3IiPk5ldyB0ZW1wbGF0ZXMgbm90IGV4aXN0cyBpbiB1cGRhdGUuPC9kaXY+JzsNCiBlbHNlICRodG1sPSc8ZGl2IGNsYXNzPSJtZXNzYWdlIj48aDU+TG9hZGVkIG5ldyB0ZW1wbGF0ZXM6PC9oNT4nLiRodG1sLiI8L2Rpdj4iOw0KfWVsc2V7DQoJJGh0bWwuPSc8ZGl2IGNsYXNzPSJlcnJvciI+Tm8gWE1MIEZpbGUgbG9hZGVkISE6PC9kaXY+JzsNCgkgfQ0KCXJldHVybiAkaHRtbDsNCiB9DQoNCmZ1bmN0aW9uIHhtbDJhcnJheSgkY29udGVudHMsICRnZXRfYXR0cmlidXRlcz0xLCAkcHJpb3JpdHkgPSAndGFnJykgew0KICAgIGlmKCEkY29udGVudHMpIHJldHVybiBhcnJheSgpOw0KDQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygneG1sX3BhcnNlcl9jcmVhdGUnKSkgew0KICAgICAgICAvL3ByaW50ICIneG1sX3BhcnNlcl9jcmVhdGUoKScgZnVuY3Rpb24gbm90IGZvdW5kISI7DQogICAgICAgIHJldHVybiBhcnJheSgpOw0KICAgIH0NCg0KICAgIC8vR2V0IHRoZSBYTUwgcGFyc2VyIG9mIFBIUCAtIFBIUCBtdXN0IGhhdmUgdGhpcyBtb2R1bGUgZm9yIHRoZSBwYXJzZXIgdG8gd29yaw0KICAgICRwYXJzZXIgPSB4bWxfcGFyc2VyX2NyZWF0ZSgnJyk7DQogICAgeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCRwYXJzZXIsIFhNTF9PUFRJT05fVEFSR0VUX0VOQ09ESU5HLCAiVVRGLTgiKTsgIyBodHRwOi8vbWludXRpbGxvLmNvbS9zdGV2ZS93ZWJsb2cvMjAwNC82LzE3L3BocC14bWwtYW5kLWNoYXJhY3Rlci1lbmNvZGluZ3MtYS10YWxlLW9mLXNhZG5lc3MtcmFnZS1hbmQtZGF0YS1sb3NzDQogICAgeG1sX3BhcnNlcl9zZXRfb3B0aW9uKCRwYXJzZXIsIFhNTF9PUFRJT05fQ0FTRV9GT0xESU5HLCAwKTsNCiAgICB4bWxfcGFyc2VyX3NldF9vcHRpb24oJHBhcnNlciwgWE1MX09QVElPTl9TS0lQX1dISVRFLCAxKTsNCiAgICB4bWxfcGFyc2VfaW50b19zdHJ1Y3QoJHBhcnNlciwgdHJpbSgkY29udGVudHMpLCAkeG1sX3ZhbHVlcyk7DQogICAgeG1sX3BhcnNlcl9mcmVlKCRwYXJzZXIpOw0KDQogICAgaWYoISR4bWxfdmFsdWVzKSByZXR1cm47Ly9IbW0uLi4NCg0KICAgIC8vSW5pdGlhbGl6YXRpb25zDQogICAgJHhtbF9hcnJheSA9IGFycmF5KCk7DQogICAgJHBhcmVudHMgPSBhcnJheSgpOw0KICAgICRvcGVuZWRfdGFncyA9IGFycmF5KCk7DQogICAgJGFyciA9IGFycmF5KCk7DQoNCiAgICAkY3VycmVudCA9ICYkeG1sX2FycmF5OyAvL1JlZmZlcmVuY2UNCg0KICAgIC8vR28gdGhyb3VnaCB0aGUgdGFncy4NCiAgICAkcmVwZWF0ZWRfdGFnX2luZGV4ID0gYXJyYXkoKTsvL011bHRpcGxlIHRhZ3Mgd2l0aCBzYW1lIG5hbWUgd2lsbCBiZSB0dXJuZWQgaW50byBhbiBhcnJheQ0KICAgIGZvcmVhY2goJHhtbF92YWx1ZXMgYXMgJGRhdGEpIHsNCiAgICAgICAgdW5zZXQoJGF0dHJpYnV0ZXMsJHZhbHVlKTsvL1JlbW92ZSBleGlzdGluZyB2YWx1ZXMsIG9yIHRoZXJlIHdpbGwgYmUgdHJvdWJsZQ0KDQogICAgICAgIC8vVGhpcyBjb21tYW5kIHdpbGwgZXh0cmFjdCB0aGVzZSB2YXJpYWJsZXMgaW50byB0aGUgZm9yZWFjaCBzY29wZQ0KICAgICAgICAvLyB0YWcoc3RyaW5nKSwgdHlwZShzdHJpbmcpLCBsZXZlbChpbnQpLCBhdHRyaWJ1dGVzKGFycmF5KS4NCiAgICAgICAgZXh0cmFjdCgkZGF0YSk7Ly9XZSBjb3VsZCB1c2UgdGhlIGFycmF5IGJ5IGl0c2VsZiwgYnV0IHRoaXMgY29vbGVyLg0KDQogICAgICAgICRyZXN1bHQgPSBhcnJheSgpOw0KICAgICAgICAkYXR0cmlidXRlc19kYXRhID0gYXJyYXkoKTsNCg0KICAgICAgICBpZihpc3NldCgkdmFsdWUpKSB7DQogICAgICAgICAgICBpZigkcHJpb3JpdHkgPT0gJ3RhZycpICRyZXN1bHQgPSAkdmFsdWU7DQogICAgICAgICAgICBlbHNlICRyZXN1bHRbJ3ZhbHVlJ10gPSAkdmFsdWU7IC8vUHV0IHRoZSB2YWx1ZSBpbiBhIGFzc29jIGFycmF5IGlmIHdlIGFyZSBpbiB0aGUgJ0F0dHJpYnV0ZScgbW9kZQ0KICAgICAgICB9DQoNCiAgICAgICAgLy9TZXQgdGhlIGF0dHJpYnV0ZXMgdG9vLg0KICAgICAgICBpZihpc3NldCgkYXR0cmlidXRlcykgYW5kICRnZXRfYXR0cmlidXRlcykgew0KICAgICAgICAgICAgZm9yZWFjaCgkYXR0cmlidXRlcyBhcyAkYXR0ciA9PiAkdmFsKSB7DQogICAgICAgICAgICAgICAgaWYoJHByaW9yaXR5ID09ICd0YWcnKSAkYXR0cmlidXRlc19kYXRhWyRhdHRyXSA9ICR2YWw7DQogICAgICAgICAgICAgICAgZWxzZSAkcmVzdWx0WydhdHRyJ11bJGF0dHJdID0gJHZhbDsgLy9TZXQgYWxsIHRoZSBhdHRyaWJ1dGVzIGluIGEgYXJyYXkgY2FsbGVkICdhdHRyJw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy9TZWUgdGFnIHN0YXR1cyBhbmQgZG8gdGhlIG5lZWRlZC4NCiAgICAgICAgaWYoJHR5cGUgPT0gIm9wZW4iKSB7Ly9UaGUgc3RhcnRpbmcgb2YgdGhlIHRhZyAnPHRhZz4nDQogICAgICAgICAgICAkcGFyZW50WyRsZXZlbC0xXSA9ICYkY3VycmVudDsNCiAgICAgICAgICAgIGlmKCFpc19hcnJheSgkY3VycmVudCkgb3IgKCFpbl9hcnJheSgkdGFnLCBhcnJheV9rZXlzKCRjdXJyZW50KSkpKSB7IC8vSW5zZXJ0IE5ldyB0YWcNCiAgICAgICAgICAgICAgICAkY3VycmVudFskdGFnXSA9ICRyZXN1bHQ7DQogICAgICAgICAgICAgICAgaWYoJGF0dHJpYnV0ZXNfZGF0YSkgJGN1cnJlbnRbJHRhZy4gJ19hdHRyJ10gPSAkYXR0cmlidXRlc19kYXRhOw0KICAgICAgICAgICAgICAgICRyZXBlYXRlZF90YWdfaW5kZXhbJHRhZy4nXycuJGxldmVsXSA9IDE7DQoNCiAgICAgICAgICAgICAgICAkY3VycmVudCA9ICYkY3VycmVudFskdGFnXTsNCg0KICAgICAgICAgICAgfSBlbHNlIHsgLy9UaGVyZSB3YXMgYW5vdGhlciBlbGVtZW50IHdpdGggdGhlIHNhbWUgdGFnIG5hbWUNCg0KICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRjdXJyZW50WyR0YWddWzBdKSkgey8vSWYgdGhlcmUgaXMgYSAwdGggZWxlbWVudCBpdCBpcyBhbHJlYWR5IGFuIGFycmF5DQogICAgICAgICAgICAgICAgICAgICRjdXJyZW50WyR0YWddWyRyZXBlYXRlZF90YWdfaW5kZXhbJHRhZy4nXycuJGxldmVsXV0gPSAkcmVzdWx0Ow0KICAgICAgICAgICAgICAgICAgICAkcmVwZWF0ZWRfdGFnX2luZGV4WyR0YWcuJ18nLiRsZXZlbF0rKzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugey8vVGhpcyBzZWN0aW9uIHdpbGwgbWFrZSB0aGUgdmFsdWUgYW4gYXJyYXkgaWYgbXVsdGlwbGUgdGFncyB3aXRoIHRoZSBzYW1lIG5hbWUgYXBwZWFyIHRvZ2V0aGVyDQogICAgICAgICAgICAgICAgICAgICRjdXJyZW50WyR0YWddID0gYXJyYXkoJGN1cnJlbnRbJHRhZ10sJHJlc3VsdCk7Ly9UaGlzIHdpbGwgY29tYmluZSB0aGUgZXhpc3RpbmcgaXRlbSBhbmQgdGhlIG5ldyBpdGVtIHRvZ2V0aGVyIHRvIG1ha2UgYW4gYXJyYXkNCiAgICAgICAgICAgICAgICAgICAgJHJlcGVhdGVkX3RhZ19pbmRleFskdGFnLidfJy4kbGV2ZWxdID0gMjsNCg0KICAgICAgICAgICAgICAgICAgICBpZihpc3NldCgkY3VycmVudFskdGFnLidfYXR0ciddKSkgeyAvL1RoZSBhdHRyaWJ1dGUgb2YgdGhlIGxhc3QoMHRoKSB0YWcgbXVzdCBiZSBtb3ZlZCBhcyB3ZWxsDQogICAgICAgICAgICAgICAgICAgICAgICAkY3VycmVudFskdGFnXVsnMF9hdHRyJ10gPSAkY3VycmVudFskdGFnLidfYXR0ciddOw0KICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJGN1cnJlbnRbJHRhZy4nX2F0dHInXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAkbGFzdF9pdGVtX2luZGV4ID0gJHJlcGVhdGVkX3RhZ19pbmRleFskdGFnLidfJy4kbGV2ZWxdLTE7DQogICAgICAgICAgICAgICAgJGN1cnJlbnQgPSAmJGN1cnJlbnRbJHRhZ11bJGxhc3RfaXRlbV9pbmRleF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBlbHNlaWYoJHR5cGUgPT0gImNvbXBsZXRlIikgeyAvL1RhZ3MgdGhhdCBlbmRzIGluIDEgbGluZSAnPHRhZyAvPicNCiAgICAgICAgICAgIC8vU2VlIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSB0YWtlbi4NCiAgICAgICAgICAgIGlmKCFpc3NldCgkY3VycmVudFskdGFnXSkpIHsgLy9OZXcgS2V5DQogICAgICAgICAgICAgICAgJGN1cnJlbnRbJHRhZ10gPSAkcmVzdWx0Ow0KICAgICAgICAgICAgICAgICRyZXBlYXRlZF90YWdfaW5kZXhbJHRhZy4nXycuJGxldmVsXSA9IDE7DQogICAgICAgICAgICAgICAgaWYoJHByaW9yaXR5ID09ICd0YWcnIGFuZCAkYXR0cmlidXRlc19kYXRhKSAkY3VycmVudFskdGFnLiAnX2F0dHInXSA9ICRhdHRyaWJ1dGVzX2RhdGE7DQoNCiAgICAgICAgICAgIH0gZWxzZSB7IC8vSWYgdGFrZW4sIHB1dCBhbGwgdGhpbmdzIGluc2lkZSBhIGxpc3QoYXJyYXkpDQogICAgICAgICAgICAgICAgaWYoaXNzZXQoJGN1cnJlbnRbJHRhZ11bMF0pIGFuZCBpc19hcnJheSgkY3VycmVudFskdGFnXSkpIHsvL0lmIGl0IGlzIGFscmVhZHkgYW4gYXJyYXkuLi4NCg0KICAgICAgICAgICAgICAgICAgICAvLyAuLi5wdXNoIHRoZSBuZXcgZWxlbWVudCBpbnRvIHRoYXQgYXJyYXkuDQogICAgICAgICAgICAgICAgICAgICRjdXJyZW50WyR0YWddWyRyZXBlYXRlZF90YWdfaW5kZXhbJHRhZy4nXycuJGxldmVsXV0gPSAkcmVzdWx0Ow0KDQogICAgICAgICAgICAgICAgICAgIGlmKCRwcmlvcml0eSA9PSAndGFnJyBhbmQgJGdldF9hdHRyaWJ1dGVzIGFuZCAkYXR0cmlidXRlc19kYXRhKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkY3VycmVudFskdGFnXVskcmVwZWF0ZWRfdGFnX2luZGV4WyR0YWcuJ18nLiRsZXZlbF0gLiAnX2F0dHInXSA9ICRhdHRyaWJ1dGVzX2RhdGE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHJlcGVhdGVkX3RhZ19pbmRleFskdGFnLidfJy4kbGV2ZWxdKys7DQoNCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvL0lmIGl0IGlzIG5vdCBhbiBhcnJheS4uLg0KICAgICAgICAgICAgICAgICAgICAkY3VycmVudFskdGFnXSA9IGFycmF5KCRjdXJyZW50WyR0YWddLCRyZXN1bHQpOyAvLy4uLk1ha2UgaXQgYW4gYXJyYXkgdXNpbmcgdXNpbmcgdGhlIGV4aXN0aW5nIHZhbHVlIGFuZCB0aGUgbmV3IHZhbHVlDQogICAgICAgICAgICAgICAgICAgICRyZXBlYXRlZF90YWdfaW5kZXhbJHRhZy4nXycuJGxldmVsXSA9IDE7DQogICAgICAgICAgICAgICAgICAgIGlmKCRwcmlvcml0eSA9PSAndGFnJyBhbmQgJGdldF9hdHRyaWJ1dGVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZihpc3NldCgkY3VycmVudFskdGFnLidfYXR0ciddKSkgeyAvL1RoZSBhdHRyaWJ1dGUgb2YgdGhlIGxhc3QoMHRoKSB0YWcgbXVzdCBiZSBtb3ZlZCBhcyB3ZWxsDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3VycmVudFskdGFnXVsnMF9hdHRyJ10gPSAkY3VycmVudFskdGFnLidfYXR0ciddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCRjdXJyZW50WyR0YWcuJ19hdHRyJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZigkYXR0cmlidXRlc19kYXRhKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRbJHRhZ11bJHJlcGVhdGVkX3RhZ19pbmRleFskdGFnLidfJy4kbGV2ZWxdIC4gJ19hdHRyJ10gPSAkYXR0cmlidXRlc19kYXRhOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICRyZXBlYXRlZF90YWdfaW5kZXhbJHRhZy4nXycuJGxldmVsXSsrOyAvLzAgYW5kIDEgaW5kZXggaXMgYWxyZWFkeSB0YWtlbg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9IGVsc2VpZigkdHlwZSA9PSAnY2xvc2UnKSB7IC8vRW5kIG9mIHRhZyAnPC90YWc+Jw0KICAgICAgICAgICAgJGN1cnJlbnQgPSAmJHBhcmVudFskbGV2ZWwtMV07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4oJHhtbF9hcnJheSk7DQp9DQogIA0KIGZ1bmN0aW9uIHVuc2V0X3RlbXBsYXRlX2NhY2hlKCkNCiB7DQogJG1lbWNhY2hlX29iaiA9ICR0aGlzLT5tZW1jYWNoZV9vYmo7DQojZGllKCRtZW1jYWNoZV9vYmouIjxocj4iKTsNCiAgaWYoJG1lbWNhY2hlX29iailtZW1jYWNoZV91bnNldCgkbWVtY2FjaGVfb2JqLCAncHNzX3RlbXBsYXRlcycpOw0KIH0NCiBmdW5jdGlvbiBzYXZlX3RlbXBsYXRlcygkb2JqZWN0KQ0KIHsNCiBpZihjb3VudCgkb2JqZWN0KSkNCiB7DQogJHRoaXMtPmRiLT5RVUVSWSgiREVMRVRFIEZST00gcHdzbV90ZW1wbGF0ZXNfb2JqZWN0cyBXSEVSRSAxPTEiKTsNCiAkdGhpcy0+dW5zZXRfdGVtcGxhdGVfY2FjaGUoKTsNCiBmb3JlYWNoKCRvYmplY3QgYXMgJG9iamVjdF9pZD0+JHRlbXBsYXRlcykNCiAJew0KIAkJZm9yZWFjaCgkdGVtcGxhdGVzIGFzICR0ZW1wbGF0ZV9pZD0+JHZhbHVlKQ0KIAkJew0KIAkJCWlmKCR2YWx1ZT0nb24nKQ0KIAkJCQl7DQoNCiAgICAgIAkJCSR0aGlzLT5kYi0+UVVFUlkoIklOU0VSVCBJTlRPIHB3c21fdGVtcGxhdGVzX29iamVjdHMgKHRlbXBsYXRlX2lkLG9iamVjdF9pZCkgVkFMVUVTICgiLiR0aGlzLT5kYi0+USgkdGVtcGxhdGVfaWQpLiIsIi4kdGhpcy0+ZGItPlEoJG9iamVjdF9pZCkuIikiKTsNCiAJCQkJfQ0KIAkJfQ0KIAl9DQogfQ0KIH0NCiANCiBmdW5jdGlvbiBpbml0X2xpY2Vuc2UoJG51bWJlcikNCiB7DQogZ2xvYmFsICRzdGFydDsNCiANCiAgICAkYW5zd2VyPSRzdGFydC0+cmVxdWVzdCgiaHR0cDovL3JvbWFuc2huZWVyLmluZm8vcHdzbS9jaGsucGhwP2tleT0iLiRudW1iZXIpOw0KICAgIA0KICAgIGlmKCRhbnN3ZXI9PSd0cnVlJykNCiAgICB7DQogICAgJGY9Zm9wZW4oImNvbmYvbGljZW5zZS5waHAiLCJ3Iik7DQogICAgZndyaXRlKCRmLCc8P3BocCAkJy4nbGljZW5zZV9rZXk9IicuJG51bWJlci4nIjsgPz4nKTsNCiAgICBmY2xvc2UoJGYpOw0KICAgICRzdGFydC0+Y3JlYXRlX3RtcF90cnVzdCh0cnVlKTsNCiAgICAkX1NFU1NJT05bJ21zZyddPSc8ZGl2IGNsYXNzPSJtZXNzYWdlIj5Db2RlIEFjY2VwdGVkLFByb2R1Y3QgUmVnaXN0ZXJlZDwvZGl2Pic7DQogICAgaGVhZGVyKCJMb2NhdGlvbjo/cT1hYm91dCIpOw0KICAgIGV4aXQoKTsNCiAgICB9ZWxzZXsNCiAgICANCiAgICAkX1NFU1NJT05bJ2Vycm9yJ109JzxkaXYgY2xhc3M9ImVycm9yIj5Xcm9uZyBjb2RlISEhITwvZGl2Pic7DQogICAgaGVhZGVyKCJMb2NhdGlvbjo/cT1hYm91dCIpOw0KICAgIGV4aXQoKTsNCiAgICB9DQogICAgDQogfQ0KIGZ1bmN0aW9uIGNoYW5nZV9xdWVyeV9yZXF1ZXN0cygpDQogew0KCSBpZihpc3NldCgkX1BPU1RbJ3N0YXR1cyddKSkNCgkgew0KCSAkX1NFU1NJT05bJ2ZpbHRlciddWydzdGF0dXMnXT0kX1BPU1RbJ3N0YXR1cyddOw0KCSB9ZWxzZWlmKCFpc3NldCgkX1NFU1NJT05bJ2ZpbHRlciddWydzdGF0dXMnXSkpJF9TRVNTSU9OWydmaWx0ZXInXVsnc3RhdHVzJ109J2FsbCc7DQoNCiBpZihpc3NldCgkX1BPU1RbJ21ldGhvZCddKSkNCiB7DQogCSRfU0VTU0lPTlsnZmlsdGVyJ11bJ21ldGhvZCddPSRfUE9TVFsnbWV0aG9kJ107DQoNCiB9ZWxzZWlmKCFpc3NldCgkX1NFU1NJT05bJ2ZpbHRlciddWydtZXRob2QnXSkpJF9TRVNTSU9OWydmaWx0ZXInXVsnbWV0aG9kJ109J2FsbCc7DQogIGlmKGlzc2V0KCRfUE9TVFsnc29ydGJ5J10pKQ0KICB7DQogICRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddPSRfUE9TVFsnc29ydGJ5J107DQogIH1lbHNlaWYoIWlzc2V0KCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddKSkkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXT0nY3JlYXRlZFt6YV0nOw0KDQogCSNwcmludF9yKCRfU0VTU0lPTlsnZmlsdGVyJ10pOw0KIH0NCiBmdW5jdGlvbiBnZXRfcmVxdWVzdHMoJGlkKQ0KIHsNCiAJJHdoZXJlPScnOw0KIAkjIHByaW50ICRfU0VTU0lPTlsnZmlsdGVyJ11bJ3N0YXR1cyddLiI8aHI+IjsNCgkgaWYoaXNzZXQoJF9TRVNTSU9OWydmaWx0ZXInXVsnc3RhdHVzJ10pJiYoJF9TRVNTSU9OWydmaWx0ZXInXVsnc3RhdHVzJ10hPSdhbGwnKSkNCgkgew0KDQoJIAkkd2hlcmUuPSIgQU5EIHIuc3RhdHVzPSIuJHRoaXMtPmRiLT5RKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3N0YXR1cyddKTsNCgkgfQ0KICAgICBpZihpc3NldCgkX1NFU1NJT05bJ2ZpbHRlciddWydtZXRob2QnXSkmJigkX1NFU1NJT05bJ2ZpbHRlciddWydtZXRob2QnXSE9J2FsbCcpKQ0KICAgICB7DQogICAgIAkkd2hlcmUuPSIgQU5EIHIubWV0aG9kPSciLiR0aGlzLT5kYi0+USgkX1NFU1NJT05bJ2ZpbHRlciddWydtZXRob2QnXSkuIiciOw0KICAgICB9DQogICAgIGlmKGlzc2V0KCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddKSkNCiAgICAgew0KICAgICAkd2hvPXN1YnN0cigkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSwwLHN0cnBvcygkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSwiWyIpKTsNCiAgICAgJGhvdz1zdWJzdHIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sc3RycG9zKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddLCJbIikrMSxzdHJsZW4oJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10pLXN0cnBvcygkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSwiXSIpKzEpOw0KICAgICAkb3JkZXI9IiBPUkRFUiBCWSByLiIuJHRoaXMtPmRiLT5RKCR3aG8pLigoJGhvdz09J3phJyk/IiBERVNDIjoiIik7DQogICAgICAjZGllKCRob3cuIjxocj4iKTsNCiAgICAgfQ0KICAgICAkc3FsX2NvdW50PSJTRUxFQ1QgY291bnQoaWQpIGFzIG51bSBGUk9NIHB3c21fcmVxdWVzdHMgciBXSEVSRSByLm9iamVjdF9pZD0iLiR0aGlzLT5kYi0+USgkaWQpLiIgIi4kd2hlcmU7DQogICAgICRuPSR0aGlzLT5kYi0+Uk9XX1EoJHNxbF9jb3VudCk7DQogICAgICR0aGlzLT5yZXN1bHRzX2NvdW50PSRuWydudW0nXTsNCiAgICAgJHNxbD0iU0VMRUNUIHIuKix0Lm5hbWUsdC5kZXNjcmlwdGlvbg0KCQlGUk9NIHB3c21fcmVxdWVzdHMgcg0KCQlMRUZUIEpPSU4gcHdzbV90ZW1wbGF0ZXMgdCBPTiB0LmlkPXIudGVtcGxhdGVfaWQNCgkJV0hFUkUgci5vYmplY3RfaWQ9Ii4kdGhpcy0+ZGItPlEoJGlkKS4iICIuJHdoZXJlLiRvcmRlci4iIExJTUlUICIuJHRoaXMtPnJlc3VsdHNfc3RlcDsNCiAgICAgDQoJICRyZXF1ZXN0cz0kdGhpcy0+ZGItPkxJU1RfUSgkc3FsKTsNCgkgcmV0dXJuICRyZXF1ZXN0czsNCiB9DQogZnVuY3Rpb24gZ2V0X3JlcXVlc3RzNHRlbXBsYXRlKCRpZCkNCiB7DQogDQogCSR3aGVyZT0nJzsNCiAJDQoJIGlmKGlzc2V0KCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3N0YXR1cyddKSYmKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3N0YXR1cyddIT0nYWxsJykpDQoJIHsNCg0KCSAJJHdoZXJlLj0iIEFORCByLnN0YXR1cz0iLiR0aGlzLT5kYi0+USgkX1NFU1NJT05bJ2ZpbHRlciddWydzdGF0dXMnXSk7DQoJIH0NCiAgICAgaWYoaXNzZXQoJF9TRVNTSU9OWydmaWx0ZXInXVsnbWV0aG9kJ10pJiYoJF9TRVNTSU9OWydmaWx0ZXInXVsnbWV0aG9kJ10hPSdhbGwnKSkNCiAgICAgew0KICAgICAJJHdoZXJlLj0iIEFORCByLm1ldGhvZD0nIi4kdGhpcy0+ZGItPlEoJF9TRVNTSU9OWydmaWx0ZXInXVsnbWV0aG9kJ10pLiInIjsNCiAgICAgfQ0KICAgICBpZihpc3NldCgkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSkpDQogICAgIHsNCiAgICAgJHdobz1zdWJzdHIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sMCxzdHJwb3MoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sIlsiKSk7DQogICAgICRob3c9c3Vic3RyKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddLHN0cnBvcygkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSwiWyIpKzEsc3RybGVuKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddKS1zdHJwb3MoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sIl0iKSsxKTsNCiAgICAgJG9yZGVyPSIgT1JERVIgQlkgci4iLiR0aGlzLT5kYi0+USgkd2hvKS4oKCRob3c9PSd6YScpPyIgREVTQyI6IiIpOw0KICAgICAgI2RpZSgkaG93LiI8aHI+Iik7DQogICAgIH0NCiAgICAgJHNxbF9jb3VudD0iU0VMRUNUIGNvdW50KGlkKSBhcyBudW0gRlJPTSBwd3NtX3JlcXVlc3RzIHIgV0hFUkUgci50ZW1wbGF0ZV9pZD0iLiR0aGlzLT5kYi0+USgkaWQpLiIgIi4kd2hlcmU7DQogICAgICRuPSR0aGlzLT5kYi0+Uk9XX1EoJHNxbF9jb3VudCk7DQogICAgICR0aGlzLT5yZXN1bHRzX2NvdW50PSRuWydudW0nXTsNCiAgICAgJHNxbD0iU0VMRUNUIHIuKix0Lm5hbWUsdC5kZXNjcmlwdGlvbixvLm9iamVjdF91cmwgDQoJCUZST00gcHdzbV9yZXF1ZXN0cyByDQoJCUxFRlQgSk9JTiBwd3NtX3RlbXBsYXRlcyB0IE9OIHQuaWQ9ci50ZW1wbGF0ZV9pZA0KCQlMRUZUIEpPSU4gcHdzbV9vYmplY3RzIG8gT04gby5pZD1yLm9iamVjdF9pZA0KCQlXSEVSRSByLnRlbXBsYXRlX2lkPSIuJHRoaXMtPmRiLT5RKCRpZCkuIiAiLiR3aGVyZS4kb3JkZXIuIiBMSU1JVCAiLiR0aGlzLT5yZXN1bHRzX3N0ZXA7DQogICAgDQoJICRyZXF1ZXN0cz0kdGhpcy0+ZGItPkxJU1RfUSgkc3FsKTsNCgkgcmV0dXJuICRyZXF1ZXN0czsNCiB9DQogZnVuY3Rpb24gZ2V0X29iamVjdCgkaWQpDQogew0KIAlyZXR1cm4gJHRoaXMtPmRiLT5ST1dfUSgiU0VMRUNUICogRlJPTSBwd3NtX29iamVjdHMgV0hFUkUgaWQ9Ii4kdGhpcy0+ZGItPlEoJGlkKSk7DQogfQ0KIGZ1bmN0aW9uIGdldF90ZW1wbGF0ZSgkaWQpDQogew0KIAlyZXR1cm4gJHRoaXMtPmRiLT5ST1dfUSgiU0VMRUNUICogRlJPTSBwd3NtX3RlbXBsYXRlcyBXSEVSRSBpZD0iLiR0aGlzLT5kYi0+USgkaWQpKTsNCiB9DQogZnVuY3Rpb24gX29iamVjdF90YmwoJG9iamVjdCkNCiB7DQogIyRvYmplY3Q9JHRoaXMtPmdldF9vYmplY3QoJGlkKTsNCiAkdGhpcy0+b2JqZWN0X25hbWU9JG9iamVjdFsnb2JqZWN0X3VybCddOw0KICRvYmplY3RfZm9sZGVyPXN1YnN0cigkb2JqZWN0WydvYmplY3Rfc291cmNlJ10sMCxzdHJycG9zKCRvYmplY3RbJ29iamVjdF9zb3VyY2UnXSwiLyIpKTsNCiAkaHRtbD0nPGRpdiBjbGFzcz0iYm94Ij48dGFibGU+DQogPHRyPjx0ZD5PYmplY3QgU291cmNlOjwvdGQ+PHRkPjxhIGhyZWY9Ij9xPXZpZXdfZmlsZSZpZD0nLiRvYmplY3RbJ2lkJ10uJyIgdGFyZ2V0PV9ibGFuaz4nLiRvYmplY3RbJ29iamVjdF9zb3VyY2UnXS4nPC9hPjwvdGQ+PC90cj4NCiA8dHI+PHRkPk9iamVjdCBEaXJlY3RvcnkgQnJvd3NlOjwvdGQ+PHRkPjxhIGhyZWY9Ij9xPW5ld19hZ2VudCZkaXI9Jy51cmxlbmNvZGUoJG9iamVjdF9mb2xkZXIpLiciPicuJG9iamVjdF9mb2xkZXIuJzwvYT48L3RkPjwvdHI+DQogPHRyPjx0ZD5PYmplY3QgVVJMOjwvdGQ+PHRkPjxhIGhyZWY9IicuJG9iamVjdFsnb2JqZWN0X3VybCddLiciIHRhcmdldD1fYmxhbms+Jy4kb2JqZWN0WydvYmplY3RfdXJsJ10uJzwvYT48L3RkPjwvdHI+DQogPHRyPjx0ZD5SZWdpc3RlciBkYXRlOjwvdGQ+PHRkPicuZGF0ZSgiSDppIGQvbS9ZIiwkb2JqZWN0WydjcmVhdGVkJ10pLic8L3RkPjwvdHI+DQogPHRyPjx0ZCBjb2xzcGFuPTI+PGEgaHJlZj0iP3E9YWdlbnRzX2xpc3QmaWQ9Jy4kb2JqZWN0WydpZCddLiciIGNsYXNzPSJncmVlbl9jbCBidG4iID5TdGF0aXN0aWNzPC9hPjwvdGQ+PC90cj4NCiA8L3RhYmxlPjwvZGl2Pic7DQogcmV0dXJuICRodG1sOw0KIH0NCiBmdW5jdGlvbiBfdGVtcGxhdGVfdGJsKCR0ZW1wbGF0ZSkNCiB7DQogJGh0bWw9Jzx0YWJsZT4NCiA8dHI+PHRkPlRlbXBsYXRlIE5hbWU6PC90ZD48dGQ+Jy4kdGVtcGxhdGVbJ25hbWUnXS4nPC90ZD48L3RyPg0KIDx0cj48dGQ+RGVzY3JpcHRpb246PC90ZD48dGQ+Jy4kdGVtcGxhdGVbJ2Rlc2NyaXB0aW9uJ10uJzwvdGQ+PC90cj4NCiA8dHI+PHRkPlByb3RvY29sOjwvdGQ+PHRkPicuJHRlbXBsYXRlWydwcm90b2NvbCddLic8L3RkPjwvdHI+DQogPHRyPjx0ZD5Db2RlOjwvdGQ+PHRkPicuaHRtbHNwZWNpYWxjaGFycygkdGVtcGxhdGVbJ2NvZGUnXSkuJzwvdGQ+PC90cj4NCiA8dHI+PHRkPlJlZ2lzdGVyIGRhdGU6PC90ZD48dGQ+Jy5kYXRlKCJIOmkgZC9tL1kiLCR0ZW1wbGF0ZVsncmVnX2RhdGUnXSkuJzwvdGQ+PC90cj4NCiA8dHI+PHRkPlN0YXJ0IHVzaW5nIGRhdGU6PC90ZD48dGQ+Jy5kYXRlKCJIOmkgZC9tL1kiLCR0ZW1wbGF0ZVsnc3RhcnRfZGF0ZSddKS4nPC90ZD48L3RyPg0KIDx0cj48dGQ+QXV0aG9yOjwvdGQ+PHRkPicuJHRlbXBsYXRlWydhdXRob3InXS4nPC90ZD48L3RyPg0KIDx0cj48dGQgY29sc3Bhbj0yPjxhIGhyZWY9Ij9xPWNvbmZpZyZhY3Q9bmV3X3RlbXBsYXRlJmlkPScuJHRlbXBsYXRlWydpZCddLiciPkVkaXQgVGVtcGxhdGU8L2E+PC90ZD48L3RyPg0KIDwvdGFibGU+PGJyPic7DQogI2RpZSgkaHRtbCk7DQogcmV0dXJuICRodG1sOw0KIH0NCiANCiBmdW5jdGlvbiByZXF1ZXN0X3N0YXRpc3RpY3MoJGlkKQ0KIHsNCiAgaWYoKGlzc2V0KCRfUE9TVFsnb3AnXSkpJiYoJF9QT1NUWydvcCddPT0nUmVtb3ZlIE9iamVjdCBTdGF0aXN0aWNzJykpDQogew0KICR0aGlzLT5kYi0+UVVFUlkoIkRFTEVURSBGUk9NIHB3c21fcmVxdWVzdHMgV0hFUkUgb2JqZWN0X2lkPSIuJHRoaXMtPmRiLT5RKCRfUE9TVFsnaWQnXSkpOw0KICB9DQoNCiAkdGhpcy0+Y2hhbmdlX3F1ZXJ5X3JlcXVlc3RzKCk7DQoNCiANCiAkcmVxdWVzdHM9JHRoaXMtPmdldF9yZXF1ZXN0cygkaWQpOw0KIA0KICRvYmplY3Q9JHRoaXMtPmdldF9vYmplY3QoJGlkKTsNCiANCiANCiAkb2JqZWN0X3VybD1zdWJzdHIoJG9iamVjdFsnb2JqZWN0X3VybCddLDAsc3RybGVuKCRvYmplY3RbJ29iamVjdF91cmwnXSktMSk7DQogJHU9cGFyc2VfdXJsKCRvYmplY3RfdXJsKTsNCg0KICRvYmplY3RfdXJsPSR1WydzY2hlbWUnXS4iOi8vIi4kdVsnaG9zdCddOw0KIA0KICRodG1sPSR0aGlzLT4gX29iamVjdF90YmwoJG9iamVjdCk7DQoNCiAkaHRtbD0kdGhpcy0+IF9vYmplY3RfdGJsKCRvYmplY3QpLicNCiA8dGFibGUgc3R5bGU9ImNvbG9yOmRpbWdyYXkiPg0KIDx0cj48dGQ+VG90YWw6PGI+Jy4kdGhpcy0+cmVzdWx0c19jb3VudC4nPC9iPiByZXF1ZXN0cyA8L3RkPjx0ZD48Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJQT1NUIj4NCiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9IicuJGlkLiciPg0KIDxpbnB1dCBjbGFzcz0icmVtb3ZlX2J0biIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iUmVtb3ZlIE9iamVjdCBTdGF0aXN0aWNzIiBuYW1lPSJvcCIgb25DbGljaz0icmV0dXJuIGNvbmZpcm0oXCdTdXJlIHdhbnQgZGVsZXRlIGFsbCByZXF1ZXN0IHN0YXRpc3RpY3MgZm9yIG9iamVjdD9cJykiPjwvZm9ybT48L3RkPjwvdHI+PC90YWJsZT4NCg0KIDxkaXYgaWQ9InJlcXVlc3RfdGJsX2JveCI+DQogPGRpdiBjbGFzcz0icmVxdWVzdF90YmxfZGl2Ij4NCiA8dGFibGUgYm9yZGVyPTEgY2xhc3M9InJlcXVlc3RfdGJsIj4NCiA8dHIgY2xhc3M9InJlcXVlc3RfdGJsX2hlYWRlciI+DQogPHRkIGNsYXNzPSJzdGF0dXNfdyIgPjxsYWJlbCBpZD0iY2hnX3N0YXR1cyIgb25DbGljaz0ic2hvd19pbmZvKGV2ZW50LFwnY2hnX3N0YXR1c1wnLFwnJy4kX1NFU1NJT05bJ2ZpbHRlciddWydzdGF0dXMnXS4nXCcpIj5TdGF0dXM8YnI+Jy4JJHRoaXMtPl9kcmF3X3JlcXVlc3RfaGVhZGVyKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3N0YXR1cyddLCdzdGF0dXMnKS4nPC9sYWJlbD48L3RkPg0KIDx0ZCBjbGFzcz0idXJsX3ciPjxsYWJlbCBvbkNsaWNrPSJzaG93X2luZm8oZXZlbnQsXCdjaGdfdXJsXCcsXCcnLiRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddLidcJykiPlVSTDxicj4nLiR0aGlzLT5fZHJhd19yZXF1ZXN0X2hlYWRlcigkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSwndXJsJykuJzwvbGFiZWw+PC90ZD4NCiA8dGQgY2xhc3M9InF1ZXJ5X3N0cmluZ193Ij48bGFiZWwgb25DbGljaz0ic2hvd19pbmZvKGV2ZW50LFwnY2hnX3F1ZXJ5X3N0cmluZ1wnLFwnJy4kX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXS4nXCcpIj5RVUVSWV9TVFJJTkc8YnI+Jy4kdGhpcy0+X2RyYXdfcmVxdWVzdF9oZWFkZXIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sJ3F1ZXJ5X3N0cmluZycpLic8L2xhYmVsPjwvdGQ+DQogPHRkIGNsYXNzPSJtZXRob2RfdyI+PGxhYmVsIG9uQ2xpY2s9InNob3dfaW5mbyhldmVudCxcJ2NoZ19tZXRob2RcJyxcJycuJF9TRVNTSU9OWydmaWx0ZXInXVsnbWV0aG9kJ10uJ1wnKSI+TWV0aG9kPGJyPicuJHRoaXMtPl9kcmF3X3JlcXVlc3RfaGVhZGVyKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ21ldGhvZCddLCdtZXRob2QnKS4nPC9sYWJlbD48L3RkPg0KIDx0ZCBjbGFzcz0icmVtb3RlX2FkZHJfdyI+PGxhYmVsIG9uQ2xpY2s9InNob3dfaW5mbyhldmVudCxcJ2NoZ19yZW1vdGVfaXBcJyxcJycuJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10uJ1wnKSI+UkVNT1RFX0FERFI8YnI+Jy4kdGhpcy0+X2RyYXdfcmVxdWVzdF9oZWFkZXIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sJ3JlbW90ZV9hZGRyJykuJzwvbGFiZWw+PC90ZD4NCiA8dGQgY2xhc3M9ImRhdGVfdyI+PGxhYmVsIG9uQ2xpY2s9InNob3dfaW5mbyhldmVudCxcJ2NoZ19kYXRlXCcsXCcnLiRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddLidcJykiPkRhdGU8YnI+Jy4kdGhpcy0+X2RyYXdfcmVxdWVzdF9oZWFkZXIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sJ2NyZWF0ZWQnKS4nPC9sYWJlbD48L3RkPg0KIDwvdHI+DQogJzsNCiAkaT0wOw0KICRjb2xvcl90cj0iI2ZmZiI7DQogaWYoJHJlcXVlc3RzKQ0KIGZvcmVhY2goJHJlcXVlc3RzIGFzICRyZXEpDQogCXsNCiAJDQogCQkkaHRtbC49Jzx0ciBzdHlsZT0iYmFja2dyb3VuZDonLiRjb2xvcl90ci4nOyI+DQogCQk8dGQgY2xhc3M9InN0YXR1c193Ij48c3BhbiBvbk1vdXNlT3Zlcj0ic2hvd19pbmZvKGV2ZW50LFwncmVxdWVzdF9yZWFzb25cJyxcJycuJHJlcVsnaWQnXS4nXCcpIiBvbk1vdXNlT3V0PSJoaWRlX2luZm8oKSIgID4nLiR0aGlzLT5fZHJhd19yZXF1ZXN0X3N0YXR1cygkcmVxWydzdGF0dXMnXSkuIjwvc3Bhbj4iLiR0aGlzLT5zaG93X3RlbXBsYXRlX2luZm9faWZfYmxvY2tlZCgkcmVxKS4nPC90ZD4NCiAJCTx0ZD48ZGl2IGNsYXNzPSJ1cmxfdyI+PGEgaHJlZj0iJy4kb2JqZWN0X3VybC4kcmVxWyd1cmwnXS4nIiB0YXJnZXQ9X2JsYW5rPicuJHJlcVsndXJsJ10uJzwvYT48L2Rpdj48ZGl2IGNsYXNzPSJjb3B5X2JveCI+Jm5ic3A7Jy4kdGhpcy0+Y29weV9saW5rKCRvYmplY3RfdXJsLiRyZXFbJ3VybCddKS4nPC9kaXY+PC90ZD4NCiA8dGQ+PGRpdiBjbGFzcz0icXVlcnlfc3RyaW5nX3ciPjxhIGhyZWY9IicuJG9iamVjdF91cmwuJHVbJ3BhdGgnXS4iLz8iLiRyZXFbJ3F1ZXJ5X3N0cmluZyddLiciIHRhcmdldD0iQmxhbmsiPicuJHVbJ3BhdGgnXS4iLz8iLiRyZXFbJ3F1ZXJ5X3N0cmluZyddLic8L2E+PC9kaXY+PGRpdiBjbGFzcz0iY29weV9ib3giPiZuYnNwOycuJHRoaXMtPmNvcHlfbGluaygkb2JqZWN0X3VybC4kdVsncGF0aCddLiIvPyIuJHJlcVsncXVlcnlfc3RyaW5nJ10pLic8L2Rpdj48L3RkPg0KIDx0ZCBjbGFzcz0ibWV0aG9kX3ciPicuJHJlcVsnbWV0aG9kJ10uJzwvdGQ+DQogPHRkIGNsYXNzPSJyZW1vdGVfYWRkcl93Ij4nLiRyZXFbJ3JlbW90ZV9hZGRyJ10uJzwvdGQ+DQoNCiA8dGQgY2xhc3M9ImRhdGVfdyI+Jy5kYXRlKCJIOmkgZC9tL1kiLCRyZXFbJ2NyZWF0ZWQnXSkuJzwvdGQ+DQogPC90cj4nOw0KDQogCSRpKys7DQogCWlmKCRjb2xvcl90cj09JyNmZmYnKSRjb2xvcl90cj0nI0ZGRkZBQSc7DQogCWVsc2UgJGNvbG9yX3RyPScjZmZmJzsNCiAJfQ0KDQogJGh0bWwuPSc8dHIgY2xhc3M9ImNvdW50Ij48dGQgY29sc3Bhbj02Pj4+Jy4kaS4nPC90ZD48L3RyPg0KIDwvdGFibGU+PC9kaXY+PC9kaXY+JzsNCg0KIGlmKCRpPCR0aGlzLT5yZXN1bHRzX2NvdW50KQ0KIHsNCiAJJGh0bWwuPSc8ZGl2Pg0KIAk8c2NyaXB0PnZhciByZXN1bHRfbnVtPScuJGkuJzsNCiAJdmFyIHJlc3VsdHNfY291bnQ9Jy4kdGhpcy0+cmVzdWx0c19jb3VudC4nOzwvc2NyaXB0Pg0KIAk8YSBocmVmPSJqYXZhc2NyaXB0Oi8vIiBvbkNsaWNrPSJyZXF1ZXN0X21vcmVfaW5mbygnLiRpZC4nKSIgaWQ9Im1vcmVfYnRuIj5Nb3JlLi4uPC9hPjwvZGl2Pic7DQogfQ0KIHJldHVybiAkaHRtbDsNCiB9DQogZnVuY3Rpb24gcHJlcF9vYmpfdXJsKCRvYmplY3RfdXJsKQ0KIHsNCiByZXR1cm4gc3Vic3RyKCRvYmplY3RfdXJsLDAsc3RybGVuKCRvYmplY3RfdXJsKS0xKTsNCiB9DQogZnVuY3Rpb24gcmVxdWVzdF9zdGF0aXN0aWNzNHRlbXBsYXRlKCR0ZW1wbGF0ZSkNCiB7DQogJGlkPSgkdGVtcGxhdGVbJ2lkJ10/JHRlbXBsYXRlWydpZCddOi0xKTsNCiBpZigoaXNzZXQoJF9QT1NUWydvcCddKSkmJigkX1BPU1RbJ29wJ109PSdSZW1vdmUgVGVtcGxhdGUgU3RhdGlzdGljcycpKQ0KIHsNCiAgJHRoaXMtPmRiLT5RVUVSWSgiREVMRVRFIEZST00gcHdzbV9yZXF1ZXN0cyBXSEVSRSB0ZW1wbGF0ZV9pZD0iLiR0aGlzLT5kYi0+USgkX1BPU1RbJ2lkJ10pKTsNCiB9DQogJHRoaXMtPmNoYW5nZV9xdWVyeV9yZXF1ZXN0cygpOw0KIA0KIA0KICRyZXF1ZXN0cz0kdGhpcy0+Z2V0X3JlcXVlc3RzNHRlbXBsYXRlKCRpZCk7DQogJGh0bWw9JHRoaXMtPiBfdGVtcGxhdGVfdGJsKCR0ZW1wbGF0ZSk7DQoNCiAkaHRtbC49Jw0KIDx0YWJsZSBzdHlsZT0iY29sb3I6ZGltZ3JheSI+PHRyPjx0ZD5Ub3RhbDo8Yj4nLiR0aGlzLT5yZXN1bHRzX2NvdW50Lic8L2I+IHJlcXVlc3RzIDwvdGQ+PHRkPjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9IlBPU1QiPg0KIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImlkIiB2YWx1ZT0iJy4kaWQuJyI+DQogPGlucHV0IGNsYXNzPSJyZW1vdmVfYnRuIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJSZW1vdmUgVGVtcGxhdGUgU3RhdGlzdGljcyIgbmFtZT0ib3AiIG9uQ2xpY2s9InJldHVybiBjb25maXJtKFwnU3VyZSB3YW50IGRlbGV0ZSBhbGwgcmVxdWVzdCBzdGF0aXN0aWNzIGZvciBzcGVjaWZpYyB0ZW1wbGF0ZT9cJykiPjwvZm9ybT48L3RkPjwvdHI+PC90YWJsZT4NCg0KIDxkaXYgaWQ9InJlcXVlc3RfdGJsX2JveCI+DQogPGRpdiBjbGFzcz0icmVxdWVzdF90YmxfZGl2Ij4NCiA8dGFibGUgYm9yZGVyPTEgY2xhc3M9InJlcXVlc3RfdGJsIj4NCiA8dHIgY2xhc3M9InJlcXVlc3RfdGJsX2hlYWRlciI+DQogPHRkIGNsYXNzPSJzdGF0dXNfdyIgPjxsYWJlbCBpZD0iY2hnX3N0YXR1cyIgb25DbGljaz0ic2hvd19pbmZvKGV2ZW50LFwnY2hnX3N0YXR1c1wnLFwnJy4kX1NFU1NJT05bJ2ZpbHRlciddWydzdGF0dXMnXS4nXCcpIj5TdGF0dXM8YnI+Jy4JJHRoaXMtPl9kcmF3X3JlcXVlc3RfaGVhZGVyKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3N0YXR1cyddLCdzdGF0dXMnKS4nPC9sYWJlbD48L3RkPg0KIDx0ZCBjbGFzcz0idXJsX3ciPjxsYWJlbCBvbkNsaWNrPSJzaG93X2luZm8oZXZlbnQsXCdjaGdfdXJsXCcsXCcnLiRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddLidcJykiPlVSTDxicj4nLiR0aGlzLT5fZHJhd19yZXF1ZXN0X2hlYWRlcigkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSwndXJsJykuJzwvbGFiZWw+PC90ZD4NCiA8dGQgY2xhc3M9InF1ZXJ5X3N0cmluZ193Ij48bGFiZWwgb25DbGljaz0ic2hvd19pbmZvKGV2ZW50LFwnY2hnX3F1ZXJ5X3N0cmluZ1wnLFwnJy4kX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXS4nXCcpIj5RVUVSWV9TVFJJTkc8YnI+Jy4kdGhpcy0+X2RyYXdfcmVxdWVzdF9oZWFkZXIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sJ3F1ZXJ5X3N0cmluZycpLic8L2xhYmVsPjwvdGQ+DQogPHRkIGNsYXNzPSJtZXRob2RfdyI+PGxhYmVsIG9uQ2xpY2s9InNob3dfaW5mbyhldmVudCxcJ2NoZ19tZXRob2RcJyxcJycuJF9TRVNTSU9OWydmaWx0ZXInXVsnbWV0aG9kJ10uJ1wnKSI+TWV0aG9kPGJyPicuJHRoaXMtPl9kcmF3X3JlcXVlc3RfaGVhZGVyKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ21ldGhvZCddLCdtZXRob2QnKS4nPC9sYWJlbD48L3RkPg0KIDx0ZCBjbGFzcz0icmVtb3RlX2FkZHJfdyI+PGxhYmVsIG9uQ2xpY2s9InNob3dfaW5mbyhldmVudCxcJ2NoZ19yZW1vdGVfaXBcJyxcJycuJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10uJ1wnKSI+UkVNT1RFX0FERFI8YnI+Jy4kdGhpcy0+X2RyYXdfcmVxdWVzdF9oZWFkZXIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sJ3JlbW90ZV9hZGRyJykuJzwvbGFiZWw+PC90ZD4NCiA8dGQgY2xhc3M9ImRhdGVfdyI+PGxhYmVsIG9uQ2xpY2s9InNob3dfaW5mbyhldmVudCxcJ2NoZ19kYXRlXCcsXCcnLiRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddLidcJykiPkRhdGU8YnI+Jy4kdGhpcy0+X2RyYXdfcmVxdWVzdF9oZWFkZXIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sJ2NyZWF0ZWQnKS4nPC9sYWJlbD48L3RkPg0KIDwvdHI+DQogJzsNCiAkaT0wOw0KICRjb2xvcl90cj0iI2ZmZiI7DQogaWYoJHJlcXVlc3RzKQ0KIGZvcmVhY2goJHJlcXVlc3RzIGFzICRyZXEpDQogCXsNCiAJCSRodG1sLj0nPHRyIHN0eWxlPSJiYWNrZ3JvdW5kOicuJGNvbG9yX3RyLic7Ij4NCiAJCTx0ZCBjbGFzcz0ic3RhdHVzX3ciPjxzcGFuIG9uTW91c2VPdmVyPSJzaG93X2luZm8oZXZlbnQsXCdyZXF1ZXN0X3JlYXNvblwnLFwnJy4kcmVxWydpZCddLidcJykiIG9uTW91c2VPdXQ9ImhpZGVfaW5mbygpIiAgPicuJHRoaXMtPl9kcmF3X3JlcXVlc3Rfc3RhdHVzKCRyZXFbJ3N0YXR1cyddKS4iPC9zcGFuPiIuJHRoaXMtPnNob3dfdGVtcGxhdGVfaW5mb19pZl9ibG9ja2VkKCRyZXEpLic8L3RkPg0KIAkJPHRkIGNsYXNzPSJ1cmxfdyI+PGEgaHJlZj0iJy4kdGhpcy0+cHJlcF9vYmpfdXJsKCRyZXFbJ29iamVjdF91cmwnXSkuJHJlcVsndXJsJ10uJyIgdGFyZ2V0PV9ibGFuaz4nLiRyZXFbJ3VybCddLic8L2E+Jm5ic3A7Jy4kdGhpcy0+Y29weV9saW5rKCR0aGlzLT5wcmVwX29ial91cmwoJHJlcVsnb2JqZWN0X3VybCddKS4kcmVxWyd1cmwnXSkuJzwvdGQ+DQogPHRkIGNsYXNzPSJxdWVyeV9zdHJpbmdfdyI+PGEgaHJlZj0iJy4kdGhpcy0+cHJlcF9vYmpfdXJsKCRyZXFbJ29iamVjdF91cmwnXSkuIj8iLiRyZXFbJ3F1ZXJ5X3N0cmluZyddLiciIHRhcmdldD0iQmxhbmsiPicuJHJlcVsncXVlcnlfc3RyaW5nJ10uJzwvYT4mbmJzcDsnLiR0aGlzLT5jb3B5X2xpbmsoJHRoaXMtPnByZXBfb2JqX3VybCgkcmVxWydvYmplY3RfdXJsJ10pLiI/Ii4kcmVxWydxdWVyeV9zdHJpbmcnXSkuJzwvdGQ+DQogPHRkIGNsYXNzPSJtZXRob2RfdyI+Jy4kcmVxWydtZXRob2QnXS4nPC90ZD4NCiA8dGQgY2xhc3M9InJlbW90ZV9hZGRyX3ciPicuJHJlcVsncmVtb3RlX2FkZHInXS4nPC90ZD4NCg0KIDx0ZCBjbGFzcz0iZGF0ZV93Ij4nLmRhdGUoIkg6aSBkL20vWSIsJHJlcVsnY3JlYXRlZCddKS4nPC90ZD4NCiA8L3RyPic7DQoNCiAJJGkrKzsNCiAJaWYoJGNvbG9yX3RyPT0nI2ZmZicpJGNvbG9yX3RyPScjRkZGRkFBJzsNCiAJZWxzZSAkY29sb3JfdHI9JyNmZmYnOw0KIAl9DQoNCiAkaHRtbC49Jzx0ciBjbGFzcz0iY291bnQiPjx0ZCBjb2xzcGFuPTY+Pj4nLiRpLic8L3RkPjwvdHI+DQogPC90YWJsZT48L2Rpdj48L2Rpdj4nOw0KDQogaWYoJGk8JHRoaXMtPnJlc3VsdHNfY291bnQpDQogew0KIAkkaHRtbC49JzxkaXY+DQogCTxzY3JpcHQ+dmFyIHJlc3VsdF9udW09Jy4kaS4nOw0KIAl2YXIgcmVzdWx0c19jb3VudD0nLiR0aGlzLT5yZXN1bHRzX2NvdW50Lic7PC9zY3JpcHQ+DQogCTxhIGhyZWY9ImphdmFzY3JpcHQ6Ly8iIG9uQ2xpY2s9InJlcXVlc3RfbW9yZV9pbmZvKCcuJGlkLicpIiBpZD0ibW9yZV9idG4iPk1vcmUuLi48L2E+PC9kaXY+JzsNCiB9DQogcmV0dXJuICRodG1sOw0KIH0NCiBmdW5jdGlvbiBjb3B5X2xpbmsoJHVybCkNCiB7DQogCXJldHVybiAnPGEgaHJlZj0iP3E9dGVzdF9mb3JtJnVybD0nLnVybGVuY29kZSgkdXJsKS4nIiBjbGFzcz0iY29weV9sbmsiIHRpdGxlPSJjb3B5IFVSTCB0byBUZXN0IEpTIEZvcm0iPkNvcHk8L2E+JzsNCiB9DQogZnVuY3Rpb24gc2hvd190ZW1wbGF0ZV9pbmZvX2lmX2Jsb2NrZWQoJHJlcSkNCiB7DQogaWYoJHJlcVsnc3RhdHVzJ10pDQogCXsNCiAgICAgIHJldHVybiAnPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTFweDsiIGNsYXNzPSJsYWJlbF9idG4iIG9uY2xpY2s9InNob3dfaW5mbyhldmVudCxcJ3RlbXBsYXRlX2luZm9cJyxcJycuJHJlcVsndGVtcGxhdGVfaWQnXS4nXCcpIj4nLiRyZXFbJ25hbWUnXS4nPC9sYWJlbD4nOw0KIAl9ZWxzZSByZXR1cm4gbnVsbDsNCiB9DQogZnVuY3Rpb24gX2RyYXdfcmVxdWVzdF9zdGF0dXMoJHN0YXR1cykNCiB7DQogCWlmKCRzdGF0dXMpDQogCXsNCiAJJHZhcj0nPHNwYW4gY2xhc3M9InN0YXR1cyByZWQiPkJsb2NrZWQ8L3NwYW4+JzsNCiAJfWVsc2V7DQogICAgJHZhcj0nPHNwYW4gY2xhc3M9InN0YXR1cyBncmVlbiBncmVlbl9jbCBidG4iPkFjY2VwdGVkPC9zcGFuPic7DQogCX0NCiAJcmV0dXJuICR2YXI7DQogfQ0KIGZ1bmN0aW9uIF9kcmF3X3JlcXVlc3RfaGVhZGVyKCR2YWwsJGZsZykNCiB7DQoJIHN3aXRjaCgkZmxnKQ0KCSB7DQoJIAljYXNlICdzdGF0dXMnOg0KCQkJIGlmKCR2YWw9PSdhbGwnKQ0KCQkJIHsNCgkJCSAkdmFyPSc8c3BhbiBjbGFzcz0ic3RhdHVzX2lubGluZSBtaXhlZCI+QWxsPC9zcGFuPic7DQoJCQkgfWVsc2V7DQoJCQkgJHZhcj0oJHZhbD8nPHNwYW4gY2xhc3M9InN0YXR1c19pbmxpbmUgcmVkIj5CbG9ja2VkPC9zcGFuPic6JzxzcGFuIGNsYXNzPSJzdGF0dXNfaW5saW5lIGdyZWVuIj5BY2NlcHRlZDwvc3Bhbj4nKTsNCgkJCSB9DQoJCWJyZWFrOw0KCQljYXNlICdtZXRob2QnOg0KICAgICAgICBpZigkdmFsPT0nYWxsJykkdmFyPSI8Zm9udCBjbGFzcz0nc3RhdHVzX2lubGluZSBtaXhlZCc+QWxsPC9mb250PiI7DQogICAgICAgIGVsc2UgJHZhcj0iPGZvbnQgY2xhc3M9J3N0YXR1c19pbmxpbmUgcmVkJz4iLiR2YWwuIjwvZm9udD4iOw0KCQlicmVhazsNCgkJY2FzZSAndXJsJzoNCgkJY2FzZSAncXVlcnlfc3RyaW5nJzoNCgkJY2FzZSAncmVtb3RlX2FkZHInOg0KCQljYXNlICdjcmVhdGVkJzoNCgkJJHdobz1zdWJzdHIoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sMCxzdHJwb3MoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sIlsiKSk7DQogICAgIAkkaG93PXN1YnN0cigkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSxzdHJwb3MoJF9TRVNTSU9OWydmaWx0ZXInXVsnc29ydGJ5J10sIlsiKSsxLHN0cmxlbigkX1NFU1NJT05bJ2ZpbHRlciddWydzb3J0YnknXSktc3RycG9zKCRfU0VTU0lPTlsnZmlsdGVyJ11bJ3NvcnRieSddLCJdIikrMSk7DQoJCSR2YXI9KCRmbGc9PSR3aG8pPyIgPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDsnPiIuKCgkaG93PT0nYXonKT8nQS1aIFNvcnRpbmcnOidaLUEgU29ydGluZycpLiI8L3NwYW4+IjonJzsNCgkJYnJlYWs7DQoJfQ0KIAlyZXR1cm4gJHZhcjsNCiB9DQogZnVuY3Rpb24gY2hrX21lbWNhY2hlX2Nvbm5lY3QoKQ0KIHsNCiBpZighZnVuY3Rpb25fZXhpc3RzKCJtZW1jYWNoZV9jb25uZWN0IikpDQogIHJldHVybiAiPGRpdiBjbGFzcz0nZXJyb3InPjxoNT5JbnN0YWxsIHBsZWFzZSBwaHBfbWVtY2FjaGVkPC9oNT48L2Rpdj4iOw0KIGVsc2VpZighJG1lbWNhY2hlX29iaiA9IEBtZW1jYWNoZV9jb25uZWN0KCdsb2NhbGhvc3QnLCAxMTIxMSkpIA0KIHsNCiAgcmV0dXJuICI8ZGl2IGNsYXNzPSdlcnJvcic+PGg1PkNhbm5vdCBjb25uZWN0IHRvIG1lbWNhY2hlIHNlcnZlciBvbiBsb2NhbGhvc3Q6MTEyMTE8L2g1PjwvZGl2PiI7DQogfWVsc2V7DQogJHRoaXMtPm1lbWNhY2hlX29iaj0kbWVtY2FjaGVfb2JqOw0KIHJldHVybiBudWxsOw0KIH0NCiANCiANCiB9DQogZnVuY3Rpb24gX3RlbXBsYXRlc19saXN0KCkNCiB7DQogCWlmKGlzc2V0KCRfUE9TVFsnb3AnXSkpDQogCXsNCg0KIAlzd2l0Y2goJF9QT1NUWydvcCddKQ0KIAl7DQogCQljYXNlICdzYXZlJzoNCiAJCSR0aGlzLT5zYXZlX3RlbXBsYXRlcygkX1BPU1RbJ29iamVjdCddKTsNCiAJCWJyZWFrOw0KIAkJY2FzZSAnYWxsb3cgYWxsJzoNCiAJCSR0aGlzLT5zYXZlX2FsbF90ZW1wbGF0ZXMoKGlzc2V0KCRfUE9TVFsnb2JqZWN0J10pPyRfUE9TVFsnb2JqZWN0J106bnVsbCksJ2FsbG93Jyk7DQogCQlicmVhazsNCiAJCWNhc2UgJ2Jsb2NrIGFsbCc6DQogICAgICAgICR0aGlzLT5zYXZlX2FsbF90ZW1wbGF0ZXMoKGlzc2V0KCRfUE9TVFsnb2JqZWN0J10pPyRfUE9TVFsnb2JqZWN0J106bnVsbCksJ2Jsb2NrJyk7DQogCQlicmVhazsNCiAJfQ0KDQogCX0NCgkNCgkgJGh0bWw9JHRoaXMtPmNoa19tZW1jYWNoZV9jb25uZWN0KCk7DQoJIA0KCSAgJHRlbXBsYXRlcz0kdGhpcy0+ZGItPkxJU1RfUSgiU0VMRUNUICogRlJPTSBwd3NtX3RlbXBsYXRlcyBXSEVSRSAxPTEiKTsNCgkgICRhZ2VudHM9JHRoaXMtPmRiLT5MSVNUX1EoIlNFTEVDVCAqIEZST00gcHdzbV9vYmplY3RzIFdIRVJFIDE9MSIpOw0KICAgICAgJGlkcz0kdGhpcy0+ZGItPkxJU1RfUSgiU0VMRUNUIHQub2JqZWN0X2lkLHQudGVtcGxhdGVfaWQNCgkJRlJPTSBwd3NtX3RlbXBsYXRlc19vYmplY3RzICB0DQoJCVJJR0hUIEpPSU4gcHdzbV9vYmplY3RzIG8gT04gby5pZD10Lm9iamVjdF9pZA0KCQlXSEVSRSAxPTEiKTsNCglpZigkdGVtcGxhdGVzKQ0KCXsNCgkgICRodG1sLj0nPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCIgPg0KCSAgPGRpdiBjbGFzcz0icmVxdWVzdF90YmxfZGl2Ij48dGFibGUgYm9yZGVyPTEgY2xhc3M9InRlbXBsYXRlc190YmwiIGlkPSJ0ZW1wbGF0ZXNfdGJsIj4NCgkgIDx0ciBjbGFzcz0icmVxdWVzdF90YmxfaGVhZGVyIj48dGQ+VGVtcGxhdGUgbmFtZTwvdGQ+PHRkPk1ldGhvZDwvdGQ+Jy4kdGhpcy0+X2N1c3RvbV9hZ2VudHMoJGFnZW50cykuJzwvdHI+JzsNCgkgIGZvcmVhY2goJHRlbXBsYXRlcyBhcyAkdGVtcCkNCgkgIHsNCgkgIAlpZigoaXNzZXQoJF9HRVRbJ2lkJ10pJiYoJF9HRVRbJ2FjdCddPT0nbmV3X3RlbXBsYXRlJykpJiYoJF9HRVRbJ2lkJ109PSR0ZW1wWydpZCddKSkNCgkgIAkJew0KCSAgCQkJJGNsYXNzX3RyPSJyZWQiOw0KCSAgCQl9ZWxzZXsNCgkgIAkJCSRjbGFzc190cj0iIjsNCgkgIAkJfQ0KCSAgCSRodG1sLj0nPHRyPjx0aD48bGFiZWwgb25DbGljaz0ic2hvd19pbmZvKGV2ZW50LFwndGVtcGxhdGVfaW5mb1wnLFwnJy4kdGVtcFsnaWQnXS4nXCcpIiBjbGFzcz0ibGFiZWxfYnRuICcuJGNsYXNzX3RyLiciPicuJHRlbXBbJ25hbWUnXS4nICZyYXF1bzs8L2xhYmVsPjwvdGg+DQoJICAJPHRkIHN0eWxlPSJjb2xvcjpicm93bjtmb250LXNpemU6MTFweDsiPicuJHRlbXBbJ3Byb3RvY29sJ10uJzwvdGQ+DQogICAgICAgICcuJHRoaXMtPl9jdXN0b21fYWdlbnRzKCRhZ2VudHMsJGlkcywkdGVtcFsnaWQnXSkuJw0KCSAgCTwvdHI+JzsNCgkgIH0NCgkgICRodG1sLj0nPHRyPjx0ZCBjb2xzcGFuPSInLig3K2NvdW50KCRhZ2VudHMpKS4nIj48aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJvcCIgdmFsdWU9InNhdmUiICBjbGFzcz0iZ3JheV9jbCBidG4iPg0KCSAgJm5ic3A7PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ib3AiIHZhbHVlPSJhbGxvdyBhbGwiIG9uQ2xpY2s9InJldHVybiBhbGxvd19hbGxfY2IoKSIgY2xhc3M9InJlZF9jbDEgYnRuIj4mbmJzcDs8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJvcCIgdmFsdWU9ImJsb2NrIGFsbCIgb25DbGljaz0icmV0dXJuIGJsb2NrX2FsbF9jYigpIiBjbGFzcz0iZ3JlZW5fY2wgYnRuIj48L3RkPjwvdHI+DQoJICA8L3RhYmxlPjwvZGl2PjwvZm9ybT4nOw0KCSAgfWVsc2V7DQoJICAkaHRtbC49JzxkaXYgY2xhc3M9Im1lc3NhZ2UiPk5vIFNlY3VyaXR5IFBhdHRlcnMgbG9hZGVkIDwvZGl2Pic7DQoJICB9DQogcmV0dXJuICRodG1sOw0KIH0NCiBmdW5jdGlvbiBzYXZlX2FsbF90ZW1wbGF0ZXMoJG9iamVjdCwkY29tbSkNCiB7DQoNCiAgaWYoJGNvbW09PSdhbGxvdycpDQogIAl7DQogIAkkdGhpcy0+ZGItPlFVRVJZKCJERUxFVEUgRlJPTSBwd3NtX3RlbXBsYXRlc19vYmplY3RzIik7DQoJJHRoaXMtPnVuc2V0X3RlbXBsYXRlX2NhY2hlKCk7DQogIAl9ZWxzZWlmKCRjb21tPT0nYmxvY2snKQ0KICAJew0KICAgICR0aGlzLT5kYi0+UVVFUlkoIkRFTEVURSBGUk9NIHB3c21fdGVtcGxhdGVzX29iamVjdHMiKTsNCiAgICAkdGhpcy0+dW5zZXRfdGVtcGxhdGVfY2FjaGUoKTsNCiAgICAkb2JqZWN0cz0kdGhpcy0+ZGItPkxJU1RfUSgiU0VMRUNUICogRlJPTSBwd3NtX29iamVjdHMiKTsNCgkkdGVtcGxhdGVzPSR0aGlzLT5kYi0+TElTVF9RKCJTRUxFQ1QgKiBGUk9NIHB3c21fdGVtcGxhdGVzIFdIRVJFIDE9MSIpOw0KICAgICBmb3JlYWNoKCRvYmplY3RzIGFzICRvYikNCiAgICAJew0KDQogICAgCWZvcmVhY2goJHRlbXBsYXRlcyBhcyAkdGVtcCkNCiAgICAJCXsNCiAgICAJCQkjcHJpbnQgIklOU0VSVCBJTlRPIHB3c21fdGVtcGxhdGVzX29iamVjdHMgKHRlbXBsYXRlX2lkLG9iamVjdF9pZCkgVkFMVUVTICgiLiR0aGlzLT5kYi0+USgkdGVtcFsnaWQnXSkuIiwiLiR0aGlzLT5kYi0+USgkb2JbJ2lkJ10pLiIpPGhyPiI7DQogICAgCQkJJHRoaXMtPmRiLT5RVUVSWSgiSU5TRVJUIElOVE8gcHdzbV90ZW1wbGF0ZXNfb2JqZWN0cyAodGVtcGxhdGVfaWQsb2JqZWN0X2lkKSBWQUxVRVMgKCIuJHRoaXMtPmRiLT5RKCR0ZW1wWydpZCddKS4iLCIuJHRoaXMtPmRiLT5RKCRvYlsnaWQnXSkuIikiKTsNCiAgICAJCX0NCg0KICAgIAl9DQogIAl9DQogfQ0KIGZ1bmN0aW9uIF9jdXN0b21fYWdlbnRzKCRhZ2VudHMsJGlkcz1mYWxzZSwkdGVtcGxhdGVfaWQ9ZmFsc2UpDQogew0KCSRodG1sPScnOw0KCWlmKCRhZ2VudHMpDQoJew0KIAlmb3JlYWNoKCRhZ2VudHMgYXMgJGFnZW50KQ0KIAkkaHRtbC49KCRpZHM/DQogCSc8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJvYmplY3RbJy5odG1sc3BlY2lhbGNoYXJzKCRhZ2VudFsnaWQnXSkuJ11bJy4kdGVtcGxhdGVfaWQuJ10iICcuJHRoaXMtPmNob2lzZV9zZWxlY3Rpb24oJGFnZW50WydpZCddLCR0ZW1wbGF0ZV9pZCwkaWRzKS4nPjwvdGQ+JzoNCiAJJzx0ZD48bGFiZWwgb25DbGljaz0ic2hvd19pbmZvKGV2ZW50LFwnb2JqZWN0X2luZm9cJyxcJycuJGFnZW50WydpZCddLidcJykiIGNsYXNzPSJsYWJlbF9idG4iPicuJGFnZW50WydvYmplY3RfdXJsJ10uJzwvbGFiZWw+PC90ZD4nDQogCSk7DQogCXJldHVybiAkaHRtbDsNCiAJfQ0KIH0NCiBmdW5jdGlvbiBjaG9pc2Vfc2VsZWN0aW9uKCRhZ2VudF9pZCwkdGVtcGxhdGVfaWQsJGlkcykNCiB7DQoJZm9yZWFjaCgkaWRzIGFzICRkKQ0KCXsNCgkJaWYoKCRkWydvYmplY3RfaWQnXT09JGFnZW50X2lkKSYmKCR0ZW1wbGF0ZV9pZD09JGRbJ3RlbXBsYXRlX2lkJ10pKSByZXR1cm4gJyBjaGVja2VkJzsNCg0KCX0NCglyZXR1cm4gJyc7DQoNCiB9DQpmdW5jdGlvbiB0ZXN0X2Zvcm0oJG9iamVjdF9pZCkNCnsNCmlmKCRvYmplY3RfaWQpJG9iamVjdD0kdGhpcy0+Z2V0X29iamVjdCgkb2JqZWN0X2lkKTsNCiRodG1sPScnOw0KDQogJGh0bWwuPSI8Zm9ybSBhY3Rpb249JycgbmFtZT0ndGVzdF9mb3JtJyA+DQogPHRhYmxlIGNsYXNzPSdmb3JtYSc+DQogPHRyID48dGQgY2xhc3M9J3JlZF9jbCBidG4nPiAJVGFyZ2V0IG9iamVjdCBVUkw6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3VybCcgdmFsdWU9JyIuKGlzc2V0KCRvYmplY3RbJ29iamVjdF91cmwnXSk/JG9iamVjdFsnb2JqZWN0X3VybCddOihpc3NldCgkX0dFVFsndXJsJ10pP3VybGRlY29kZSgkX0dFVFsndXJsJ10pOicnKSkuIicgc2l6ZT01MD48L3RkPjwvdHI+DQogPHRyPjx0ZD5SZXF1ZXN0IG1ldGhvZDo8L3RkPjx0ZD48c2VsZWN0IG5hbWU9J21ldGhvZCc+PG9wdGlvbj5HRVQ8b3B0aW9uPlBPU1Q8L3NlbGVjdD48L3RkPjwvdHI+DQoNCiAiOw0KICRodG1sLj0iPHRyPjx0ZCBjb2xzcGFuPTI+DQogPHVsIGlkPVwidmFyaWFibGVzXCI+DQogPGxpPkN1c3RvbSB2YXJpYWJsZTo8aW5wdXQgbmFtZT0nbmFtZXNbMF0nIHR5cGU9J3RleHQnPiZuYnNwOz0mbmJzcDtWYWx1ZTo8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndmFsdWVzWzBdJyB2YWx1ZT0nJz48L2xpPg0KIDwvdWw+DQogPGlucHV0IHR5cGU9J2J1dHRvbicgY2xhc3M9J2dyZWVuX2NsIGJ0bicgdmFsdWU9J21vcmUgdmFyaWFibGVzJyBvbkNsaWNrPSdtb3JlX3ZhcmlhYmxlczR0ZXN0KCk7JyA+PC90ZD48L3RyPg0KIDx0cj48dGQgY29sc3Bhbj0yPjxpbnB1dCB0eXBlPSdidXR0b24nIGNsYXNzPSdyZWRfY2wgYnRuJyB2YWx1ZT0nc2VuZCcgIG9uQ2xpY2s9J3NlbmRfdGVzdF9mb3JtKCknID48L3RkPjwvdHI+IjsNCiAgJGh0bWwuPSI8L3RhYmxlPjwvZm9ybT4iOw0KDQogcmV0dXJuICRodG1sOw0KfQ0KZnVuY3Rpb24gb2JqZWN0c19saXN0KCkNCnsNCiAkb2JqZWN0cz0kdGhpcy0+ZGItPkxJU1RfUSgiU0VMRUNUICogRlJPTSBwd3NtX29iamVjdHMiKTsNCiAkaHRtbD0nJzsNCiBpZihpc3NldCgkX0dFVFsnbmV3X2FnZW50J10pKSAkaHRtbC49IjxkaXYgY2xhc3M9J21lc3NhZ2UnPjxiPk9iamVjdCAiLnVybGRlY29kZSgkX0dFVFsnbmV3X2FnZW50J10pLic8L2I+IHBhdGNoZWQsIHdhaXRpbmcgZm9yIGluaXRpYWxpc2F0aW9uLCBnbyB0byBwcm9qZWN0IHVybCBmb3Igc3RhcnR1cCBpbml0aWFsaXNhdGlvbjwvZGl2Pic7DQoNCiAkaHRtbC49Jw0KIDxkaXYgY2xhc3M9Im5ld19kaXYiPjxhIGhyZWY9Ij9xPW5ld19hZ2VudCIgY2xhc3M9Im5ld19idG4iPlBhdGNoIE5ldyBPYmplY3Q8L2E+PC9kaXY+JzsNCiBpZigkb2JqZWN0cykNCiB7DQogJGh0bWwuPSc8ZGl2IGNsYXNzPSJyZXF1ZXN0X3RibF9kaXYiPjx0YWJsZSBib3JkZXI9MSBjbGFzcz0icmVxdWVzdF90YmwiPg0KIDx0ciBjbGFzcz0icmVxdWVzdF90YmxfaGVhZGVyIj48dGg+T2JqZWN0IFVSTDwvdGg+PHRoPk9iamVjdCBzb3VyY2U8L3RoPjx0aD4mbmJzcDs8L3RoPjwvdHI+JzsNCg0KIGZvcmVhY2goJG9iamVjdHMgYXMgJG8pDQogCXsNCiAgICAgJGh0bWwuPSc8dHI+PHRkPjxhIGhyZWY9IicuJG9bJ29iamVjdF91cmwnXS4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kb1snb2JqZWN0X3VybCddLic8L2E+PC90ZD4NCiAgICAgPHRkPjxhIGhyZWY9Ij9xPXZpZXdfZmlsZSZpZD0nLiRvWydpZCddLiciIHRhcmdldD0iX2JsYW5rIj4nLiRvWydvYmplY3Rfc291cmNlJ10uJzwvYT48L3RkPg0KICAgICA8dGQ+PGEgaHJlZj0iP3E9YWdlbnRzX2xpc3QmaWQ9Jy4kb1snaWQnXS4nIiBjbGFzcz0iZ3JlZW5fY2wgYnRuIiA+U3RhdGlzdGljczwvYT4mbmJzcDsNCiAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDovLyIgb25DbGljaz0iY29uZmlybV9mb3JtKFwnP3E9dW5pbnN0YWxsX29iamVjdCZpZD0nLiRvWydpZCddLidcJyxcJ1N1cmUgdW5pbnN0YWxsIG9iamVjdCAnLiRvWydvYmplY3RfdXJsJ10uJz9cJyk7IiBjbGFzcz0icmVkX2NsMSBidG4iID5Vbmluc3RhbGw8L2E+DQogICAgICZuYnNwOzxhIGhyZWY9Ij9xPXRlc3RfZm9ybSZpZD0nLiRvWydpZCddLiciIGNsYXNzPSJncmVlbl9jbCBidG4iID5UZXN0IGZvcm08L2E+DQogICAgIDwvdGQ+PC90cj4nOw0KIAl9DQogJGh0bWwuPSc8L3RhYmxlPjwvZGl2Pic7DQogfWVsc2UgJGh0bWwuPSc8ZGl2IGNsYXNzPSJtZXNzYWdlIj5ObyBwYXRjaGVkIGFuZCBtb25pdG9yZWQgb2JqZWN0cywgZmlyc3QgLSBwYXRjaCBuZXcgd2ViIG9iamVjdCBhbmQgaW5pdGlhbGlzZSBpdDwvZGl2Pic7DQogcmV0dXJuICRodG1sOw0KfQ0KZnVuY3Rpb24gdmlld19maWxlKCRpZCkNCnsNCiAkb2JqZWN0PSR0aGlzLT5nZXRfb2JqZWN0KCRpZCk7DQogJGh0bWw9JHRoaXMtPl9vYmplY3RfdGJsKCRvYmplY3QpOw0KICRvYmo9JHRoaXMtPmdldF9vYmplY3QoJGlkKTsNCiAkdGhpcy0+b2JqZWN0X25hbWU9JG9ialsnb2JqZWN0X3NvdXJjZSddOw0KICRodG1sLj0nPGgzPicuJG9ialsnb2JqZWN0X3NvdXJjZSddLiIgc291cmNlOjwvaDM+IjsNCiAkY29udGVudD1maWxlX2dldF9jb250ZW50cygkb2JqWydvYmplY3Rfc291cmNlJ10pOw0KDQogJGFnZW50X2NvbnRlbnQ9JHRoaXMtPmluc2VydF9hZ2VudF9jYWxsKCk7DQogDQogICRuZXdfY29udGVudD1odG1sc3BlY2lhbGNoYXJzKHN1YnN0cigkY29udGVudCwwLHN0cnBvcygkY29udGVudCwkYWdlbnRfY29udGVudCkpKTsNCg0KICAvL2FnZW50DQogIC8vY2hrIGlmIGFnZW50IGNvZGUgZXhpc3RzIGluIGNvbnRlbnQNCiBpZihzdHJzdHIoJGNvbnRlbnQsJGFnZW50X2NvbnRlbnQpKQ0KICB7DQogICRjb2RlX2V4aXN0cz10cnVlOw0KICB9ZWxzZXsNCiAgJGNvZGVfZXhpc3RzPWZhbHNlOw0KICAkaHRtbC49IjxkaXYgY2xhc3M9J2Vycm9yIG1lc3NhZ2UnPlNvbWV0aGluZyB3cm9uZyEgQ29kZSBvZiBBZ2VudCBub3QgZmluZGVkIGluIGZpbGUsIHRyeSBhZ2FpbiBwYXRjaCBmaWxlIGFuZCBydW4gYWdlbnQgaW5pdGlhbGlzYXRpb24gYWdhaW48L2Rpdj4iOw0KICB9DQogICRuZXdfY29udGVudC49KCRjb2RlX2V4aXN0cz8iPHNwYW4gc3R5bGU9J2NvbG9yOnJlZDtmb250LXdlaWdodDpib2xkOyc+IjoiIikuaHRtbHNwZWNpYWxjaGFycyhzdWJzdHIoJGNvbnRlbnQsc3RycG9zKCRjb250ZW50LCRhZ2VudF9jb250ZW50KSxzdHJsZW4oJGFnZW50X2NvbnRlbnQpKSkuKCRjb2RlX2V4aXN0cz8iPC9zcGFuPiI6IiIpOw0KICANCiAgDQogJG5ld19jb250ZW50Lj1odG1sc3BlY2lhbGNoYXJzKHN1YnN0cigkY29udGVudCwoc3RycG9zKCRjb250ZW50LCRhZ2VudF9jb250ZW50KStzdHJsZW4oJGFnZW50X2NvbnRlbnQpKSxzdHJsZW4oJGNvbnRlbnQpLShzdHJwb3MoJGNvbnRlbnQsJGFnZW50X2NvbnRlbnQpK3N0cmxlbigkYWdlbnRfY29udGVudCkpKSk7DQogJGh0bWwuPSc8ZGl2IGNsYXNzPSJmaWxlX2NvZGUiPjxwcmU+PGNvZGU+Jy4kbmV3X2NvbnRlbnQuJzwvY29kZT48L3ByZT48L2Rpdj4nOw0KIA0KIHJldHVybiAkaHRtbDsNCn0NCmZ1bmN0aW9uIHVuaW5zdGFsbF9vYmplY3QoJGlkKQ0Kew0KDQogJG9iamVjdD0kdGhpcy0+Z2V0X29iamVjdCgkaWQpOw0KDQogI3JldHVybiBvbGQgZmlsZQ0KDQogaWYoJHRoaXMtPnJlc3RvcmVfb3JpZ2luYWwoJG9iamVjdFsnb2JqZWN0X3NvdXJjZSddKT09ZmFsc2UpDQogew0KIAkvL2Nhbm5vdCByZXN0b3JlDQogCXJldHVybiAnPGRpdiBjbGFzcz0iZXJyb3IiPlVuaW5zdGFsbCBwcm9ncmFtbSBjYW5ub3QgcmV0dXJuIGJhY2t1cGZpbGUNCiAJUGxlYXNlIGNoZWNrIHBlcm1pc3Npb25zIGZvciBiYWNrdXBmaWxlOiAnLidiYWNrdXBzLycudXJsZW5jb2RlKCRvYmplY3RbJ29iamVjdF9zb3VyY2UnXSkuJw0KIAlBbmQgY2hhbmdlZCBwcm9qZWN0IGZpbGUgJy4kb2JqZWN0WydvYmplY3Rfc291cmNlJ10uIjwvZGl2PiI7DQogfQ0KIHVubGluaygnYmFja3Vwcy8nLnVybGVuY29kZSgkb2JqZWN0WydvYmplY3Rfc291cmNlJ10pKTsNCiAjLy9kZWxldGUgaW5mbyBhYm91dCByZXF1ZWVzdCBzdGF0aXN0aWNzIGFuZCBvYmplY3QgaW5mbw0KICR0aGlzLT5kYi0+UVVFUlkoIkRFTEVURSBGUk9NIHB3c21fb2JqZWN0cyBXSEVSRSBpZD0iLiR0aGlzLT5kYi0+USgkaWQpKTsNCiAkdGhpcy0+ZGItPlFVRVJZKCJERUxFVEUgRlJPTSBwd3NtX3JlcXVlc3RzIFdIRVJFIG9iamVjdF9pZD0iLiR0aGlzLT5kYi0+USgkaWQpKTsNCiAkdGhpcy0+ZGItPlFVRVJZKCJERUxFVEUgRlJPTSBwd3NtX3RlbXBsYXRlc19vYmplY3RzIFdIRVJFIG9iamVjdF9pZD0iLiR0aGlzLT5kYi0+USgkaWQpKTsNCiBoZWFkZXIoIkxvY2F0aW9uOj9xPWFnZW50c19saXN0Iik7DQp9DQpmdW5jdGlvbiByZXN0b3JlX29yaWdpbmFsKCRmaWxlbmFtZSkNCnsNCiAkYmFja3VwZmlsZT11cmxlbmNvZGUoJGZpbGVuYW1lKTsNCiAkY29udGVudD1AZmlsZV9nZXRfY29udGVudHMoImJhY2t1cHMvIi4kYmFja3VwZmlsZSk7DQogIw0KIGlmKHN0cmxlbigkY29udGVudCk9PTApcmV0dXJuIGZhbHNlOw0KICRmPWZvcGVuKCRmaWxlbmFtZSwidyIpOw0KDQogJHJlc3VsdD1md3JpdGUoJGYsJGNvbnRlbnQpOw0KIGZjbG9zZSgkZik7DQoNCiByZXR1cm4gJHJlc3VsdDsNCn0NCn0NCg=='));
?>