# gbp_permanent_links v0.14 patch 6 (standard) # Custom permanent links rules # Graeme Porteous # http://rgbp.co.uk/projects/textpattern/gbp_permanent_links/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMDp7czo0OiJuYW1lIjtzOjE5OiJnYnBfcGVybWFuZW50X2xpbmtzIjtzOjc6InZlcnNp b24iO3M6NjoiMC4xNC42IjtzOjY6ImF1dGhvciI7czoxNToiR3JhZW1lIFBvcnRlb3VzIjtz OjEwOiJhdXRob3JfdXJpIjtzOjU5OiJodHRwOi8vcmdicC5jby51ay9wcm9qZWN0cy90ZXh0 cGF0dGVybi9nYnBfcGVybWFuZW50X2xpbmtzLyI7czoxMToiZGVzY3JpcHRpb24iO3M6Mjg6 IkN1c3RvbSBwZXJtYW5lbnQgbGlua3MgcnVsZXMiO3M6NDoidHlwZSI7czoxOiIxIjtzOjQ6 ImhlbHAiO3M6MTUxOiJoMS4gZ2JwX3Blcm1hbmVudF9saW5rcy4KClRoZXJlIGlzIG5vIHBs dWdpbiBkb2N1bWVudGF0aW9uLiBGb3IgaGVscCBwbGVhc2UgdXNlIHRoZSAiZm9ydW0gdGhy ZWFkIjpodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MTg5 MTguIjtzOjQ6ImNvZGUiO3M6NjY5MzM6IgovLyBDb25zdGFudHMKQGRlZmluZSgnZ2JwX3Nh dmUnLCAnc2F2ZScpOwpAZGVmaW5lKCdnYnBfcG9zdCcsICdwb3N0Jyk7CkBkZWZpbmUoJ2di cF9zZXBhcmF0b3InLCAnJn4mfiYnKTsKCi8vIHJlcXVpcmVfcGx1Z2luKCkgd2lsbCByZXNl dCB0aGUgJHR4cF9jdXJyZW50X3BsdWdpbiBnbG9iYWwKZ2xvYmFsICR0eHBfY3VycmVudF9w bHVnaW47CiRnYnBfY3VycmVudF9wbHVnaW4gPSAkdHhwX2N1cnJlbnRfcGx1Z2luOwpyZXF1 aXJlX3BsdWdpbignZ2JwX2FkbWluX2xpYnJhcnknKTsKJHR4cF9jdXJyZW50X3BsdWdpbiA9 ICRnYnBfY3VycmVudF9wbHVnaW47CgpjbGFzcyBQZXJtYW5lbnRMaW5rcyBleHRlbmRzIEdC UFBsdWdpbgp7Cgl2YXIgJHByZWZlcmVuY2VzID0gYXJyYXkoCgkJJ3Nob3dfcHJlZml4JyA9 PiBhcnJheSgndmFsdWUnID0+IDAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJCSdzaG93 X3N1ZmZpeCcgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAwLCAndHlwZScgPT4gJ3llc25vcmFkaW8n KSwKCQknb21pdF90cmFpbGluZ19zbGFzaCcgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAwICwgJ3R5 cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ3JlZGlyZWN0X210X3N0eWxlX2xpbmtzJyA9PiBh cnJheSgndmFsdWUnID0+IDEgLCAndHlwZScgPT4gJ3llc25vcmFkaW8nKSwKCQknY2xlYW5f cGFnZV9hcmNoaXZlX2xpbmtzJyA9PiBhcnJheSgndmFsdWUnID0+IDEgLCAndHlwZScgPT4g J3llc25vcmFkaW8nKSwKCQknam9pbl9wcmV0ZXh0X3RvX3BhZ2VsaW5rcycgPT4gYXJyYXko J3ZhbHVlJyA9PiAxICwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ2NoZWNrX3ByZXRl eHRfY2F0ZWdvcnlfY29udGV4dCcgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAwICwgJ3R5cGUnID0+ ICd5ZXNub3JhZGlvJyksCgkJJ2NoZWNrX3ByZXRleHRfc2VjdGlvbl9jb250ZXh0JyA9PiBh cnJheSgndmFsdWUnID0+IDAgLCAndHlwZScgPT4gJ3llc25vcmFkaW8nKSwKCQknZm9yY2Vf bG93ZXJjYXNlX3VybHMnID0+IGFycmF5KCd2YWx1ZScgPT4gMSAsICd0eXBlJyA9PiAneWVz bm9yYWRpbycpLAoJCSdhdXRvbWF0aWNhbGx5X2FwcGVuZF90aXRsZScgPT4gYXJyYXkoJ3Zh bHVlJyA9PiAxICwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ3Blcm1saW5rX3JlZGly ZWN0X2h0dHBfc3RhdHVzJyA9PiBhcnJheSgndmFsdWUnID0+ICczMDEnICwgJ3R5cGUnID0+ ICd0ZXh0X2lucHV0JyksCgkJJ3VybF9yZWRpcmVjdF9odHRwX3N0YXR1cycgPT4gYXJyYXko J3ZhbHVlJyA9PiAnMzAyJyAsICd0eXBlJyA9PiAndGV4dF9pbnB1dCcpLAoJCSd0ZXh0X2Fu ZF9yZWdleF9zZWdtZW50X3Njb3JlcycgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAnMCcgLCAndHlw ZScgPT4gJ3RleHRfaW5wdXQnKSwKCQknZGVidWcnID0+IGFycmF5KCd2YWx1ZScgPT4gMCwg J3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkpOwoJdmFyICRtYXRjaGVkX3Blcm1saW5rID0g YXJyYXkoKTsKCXZhciAkcGFydGlhbF9tYXRjaGVzID0gYXJyYXkoKTsKCXZhciAkY2xlYXZl cl9wYXJ0aWFsX21hdGNoOwoJdmFyICRidWZmZXJfZGVidWcgPSBhcnJheSgpOwoKCWZ1bmN0 aW9uIHByZWxvYWQgKCkgewoJCW5ldyBQZXJtYW5lbnRMaW5rc0xpc3RUYWJWaWV3KCdsaXN0 JywgJ2xpc3QnLCAkdGhpcyk7CgkJbmV3IFBlcm1hbmVudExpbmtzQnVpbGRUYWJWaWV3KCdi dWlsZCcsICdidWlsZCcsICR0aGlzKTsKCQluZXcgR0JQUHJlZmVyZW5jZVRhYlZpZXcoJHRo aXMpOwoJfQoKCWZ1bmN0aW9uIG1haW4gKCkgewoJCXJlcXVpcmVfcHJpdnMoJHRoaXMtPmV2 ZW50KTsKCX0KCglmdW5jdGlvbiBnZXRfYWxsX3Blcm1saW5rcyAoJHNvcnQgPSAwLCAkZXhj bHVkZSA9IGFycmF5KCkpIHsKCQlzdGF0aWMgJHJzOwoJCWlmICghaXNzZXQoJHJzKSkKCQkJ JHJzID0gc2FmZV9jb2x1bW4oCgkJCQkiUkVQTEFDRShuYW1lLCAneyR0aGlzLT5wbHVnaW5f bmFtZX1fJywgJycpIEFTIGlkIiwgJ3R4cF9wcmVmcycsCgkJCQkiYGV2ZW50YCA9ICd7JHRo aXMtPmV2ZW50fScgQU5EIGBuYW1lYCBSRUdFWFAgJ157JHRoaXMtPnBsdWdpbl9uYW1lfV8u ezEzfSQnIgoJCQkpOwoKCQlpZiAoQHR4cGludGVyZmFjZSA9PSAncHVibGljJykKCQkJJHRo aXMtPmRlYnVnKCdMb2FkaW5nIHBlcm1saW5rcyBmcm9tIGRiJyk7CgkJJGkgPSAwOwoKCQkk cGVybWxpbmtzID0gYXJyYXkoKTsKCQlmb3JlYWNoICgkcnMgYXMgJGlkKSB7CgkJCSRwbCA9 ICR0aGlzLT5nZXRfcGVybWxpbmsoJGlkKTsKCgkJCWlmIChjb3VudCgkZXhjbHVkZSkgPiAw KQoJCQkJZm9yZWFjaCAoJHBsWydjb21wb25lbnRzJ10gYXMgJHBsX2MpIHsKCQkJCQlpZiAo aXNfYXJyYXkoJGV4Y2x1ZGUpICYmIGluX2FycmF5KCRwbF9jWyd0eXBlJ10sICRleGNsdWRl KSkKCQkJCQkJY29udGludWUgMjsKCQkJCQlpZiAoaXNfc3RyaW5nKCRleGNsdWRlKSAmJiAk cGxfY1sndHlwZSddID09PSAkZXhjbHVkZSkKCQkJCQkJY29udGludWUgMjsKCQkJCX0KCgkJ CSRwZXJtbGlua3NbJGlkXSA9ICRwbDsKCgkJCWlmICgkc29ydCkKCQkJCSRwcmVjZWRlbmNl WyRpZF0gPSAkcGVybWxpbmtzWyRpZF1bJ3NldHRpbmdzJ11bJ3BsX3ByZWNlZGVuY2UnXTsK CQl9CgoJCS8vIElmIG1vcmUgdGhhbiBvbmUgcGVybWFuZW50IGxpbmssIHNvcnQgYnkgdGhl aXIgcHJlY2VkZW5jZSB2YWx1ZS4KCQlpZiAoJHNvcnQgJiYgY291bnQoJHBlcm1saW5rcykg PiAxKQoJCQlhcnJheV9tdWx0aXNvcnQoJHByZWNlZGVuY2UsIFNPUlRfREVTQywgJHBlcm1s aW5rcyk7CgoJCWlmIChAdHhwaW50ZXJmYWNlID09ICdwdWJsaWMnKSB7CgkJCWZvcmVhY2gg KCRwZXJtbGlua3MgYXMgJHBsKQoJCQkJJHRoaXMtPmRlYnVnKCRwbFsnc2V0dGluZ3MnXVsn cGxfcHJlY2VkZW5jZSddLic6ICcuJHBsWydzZXR0aW5ncyddWydwbF9uYW1lJ10uJyAoJy4k cGxbJ3NldHRpbmdzJ11bJ3BsX3ByZXZpZXcnXS4nKScpOwoJCX0KCgkJcmV0dXJuICRwZXJt bGlua3M7Cgl9CgoJZnVuY3Rpb24gZ2V0X3Blcm1saW5rICgkaWQpIHsKCQkkcGVybWxpbmsg PSAkdGhpcy0+cHJlZigkaWQpOwoJCXJldHVybiBpc19hcnJheSgkcGVybWxpbmspID8gJHBl cm1saW5rIDogYXJyYXkoKTsKCX0KCglmdW5jdGlvbiByZW1vdmVfcGVybWxpbmsgKCRpZCkg ewoJCSRwZXJtbGluayA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJGlkKTsKCQlzYWZlX2RlbGV0 ZSgndHhwX3ByZWZzJywgImBldmVudGAgPSAneyR0aGlzLT5ldmVudH0nIEFORCBgbmFtZWAg TElLRSAneyR0aGlzLT5wbHVnaW5fbmFtZX1feyRpZH0lJyIpOwoJCXJldHVybiAkcGVybWxp bmtbJ3NldHRpbmdzJ11bJ3BsX25hbWUnXTsKCX0KCglmdW5jdGlvbiBfZmVlZF9lbnRyeSAo KSB7CgkJc3RhdGljICRzZXQ7CgkJaWYgKCFpc3NldCgkc2V0KSkgewoJCQkvLyBXZSdyZSBp biBhIGZlZWQgZm9yY2UgZGVidWdnaW5nIG9mZi4KCQkJJHRoaXMtPnByZWZlcmVuY2VzWydk ZWJ1ZyddWyd2YWx1ZSddID0gJEdMT0JBTFNbJ3ByZWZzJ11bJHRoaXMtPnBsdWdpbl9uYW1l LidfZGVidWcnXSA9IDA7CgoJCQkkdGhpcy0+c2V0X3Blcm1saW5rX21vZGUodHJ1ZSk7CgkJ CSRzZXQgPSB0cnVlOwoJCX0KCX0KCglmdW5jdGlvbiBfdGV4dHBhdHRlcm4gKCkgewoJCWds b2JhbCAkcGx1Z2luc192ZXIsICRwcmV0ZXh0LCAkcHJlZnMsICRwbHVnaW5fY2FsbGJhY2s7 CgoJCSR0aGlzLT5kZWJ1ZygnUGx1Z2luOiAnLiR0aGlzLT5wbHVnaW5fbmFtZS4nIC0gJy4k cGx1Z2luc192ZXJbJHRoaXMtPnBsdWdpbl9uYW1lXSk7CgkJJHRoaXMtPmRlYnVnKCdGdW5j dGlvbjogJy5fX0ZVTkNUSU9OX18uJygpJyk7CgoJCS8vIFVSSQoJCSRyZXEgPSAkcHJldGV4 dFsncmVxJ107CgkJJHJlcSA9IHByZWdfcmVwbGFjZSgnJVw/W15cL10rJCUnLCAnJywgJHJl cSk7CgkJJHRoaXMtPmRlYnVnKCdSZXF1ZXN0IFVSSTogJy4kcmVxKTsKCQkkdXJpID0gZXhw bG9kZSgnLycsIHRyaW0oJHJlcSwgJy8nKSk7CgoJCS8vIFRoZSBudW1iZXIgb2YgY29tcG9u ZW50cyBjb21lcyBpbiB1c2VmdWwgd2hlbiBkZXRlcm1pbmluZyB0aGUgYmVzdCBwYXJ0aWFs IG1hdGNoLgoJCSR1cmlfY29tcG9uZW50X2NvdW50ID0gY291bnQoJHVyaSk7CgoJCS8vIFBl cm1hbmVudCBsaW5rcwoJCSRwZXJtbGlua3MgPSAkdGhpcy0+Z2V0X2FsbF9wZXJtbGlua3Mo MSk7CgoJCS8vIEZvcmNlIFRleHRwYXR0ZXJuIGFuZCB0YWdzIHRvIHVzZSBtZXNzeSBVUkxz IC0gdGhlc2UgYXJlIGVhc2llciB0bwoJCS8vIGZpbmQgaW4gcmVnZXgKCQkkdGhpcy0+c2V0 X3Blcm1saW5rX21vZGUoKTsKCgkJaWYgKGNvdW50KCRwZXJtbGlua3MpKSB7CgoJCQkvLyBX ZSBhbHNvIHdhbnQgdG8gbWF0Y2ggdGhlIGZyb250IHBhZ2Ugb2YgdGhlIHNpdGUgKGZvciBw YWdlIG51bWJlcnMgLyBmZWVkcyBldGMuLikuCgkJCS8vIEFkZCBhIHBlcm1saW5rcyBydWxl IHdoaWNoIHdpbGwgZG8gdGhhdC4KCQkJJHBlcm1saW5rc1snZGVmYXVsdCddID0gYXJyYXko CgkJCQknY29tcG9uZW50cycgPT4gYXJyYXkoKSwKCQkJCSdzZXR0aW5ncycgPT4gYXJyYXko CgkJCQkJJ3BsX25hbWUnID0+ICdnYnBfcGVybWFuZW50X2xpbmtzX2RlZmF1bHQnLCAncGxf cHJlY2VkZW5jZScgPT4gJycsICdwbF9wcmV2aWV3JyA9PiAnLycsCgkJCQkJJ2Nvbl9zZWN0 aW9uJyA9PiAnJywgJ2Nvbl9jYXRlZ29yeScgPT4gJycsICdkZXNfc2VjdGlvbicgPT4gJycs ICdkZXNfY2F0ZWdvcnknID0+ICcnLAoJCQkJCSdkZXNfcGVybWxpbmsnID0+ICcnLCAnZGVz X2ZlZWQnID0+ICcnLCAnZGVzX2xvY2F0aW9uJyA9PiAnJywgJ2Rlc19wYWdlJyA9PiAnJwoJ CQkpKTsKCgkJCS8vIEV4dGVuZCB0aGUgcHJldGV4dF9yZXBsYWNlbWVudCBzY29wZSBvdXRz aWRlIHRoZSBmb3JlYWNoIHBlcm1saW5rIGxvb3AKCQkJJHByZXRleHRfcmVwbGFjZW1lbnQg PSBOVUxMOwoKCQkJZm9yZWFjaCgkcGVybWxpbmtzIGFzICRpZCA9PiAkcGwpIHsKCQkJCS8v IEV4dHJhY3QgdGhlIHBlcm1saW5rIHNldHRpbmdzCgkJCQkkcGxfc2V0dGluZ3MgPSAkcGxb J3NldHRpbmdzJ107CgkJCQlleHRyYWN0KCRwbF9zZXR0aW5ncyk7CgoJCQkJJHRoaXMtPmRl YnVnKCdQZXJtbGluayBuYW1lOiAnLiRwbF9uYW1lKTsKCQkJCSR0aGlzLT5kZWJ1ZygnUGVy bWxpbmsgaWQ6ICcuJGlkKTsKCQkJCSR0aGlzLT5kZWJ1ZygnUHJldmlldzogJy4kcGxfcHJl dmlldyk7CgoJCQkJJHBsX2NvbXBvbmVudHMgPSAkcGxbJ2NvbXBvbmVudHMnXTsKCgkJCQkv LyBVUkkgY29tcG9uZW50cwoJCQkJJHVyaV9jb21wb25lbnRzID0gJHVyaTsKCgkJCQkkdGhp cy0+ZGVidWcoJ1BMIGNvbXBvbmVudCBjb3VudDogJy5jb3VudCgkcGxfY29tcG9uZW50cykp OwoJCQkJJHRoaXMtPmRlYnVnKCdVUkwgY29tcG9uZW50IGNvdW50OiAnLmNvdW50KCR1cmlf Y29tcG9uZW50cykpOwoKCQkJCSRkYXRlID0gZmFsc2U7ICR0aXRsZV9wYWdlX2ZlZWQgPSBm YWxzZTsKCQkJCWZvcmVhY2goJHBsX2NvbXBvbmVudHMgYXMgJHBsX2MpCgkJCQkJLy8gQXJl IHdlIGV4cGVjdGluZyBhIGRhdGUgY29tcG9uZW50PyBJZiBzbyB0aGUgbnVtYmVyIG9mIHBs IGFuZCB1cmkgY29tcG9uZW50cyB3b24ndCBtYXRjaAoJCQkJCWlmICgkcGxfY1sndHlwZSdd ID09ICdkYXRlJykKCQkJCQkgCSRkYXRlID0gdHJ1ZTsKCQkJCQkvLyBEbyB3ZSBoYXZlIGVp dGhlciBhIHRpdGxlLCBwYWdlIG9yIGEgZmVlZCBjb21wb25lbnQ/CgkJCQkJZWxzZSBpZiAo aW5fYXJyYXkoJHBsX2NbJ3R5cGUnXSwgYXJyYXkoJ3RpdGxlJywgJ3BhZ2UnLCAnZmVlZCcp KSkKCQkJCQkJJHRpdGxlX3BhZ2VfZmVlZCA9IHRydWU7CgoJCQkJaWYgKCEkdGl0bGVfcGFn ZV9mZWVkKQoJCQkJCS8vIElmIHRoZXJlIGlzbid0IGEgdGl0bGUsIHBhZ2Ugb3IgZmVlZCBj b21wb25lbnQgdGhlbiBhcHBlbmQgYSBzcGVjaWFsIHR5cGUgZm9yIGNsZWF2ZXIgcGFydGlh bCBtYXRjaGluZwoJCQkJCSRwbF9jb21wb25lbnRzW10gPSBhcnJheSgndHlwZScgPT4gJ3Rp dGxlX3BhZ2VfZmVlZCcsICdwcmVmaXgnID0+ICcnLCAnc3VmZml4JyA9PiAnJywgJ3JlZ2V4 JyA9PiAnJywgJ3RleHQnID0+ICcnKTsKCgkJCQkvLyBFeGl0IGVhcmx5IGlmIHRoZXJlIGFy ZSBtb3JlIFVSTCBjb21wb25lbnRzIHRoYW4gUEwgY29tcG9uZW50cywKCQkJCS8vIHRha2lu ZyBpbnRvIGFjY291bnQgd2hldGhlciB0aGVyZSBpcyBhIGRhdGEgY29tcG9uZW50CgkJCQlp ZiAoISR1cmlfY29tcG9uZW50c1swXSB8fCBjb3VudCgkdXJpX2NvbXBvbmVudHMpID4gY291 bnQoJHBsX2NvbXBvbmVudHMpICsgKCRkYXRlID8gMiA6IDApKSB7CgkJCQkJJHRoaXMtPmRl YnVnKCdNb3JlIFVSTCBjb21wb25lbnRzIHRoYW4gUEwgY29tcG9uZW50cycpOwoJCQkJCWNv bnRpbnVlOwoJCQkJfQoKCQkJCS8vIFJlc2V0IHByZXRleHRfcmVwbGFjZW1lbnQgYXMgd2Ug YXJlIGFib3V0IHRvIHN0YXJ0IGFub3RoZXIgY29tcGFyaXNvbgoJCQkJJHByZXRleHRfcmVw bGFjZW1lbnQgPSBhcnJheSgncGVybWxpbmtfaWQnID0+ICRpZCk7CgoJCQkJLy8gUmVzZXQg dGhlIGFydGljbGUgY29udGV4dCBzdHJpbmcKCQkJCSRjb250ZXh0ID0gYXJyYXkoKTsKCQkJ CXVuc2V0KCRjb250ZXh0X3N0cik7CgkJCQlpZiAoIWVtcHR5KCRkZXNfc2VjdGlvbikpCgkJ CQkJJGNvbnRleHRbXSA9ICJgU2VjdGlvbmAgPSAnJGRlc19zZWN0aW9uJyI7CgkJCQlpZiAo IWVtcHR5KCRkZXNfY2F0ZWdvcnkpKQoJCQkJCSRjb250ZXh0W10gPSAiKGBDYXRlZ29yeTFg ID0gJyRkZXNfY2F0ZWdvcnknIE9SIGBDYXRlZ29yeTJgID0gJyRkZXNfY2F0ZWdvcnknKSI7 CgkJCQkkY29udGV4dF9zdHIgPSAoY291bnQoJGNvbnRleHQpID4gMCA/ICdhbmQgJy5qb2lu KCcgYW5kICcsICRjb250ZXh0KSA6ICcnKTsKCgkJCQkvLyBBc3N1bWUgdGhlcmUgaXMgbm8g bWF0Y2gKCQkJCSRwYXJ0aWFsX21hdGNoID0gZmFsc2U7CgkJCQkkY2xlYXZlcl9wYXJ0aWFs X21hdGNoID0gZmFsc2U7CgoJCQkJLy8gTG9vcCB0aHJvdWdoIHRoZSBwZXJtbGluayBjb21w b25lbnRzCgkJCQlmb3JlYWNoICgkcGxfY29tcG9uZW50cyBhcyAkcGxfY19pbmRleCA9PiAk cGxfYykgewoJCQkJCS8vIEFzc3VtZSB0aGVyZSBpcyBubyBtYXRjaAoJCQkJCSRtYXRjaCA9 IGZhbHNlOwoKCQkJCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIHN0aWxsIFVSSSBj b21wb25lbnRzIHRvIGJlIGNoZWNrZWQuCgkJCQkJaWYgKGNvdW50KCR1cmlfY29tcG9uZW50 cykpCgkJCQkJCS8vIEdldCB0aGUgbmV4dCBjb21wb25lbnQuCgkJCQkJCSR1cmlfYyA9IGFy cmF5X3NoaWZ0KCR1cmlfY29tcG9uZW50cyk7CgoJCQkJCWVsc2UgaWYgKCEkdGl0bGVfcGFn ZV9mZWVkICYmIGNvdW50KCRwbF9jb21wb25lbnRzKSAtIDEgPT0gJHVyaV9jb21wb25lbnRf Y291bnQpIHsKCQkJCQkJLy8gSWYgd2UgYXBwZW5kZWQgYSB0aXRsZV9wYWdlX2ZlZWQgY29t cG9uZW50IGVhcmxpZXIgYW5kIHBlcm1saW5rIGFuZCBVUkkgY29tcG9uZW50cwoJCQkJCQkv LyBjb3VudHMgYXJlIGVxdWFsLCB3ZSBtdXN0IG9mIGZpbmlzaGVkIGNoZWNraW5nIHRoaXMg cGVybWxpbmssIGFuZCBpdCBtYXRjaGVzIHNvIGJyZWFrLgoJCQkJCQkkbWF0Y2ggPSB0cnVl OwoJCQkJCQlicmVhazsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gSWYgdGhlcmUgYXJlIG5v IG1vcmUgVVJJIGNvbXBvbmVudHMgdGhlbiB3ZSBoYXZlIGEgcGFydGlhbCBtYXRjaC4KCQkJ CQkJLy8gU3RvcmUgdGhlIHBhcnRpYWwgbWF0Y2ggZGF0YSB1bmxlc3MgdGhlcmUgaGFzIGJl ZW4gYSBwcmVjZWRpbmcgcGVybWxpbmsgd2l0aCB0aGUKCQkJCQkJLy8gc2FtZSBudW1iZXIg b2YgY29tcG9uZW50cywgYXMgcGVybWxpbmsgaGF2ZSBhbHJlYWR5IGJlZW4gc29ydGVkIGJ5 IHByZWNlZGVuY2UuCgkJCQkJCWlmICghYXJyYXlfa2V5X2V4aXN0cygkdXJpX2NvbXBvbmVu dF9jb3VudCwgJHRoaXMtPnBhcnRpYWxfbWF0Y2hlcykpCgkJCQkJCQkkdGhpcy0+cGFydGlh bF9tYXRjaGVzWyR1cmlfY29tcG9uZW50X2NvdW50XSA9ICRwcmV0ZXh0X3JlcGxhY2VtZW50 OwoKCQkJCQkJLy8gVW5zZXQgcHJldGV4dF9yZXBsYWNlbWVudCBhcyBjaGFuZ2VzIGNvdWxk IG9mIGJlZW4gbWFkZSBpbiBhIHByZWNlZGluZyBjb21wb25lbnQKCQkJCQkJdW5zZXQoJHBy ZXRleHRfcmVwbGFjZW1lbnQpOwoKCQkJCQkJLy8gQnJlYWsgZWFybHkgZm9ybSB0aGUgZm9y ZWFjaCBwZXJtbGluayBjb21wb25lbnRzIGxvb3AuCgkJCQkJCSRwYXJ0aWFsX21hdGNoID0g dHJ1ZTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoKCQkJCQkvLyBFeHRyYWN0IHRoZSBwZXJtbGlu ayBjb21wb25lbnRzLgoJCQkJCWV4dHJhY3QoJHBsX2MpOwoKCQkJCQkvLyBJZiBpdCdzIGEg ZGF0ZSwgZ3JhYiBhbmQgY29tYmluZSB0aGUgbmV4dCB0d28gVVJJIGNvbXBvbmVudHMuCgkJ CQkJaWYgKCR0eXBlID09ICdkYXRlJykKCQkJCQkJJHVyaV9jIC49ICcvJy5hcnJheV9zaGlm dCgkdXJpX2NvbXBvbmVudHMpLicvJy5hcnJheV9zaGlmdCgkdXJpX2NvbXBvbmVudHMpOwoK CQkJCQkvLyBEZWNvZGUgdGhlIFVSTAoJCQkJCSR1cmlfYyA9IHVybGRlY29kZSgkdXJpX2Mp OwoKCQkJCQkvLyBBbHdheXMgY2hlY2sgdGhlIHR5cGUgdW5sZXNzIHRoZSBwcmVmaXggb3Ig c3VmZml4IGFyZW4ndCB0aGVyZQoJCQkJCSRjaGVja190eXBlID0gdHJ1ZTsKCgkJCQkJLy8g Q2hlY2sgcHJlZml4CgkJCQkJaWYgKCRwcmVmaXggJiYgJHRoaXMtPnByZWYoJ3Nob3dfcHJl Zml4JykpIHsKCQkJCQkJJHNhbml0aXplZF9wcmVmaXggPSB1cmxkZWNvZGUoJHRoaXMtPmVu Y29kZV91cmwoJHByZWZpeCkpOwoJCQkJCQlpZiAoKCRwb3MgPSBzdHJwb3MoJHVyaV9jLCAk c2FuaXRpemVkX3ByZWZpeCkpID09PSBmYWxzZSB8fCAkcG9zICE9IDApIHsKCQkJCQkJCSRj aGVja190eXBlID0gZmFsc2U7CgkJCQkJCQkkdGhpcy0+ZGVidWcoJ0NhblwndCBmaW5kIHBy ZWZpeDogJy4kcHJlZml4KTsKCQkJCQkJfSBlbHNlCgkJCQkJCQkvLyBDaGVjayBwYXNzZWQs IHJlbW92ZSBwcmVmaXggcmVhZHkgZm9yIHRoZSBuZXh0IGNoZWNrCgkJCQkJCQkkdXJpX2Mg PSBzdWJzdHJfcmVwbGFjZSgkdXJpX2MsICcnLCAwLCBzdHJsZW4oJHNhbml0aXplZF9wcmVm aXgpKTsKCQkJCQl9CgoJCQkJCS8vIENoZWNrIHN1ZmZpeAoJCQkJCWlmICgkY2hlY2tfdHlw ZSAmJiAkc3VmZml4ICYmICR0aGlzLT5wcmVmKCdzaG93X3N1ZmZpeCcpKSB7CgkJCQkJCSRz YW5pdGl6ZWRfc3VmZml4ID0gdXJsZGVjb2RlKCR0aGlzLT5lbmNvZGVfdXJsKCRzdWZmaXgp KTsKCQkJCQkJaWYgKCgkcG9zID0gc3RycnBvcygkdXJpX2MsICRzYW5pdGl6ZWRfc3VmZml4 KSkgPT09IGZhbHNlKSB7CgkJCQkJCQkkY2hlY2tfdHlwZSA9IGZhbHNlOwoJCQkJCQkJJHRo aXMtPmRlYnVnKCdDYW5cJ3QgZmluZCBzdWZmaXg6ICcuJHN1ZmZpeCk7CgkJCQkJCX0gZWxz ZQoJCQkJCQkJLy8gQ2hlY2sgcGFzc2VkLCByZW1vdmUgc3VmZml4IHJlYWR5IGZvciB0aGUg bmV4dCBjaGVjawoJCQkJCQkJJHVyaV9jID0gc3Vic3RyX3JlcGxhY2UoJHVyaV9jLCAnJywg JHBvcywgc3RybGVuKCRzYW5pdGl6ZWRfc3VmZml4KSk7CgkJCQkJfQoKCQkJCQkvLyBCb3Ro IHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBzZXR0aW5ncyBoYXZlIHBhc3NlZAoJCQkJCWlmICgk Y2hlY2tfdHlwZSkgewoJCQkJCQkkdGhpcy0+ZGVidWcoJ0NoZWNraW5nIGlmICInLiR1cmlf Yy4nIiBpcyBvZiB0eXBlICInLiR0eXBlLiciJyk7CgkJCQkJCSR1cmlfYyA9IGRvU2xhc2go JHVyaV9jKTsKCgkJCQkJCS8vCgkJCQkJCWlmICgkcHJlZnNbJ3Blcm1hbGlua190aXRsZV9m b3JtYXQnXSkgewoJCQkJCQkJJG10X3NlYXJjaCA9IGFycmF5KCcvXy8nLCAnL1wuaHRtbCQv Jyk7CgkJCQkJCQkkbXRfcmVwbGFjZSA9IGFycmF5KCctJywgJycpOwoJCQkJCQl9IGVsc2Ug ewoJCQkJCQkJJG10X3NlYXJjaCA9IGFycmF5KCcvKD86XnxfKSguKS9lJywgJy9cLmh0bWwk LycpOwoJCQkJCQkJJG10X3JlcGxhY2UgPSBhcnJheSgic3RydG91cHBlcignXFwxJykiLCAn Jyk7CgkJCQkJCX0KCQkJCQkJJG10X3VyaV9jID0gJHRoaXMtPnByZWYoJ3JlZGlyZWN0X210 X3N0eWxlX2xpbmtzJykKCQkJCQkJCT8gcHJlZ19yZXBsYWNlKCRtdF9zZWFyY2gsICRtdF9y ZXBsYWNlLCAkdXJpX2MpCgkJCQkJCQk6ICcnOwoKCQkJCQkJLy8gQ29tcGFyZSBiYXNlZCBv biB0eXBlCgkJCQkJCXN3aXRjaCAoJHR5cGUpIHsKCQkJCQkJCWNhc2UgJ3NlY3Rpb24nOgoJ CQkJCQkJCWlmICgkcnMgPSBzYWZlX3JvdygnbmFtZScsICd0eHBfc2VjdGlvbicsICIoYG5h bWVgIGxpa2UgJyR1cmlfYycgb3IgYG5hbWVgIGxpa2UgJyRtdF91cmlfYycpIGxpbWl0IDEi KSkgewoJCQkJCQkJCQkkdGhpcy0+ZGVidWcoJ1NlY3Rpb24gbmFtZTogJy4kcnNbJ25hbWUn XSk7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydzJ10gPSAkcnNbJ25hbWUnXTsK CQkJCQkJCQkJJGNvbnRleHRbXSA9ICJgU2VjdGlvbmAgPSAneyRyc1snbmFtZSddfSciOwoJ CQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJ Y2FzZSAnY2F0ZWdvcnknOgoJCQkJCQkJCWlmICgkcnMgPSBzYWZlX3JvdygnbmFtZScsICd0 eHBfY2F0ZWdvcnknLCAiKGBuYW1lYCBsaWtlICckdXJpX2MnIG9yIGBuYW1lYCBsaWtlICck bXRfdXJpX2MnKSBhbmQgYHR5cGVgID0gJ2FydGljbGUnIGxpbWl0IDEiKSkgewoJCQkJCQkJ CQkkdGhpcy0+ZGVidWcoJ0NhdGVnb3J5IG5hbWU6ICcuJHJzWyduYW1lJ10pOwoJCQkJCQkJ CQkkcHJldGV4dF9yZXBsYWNlbWVudFsnYyddID0gJHJzWyduYW1lJ107CgkJCQkJCQkJCSRj b250ZXh0W10gPSAiKGBDYXRlZ29yeTFgID0gJ3skcnNbJ25hbWUnXX0nIE9SIGBDYXRlZ29y eTJgID0gJyR1cmlfYycpIjsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJ CQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3RpdGxlJzoKCQkJCQkJCQlpZiAoJHJzID0gc2Fm ZV9yb3coJ0lELCBQb3N0ZWQnLCAndGV4dHBhdHRlcm4nLCAiKGB1cmxfdGl0bGVgIGxpa2Ug JyR1cmlfYycgb3IgYHVybF90aXRsZWAgbGlrZSAnJG10X3VyaV9jJykgJGNvbnRleHRfc3Ry IGFuZCBgU3RhdHVzYCA+PSA0IGxpbWl0IDEiKSkgewoJCQkJCQkJCQkkdGhpcy0+ZGVidWco J0FydGljbGUgaWQ6ICcuJHJzWydJRCddKTsKCQkJCQkJCQkJJG10X3JlZGlyZWN0ID0gKCR1 cmlfYyAhPSAkbXRfdXJpX2MpOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQn XSA9ICRyc1snSUQnXTsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ1Bvc3RlZCdd ID0gJHJzWydQb3N0ZWQnXTsKCQkJCQkJCQkJJHByZXRleHRbJ251bVBhZ2VzJ10gPSAxOwoJ CQkJCQkJCQkkcHJldGV4dFsnaXNfYXJ0aWNsZV9saXN0J10gPSBmYWxzZTsKCQkJCQkJCQkJ JG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2lk JzoKCQkJCQkJCQlpZiAoJHJzID0gc2FmZV9yb3coJ0lELCBQb3N0ZWQnLCAndGV4dHBhdHRl cm4nLCAiYElEYCA9ICckdXJpX2MnICRjb250ZXh0X3N0ciBhbmQgYFN0YXR1c2AgPj0gNCBs aW1pdCAxIikpIHsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2lkJ10gPSAkcnNb J0lEJ107CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydQb3N0ZWQnXSA9ICRyc1sn UG9zdGVkJ107CgkJCQkJCQkJCSRwcmV0ZXh0WydudW1QYWdlcyddID0gMTsKCQkJCQkJCQkJ JHByZXRleHRbJ2lzX2FydGljbGVfbGlzdCddID0gZmFsc2U7CgkJCQkJCQkJCSRtYXRjaCA9 IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdhdXRob3InOgoJ CQkJCQkJCWlmICgkYXV0aG9yID0gc2FmZV9maWVsZCgnbmFtZScsICd0eHBfdXNlcnMnLCAi UmVhbE5hbWUgbGlrZSAnJHVyaV9jJyBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHByZXRleHRf cmVwbGFjZW1lbnRbJ2F1dGhvciddID0gJGF1dGhvcjsKCQkJCQkJCQkJJGNvbnRleHRbXSA9 ICJgQXV0aG9ySURgID0gJyRhdXRob3InIjsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJ CQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2xvZ2luJzoKCQkJCQkJCQlpZiAo JGF1dGhvciA9IHNhZmVfZmllbGQoJ25hbWUnLCAndHhwX3VzZXJzJywgIm5hbWUgbGlrZSAn JHVyaV9jJyBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2F1 dGhvciddID0gJGF1dGhvcjsKCQkJCQkJCQkJJGNvbnRleHRbXSA9ICJgQXV0aG9ySURgID0g JyRhdXRob3InIjsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQli cmVhazsKCQkJCQkJCWNhc2UgJ2N1c3RvbSc6CgkJCQkJCQkJJGN1c3RvbV9vcHRpb25zID0g YXJyYXlfdmFsdWVzKGFycmF5X21hcChhcnJheSgkdGhpcywgImVuY29kZV91cmwiKSwgc2Fm ZV9jb2x1bW4oImN1c3RvbV8kY3VzdG9tIiwgJ3RleHRwYXR0ZXJuJywgImN1c3RvbV8kY3Vz dG9tICE9ICcnIikpKTsKCQkJCQkJCQlpZiAoJHRoaXMtPnByZWYoJ2ZvcmNlX2xvd2VyY2Fz ZV91cmxzJykpCgkJCQkJCQkJCSRjdXN0b21fb3B0aW9ucyA9IGFycmF5X21hcCgic3RydG9s b3dlciIsICRjdXN0b21fb3B0aW9ucyk7CgkJCQkJCQkJaWYgKGluX2FycmF5KCR1cmlfYywg JGN1c3RvbV9vcHRpb25zKSkgewoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0K CQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnZGF0ZSc6CgkJCQkJCQkJaWYgKHByZWdfbWF0 Y2goJy9eXGR7NH1cL1xkezJ9XC9cZHsyfSQvJywgJHVyaV9jKSkgewoJCQkJCQkJCQkkcHJl dGV4dF9yZXBsYWNlbWVudFsnZGF0ZSddID0gc3RyX3JlcGxhY2UoJy8nLCAnLScsICR1cmlf Yyk7CgkJCQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJ CQkJCQljYXNlICd5ZWFyJzoKCQkJCQkJCQlpZiAocHJlZ19tYXRjaCgnL15cZHs0fSQvJywg JHVyaV9jKSkgewoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsneWVhciddID0gJHVy aV9jOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJ CQkJCQkJY2FzZSAnbW9udGgnOgoJCQkJCQkJY2FzZSAnZGF5JzoKCQkJCQkJCQlpZiAocHJl Z19tYXRjaCgnL15cZHsyfSQvJywgJHVyaV9jKSkgewoJCQkJCQkJCQkkcHJldGV4dF9yZXBs YWNlbWVudFskdHlwZV0gPSAkdXJpX2M7CgkJCQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJCQkJ CQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdwYWdlJzoKCQkJCQkJCQlpZiAoaXNf bnVtZXJpYygkdXJpX2MpKSB7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydwZydd ID0gJHVyaV9jOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJy ZWFrOwoJCQkJCQkJY2FzZSAnZmVlZCc6CgkJCQkJCQkJaWYgKGluX2FycmF5KCR1cmlfYywg YXJyYXkoJ3JzcycsICdhdG9tJykpKSB7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50 WyR1cmlfY10gPSAxOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJ CWJyZWFrOwoJCQkJCQkJY2FzZSAnc2VhcmNoJzoKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFj ZW1lbnRbJ3EnXSA9ICR1cmlfYzsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCWJy ZWFrOwoJCQkJCQkJY2FzZSAndGV4dCc6CgkJCQkJCQkJaWYgKCR0aGlzLT5lbmNvZGVfdXJs KCR0ZXh0KSA9PSAkdXJpX2MpIHsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQkJ JHByZXRleHRfcmVwbGFjZW1lbnRbInBlcm1saW5rX3RleHRfeyRuYW1lfSJdID0gJHVyaV9j OwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAncmVnZXgnOgoJCQkJCQkJ CS8vIENoZWNrIHRvIHNlZSBpZiByZWdleCBpcyB2YWxpZCB3aXRob3V0IG91dHB1dHRpbmcg ZXJyb3IgbWVzc2FnZXMuCgkJCQkJCQkJb2Jfc3RhcnQoKTsKCQkJCQkJCQlwcmVnX21hdGNo KCRyZWdleCwgJHVyaV9jLCAkcmVnZXhfbWF0Y2hlcyk7CgkJCQkJCQkJJGlzX3ZhbGlkX3Jl Z2V4ID0gIShvYl9nZXRfY2xlYW4oKSk7CgkJCQkJCQkJaWYgKCRpc192YWxpZF9yZWdleCAm JiBAJHJlZ2V4X21hdGNoZXNbMF0pIHsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJ CQkJJHByZXRleHRfcmVwbGFjZW1lbnRbInBlcm1saW5rX3JlZ2V4X3skbmFtZX0iXSA9ICRy ZWdleF9tYXRjaGVzWzBdOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQl9IC8vIHN3 aXRjaCB0eXBlIGVuZAoKCQkJCQkJLy8gVXBkYXRlIHRoZSBhcnRpY2xlIGNvbnRleHQgc3Ry aW5nCgkJCQkJCSRjb250ZXh0X3N0ciA9IChjb3VudCgkY29udGV4dCkgPiAwID8gJ2FuZCAn LmpvaW4oJyBhbmQgJywgJGNvbnRleHQpIDogJycpOwoKCQkJCQkJJHRoaXMtPmRlYnVnKCgk bWF0Y2ggPT0gdHJ1ZSkgPyAnWUVTJyA6ICdOTycpOwoKCQkJCQkJaWYgKCEkbWF0Y2ggJiYg ISRjbGVhdmVyX3BhcnRpYWxfbWF0Y2gpIHsKCQkJCQkJCS8vIFRoZXJlIGhhc24ndCBiZWVu IGEgbWF0Y2ggb3IgYSBjb21wbGV0ZSBjbGVhdmVyIHBhcnRpYWwgbWF0Y2guIExldHMgdHJ5 IHRvIGJlIGNsZWF2ZXIgYW5kCgkJCQkJCQkvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBjb21w b25lbnQgaXMgZWl0aGVyIGEgdGl0bGUsIHBhZ2Ugb3IgYSBmZWVkLiBUaGlzIG1ha2VzIGl0 IG1vcmUgcHJvYmFibGUKCQkJCQkJCS8vIGEgc3VjY2Vzc2Z1bCBtYXRjaCBmb3IgYSBnaXZl biBwZXJtbGluayBydWxlIG9jY3Vycy4KCQkJCQkJCSR0aGlzLT5kZWJ1ZygnQ2hlY2tpbmcg aWYgIicuJHVyaV9jLiciIGlzIG9mIHR5cGUgInRpdGxlX3BhZ2VfZmVlZCInKTsKCgkJCQkJ CQlpZiAoJHR5cGUgIT0gJ3RpdGxlJyAmJiAkSUQgPSBzYWZlX2ZpZWxkKCdJRCcsICd0ZXh0 cGF0dGVybicsICJgdXJsX3RpdGxlYCBsaWtlICckdXJpX2MnICRjb250ZXh0X3N0ciBhbmQg YFN0YXR1c2AgPj0gNCBsaW1pdCAxIikpIHsKCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVu dFsnaWQnXSA9ICRJRDsKCQkJCQkJCQkkcHJldGV4dFsnbnVtUGFnZXMnXSA9IDE7CgkJCQkJ CQkJJHByZXRleHRbJ2lzX2FydGljbGVfbGlzdCddID0gZmFsc2U7CgkJCQkJCQkJJGNsZWF2 ZXJfcGFydGlhbF9tYXRjaCA9IHRydWU7CgkJCQkJCQl9IGVsc2UgaWYgKCR0aGlzLT5wcmVm KCdjbGVhbl9wYWdlX2FyY2hpdmVfbGlua3MnKSAmJiAkdHlwZSAhPSAncGFnZScgJiYgaXNf bnVtZXJpYygkdXJpX2MpKSB7CgkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3BnJ10g PSAkdXJpX2M7CgkJCQkJCQkJJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9IHRydWU7CgkJCQkJ CQl9IGVsc2UgaWYgKCR0eXBlICE9ICdmZWVkJyAmJiBpbl9hcnJheSgkdXJpX2MsIGFycmF5 KCdyc3MnLCAnYXRvbScpKSkgewoJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WyR1cmlf Y10gPSAxOwoJCQkJCQkJCSRjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggPSB0cnVlOwoJCQkJCQkJ fQoKCQkJCQkJCSR0aGlzLT5kZWJ1ZygoJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9PSB0cnVl KSA/ICdZRVMnIDogJ05PJyk7CgoJCQkJCQkJaWYgKCRjbGVhdmVyX3BhcnRpYWxfbWF0Y2gp IHsKCQkJCQkJCQkkdGhpcy0+Y2xlYXZlcl9wYXJ0aWFsX21hdGNoID0gJHByZXRleHRfcmVw bGFjZW1lbnQ7CgoJCQkJCQkJCS8vIFVuc2V0IHByZXRleHRfcmVwbGFjZW1lbnQgYXMgY2hh bmdlcyBjb3VsZCBvZiBiZWVuIG1hZGUgaW4gYSBwcmVjZWRpbmcgY29tcG9uZW50CgkJCQkJ CQkJdW5zZXQoJHByZXRleHRfcmVwbGFjZW1lbnQpOwoKCQkJCQkJCQkkY2xlYXZlcl9wYXJ0 aWFsX21hdGNoID0gdHJ1ZTsKCQkJCQkJCQljb250aW51ZSAyOwoJCQkJCQkJfQoJCQkJCQl9 CgkJCQkJfSAvLyBjaGVjayB0eXBlIGVuZAoKCQkJCQkvLyBCcmVhayBlYXJseSBpZiB0aGUg Y29tcG9uZW50IGRvZXNuJ3QgbWF0Y2gsIGFzIHRoZXJlIGlzIG5vIHBvaW50IGNvbnRpbnVp bmcKCQkJCQlpZiAoJG1hdGNoID09IGZhbHNlKSB7CgkJCQkJCS8vIFVuc2V0IHByZXRleHRf cmVwbGFjZW1lbnQgYXMgY2hhbmdlcyBjb3VsZCBvZiBiZWVuIG1hZGUgaW4gYSBwcmVjZWRp bmcgY29tcG9uZW50CgkJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50KTsKCQkJCQkJ YnJlYWs7CgkJCQkJfQoJCQkJfSAvLyBmb3JlYWNoIHBlcm1saW5rIGNvbXBvbmVudCBlbmQK CgkJCQlpZiAoJG1hdGNoIHx8ICRwYXJ0aWFsX21hdGNoIHx8ICRjbGVhdmVyX3BhcnRpYWxf bWF0Y2gpIHsKCQkJCQkvLyBFeHRyYWN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBwZXJtbGlu awoJCQkJCUBleHRyYWN0KCRwZXJtbGlua3NbJHByZXRleHRfcmVwbGFjZW1lbnRbJ3Blcm1s aW5rX2lkJ11dWydzZXR0aW5ncyddKTsKCgkJCQkJLy8gQ2hlY2sgdGhlIHBlcm1saW5rIHNl Y3Rpb24gYW5kIGNhdGVnb3J5IGNvbmRpdGlvbnMKCQkJCQlpZiAoKCFlbXB0eSgkY29uX3Nl Y3Rpb24pICYmICRjb25fc2VjdGlvbiAhPSBAJHByZXRleHRfcmVwbGFjZW1lbnRbJ3MnXSkg fHwKCQkJCQkoIWVtcHR5KCRjb25fY2F0ZWdvcnkpICYmICRjb25fY2F0ZWdvcnkgIT0gQCRw cmV0ZXh0X3JlcGxhY2VtZW50WydjJ10pKSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnUGVybWxp bmsgY29uZGl0aW9ucyBmYWlsZWQnKTsKCQkJCQkJaWYgKEAkY29uX3NlY3Rpb24pICAkdGhp cy0+ZGVidWcoJ2Nvbl9zZWN0aW9uID0gJy4gJGNvbl9zZWN0aW9uKTsKCQkJCQkJaWYgKEAk Y29uX2NhdGVnb3J5KSAkdGhpcy0+ZGVidWcoJ2Nvbl9jYXRlZ29yeSA9ICcuICRjb25fY2F0 ZWdvcnkpOwoKCQkJCQkJdW5zZXQoJHByZXRleHRfcmVwbGFjZW1lbnQpOwoJCQkJCX0KCQkJ CQllbHNlIGlmICgkbWF0Y2ggJiYgaXNzZXQoJHByZXRleHRfcmVwbGFjZW1lbnQpKQoJCQkJ CQkkdGhpcy0+ZGVidWcoJ1dlIGhhdmUgYSBtYXRjaCEnKTsKCgkJCQkJZWxzZSBpZiAoJHBh cnRpYWxfbWF0Y2ggJiYgY291bnQoJHRoaXMtPnBhcnRpYWxfbWF0Y2hlcykpCgkJCQkJCSR0 aGlzLT5kZWJ1ZygnV2UgaGF2ZSBhIFwncGFydGlhbCBtYXRjaFwnJyk7CgoJCQkJCWVsc2Ug aWYgKCRjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggJiYgaXNzZXQoJGNsZWF2ZXJfcGFydGlhbF9t YXRjaCkpCgkJCQkJCSR0aGlzLT5kZWJ1ZygnV2UgaGF2ZSBhIFwnY2xlYXZlciBwYXJ0aWFs IG1hdGNoXCcnKTsKCgkJCQkJZWxzZSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnRXJyb3I6IENh blwndCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdHlwZSBtYXRjaCcpOwoJCQkJCQkvLyBUaGlz IHBlcm1saW5rIGhhcyBmYWlsZWQsIGNvbnRpbnVlIGV4ZWN1dGlvbiBvZiB0aGUgZm9yZWFj aCBwZXJtbGlua3MgbG9vcAoJCQkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudCk7CgkJ CQkJfQoJCQkJfQoKCQkJCS8vIFdlIGhhdmUgYSBtYXRjaAoJCQkJaWYgKEAkcHJldGV4dF9y ZXBsYWNlbWVudCkKCQkJCQlicmVhazsKCgkJCX0gLy8gZm9yZWFjaCBwZXJtbGlua3MgZW5k CgoJCQkvLyBJZiB0aGVyZSBpcyBubyBtYXRjaCByZXN0b3JlIHRoZSBtb3N0IGxpa2VseSBw YXJ0aWFsIG1hdGNoLiBTb3J0ZWQgYnkgbnVtYmVyIG9mIGNvbXBvbmVudHMgYW5kIHRoZW4g cHJlY2VkZW5jZQoJCQlpZiAoIUAkcHJldGV4dF9yZXBsYWNlbWVudCAmJiBjb3VudCgkdGhp cy0+cGFydGlhbF9tYXRjaGVzKSkgewoJCQkJJHB0X3NsaWNlID0gYXJyYXlfc2xpY2UoJHRo aXMtPnBhcnRpYWxfbWF0Y2hlcywgLTEpOwoJCQkJJHByZXRleHRfcmVwbGFjZW1lbnQgPSBh cnJheV9zaGlmdCgkcHRfc2xpY2UpOwoJCQl9CgkJCXVuc2V0KCR0aGlzLT5wYXJ0aWFsX21h dGNoZXMpOwoKCQkJLy8gUmVzdG9yZSB0aGUgY2xlYXZlcl9wYXJ0aWFsX21hdGNoIGlmIHRo ZXJlIGlzIG5vIG90aGVyIG1hdGNoZXMKCQkJaWYgKCFAJHByZXRleHRfcmVwbGFjZW1lbnQg JiYgJHRoaXMtPmNsZWF2ZXJfcGFydGlhbF9tYXRjaCkKCQkJCSRwcmV0ZXh0X3JlcGxhY2Vt ZW50ID0gJHRoaXMtPmNsZWF2ZXJfcGFydGlhbF9tYXRjaDsKCQkJdW5zZXQoJHRoaXMtPmNs ZWF2ZXJfcGFydGlhbF9tYXRjaCk7CgoJCQkvLyBFeHRyYWN0IHRoZSBzZXR0aW5ncyBmb3Ig dGhpcyBwZXJtbGluawoJCQlAZXh0cmFjdCgkcGVybWxpbmtzWyRwcmV0ZXh0X3JlcGxhY2Vt ZW50WydwZXJtbGlua19pZCddXVsnc2V0dGluZ3MnXSk7CgoJCQkvLyBJZiBwcmV0ZXh0X3Jl cGxhY2VtZW50IGlzIHN0aWxsIHNldCBoZXJlIHRoZW4gd2UgaGF2ZSBhIG1hdGNoCgkJCWlm IChAJHByZXRleHRfcmVwbGFjZW1lbnQpIHsKCQkJCSR0aGlzLT5kZWJ1ZygnUHJldGV4dCBS ZXBsYWNlbWVudCAnLnByaW50X3IoJHByZXRleHRfcmVwbGFjZW1lbnQsIDEpKTsKCgkJCQlp ZiAoIWVtcHR5KCRkZXNfc2VjdGlvbikpCgkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3Mn XSA9ICRkZXNfc2VjdGlvbjsKCQkJCWlmICghZW1wdHkoJGRlc19jYXRlZ29yeSkpCgkJCQkJ JHByZXRleHRfcmVwbGFjZW1lbnRbJ2MnXSA9ICRkZXNfY2F0ZWdvcnk7CgkJCQlpZiAoIWVt cHR5KCRkZXNfZmVlZCkpCgkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJGRlc19mZWVkXSA9 IDE7CgoJCQkJaWYgKEAkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSAmJiBAJHByZXRleHRf cmVwbGFjZW1lbnRbJ1Bvc3RlZCddKSB7CgkJCQkgCWlmICgkbnAgPSBnZXROZXh0UHJldigk cHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSwgJHByZXRleHRfcmVwbGFjZW1lbnRbJ1Bvc3Rl ZCddLCBAJHByZXRleHRfcmVwbGFjZW1lbnRbJ3MnXSkpCgkJCQkJCSRwcmV0ZXh0X3JlcGxh Y2VtZW50ID0gYXJyYXlfbWVyZ2UoJHByZXRleHRfcmVwbGFjZW1lbnQsICRucCk7CgkJCQl9 CgkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudFsnUG9zdGVkJ10pOwoKCQkJCS8vIElm IHRoZXJlIGlzIGEgbWF0Y2ggdGhlbiB3ZSBtb3N0IHNldCB0aGUgaHR0cCBzdGF0dXMgY29y cmVjdGx5IGFzIHR4cCdzIHByZXRleHQgbWlnaHQgc2V0IGl0IHRvIDQwNAoJCQkJJHByZXRl eHRfcmVwbGFjZW1lbnRbJ3N0YXR1cyddID0gJzIwMCc7CgoJCQkJLy8gU3RvcmUgdGhlIG9y Z2luaWFsIEhUVFAgc3RhdHVzIGNvZGUKCQkJCS8vIFdlIG1pZ2h0IG5lZWQgdG8gbG9nIHRo ZSBwYWdlIGhpdCBpZiBpdCBlcXVhbHMgNDA0CgkJCQkkb3JnaW5pYWxfc3RhdHVzID0gJHBy ZXRleHRbJ3N0YXR1cyddOwoKCQkJCS8vIFR4cCBvbmx5IGxvb2tzIGF0IHRoZSBtb250aCwg YnV0IGR1ZSB0byBob3cgd2UgcGhhc2UgdGhlIG1vbnRoIHdlIGNhbiBtYW5pcHVsYXRlIHRo ZSBzcWwgdG8gb3VyIG5lZWRzCgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnZGF0ZScsICRw cmV0ZXh0X3JlcGxhY2VtZW50KSkgewoJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50Wydtb250 aCddID0gJHByZXRleHRfcmVwbGFjZW1lbnRbJ2RhdGUnXTsKCQkJCQl1bnNldCgkcHJldGV4 dF9yZXBsYWNlbWVudFsnZGF0ZSddKTsKCQkJCX0gZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0 cygneWVhcicsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSB8fAoJCQkJYXJyYXlfa2V5X2V4aXN0 cygnbW9udGgnLCAkcHJldGV4dF9yZXBsYWNlbWVudCkgfHwKCQkJCWFycmF5X2tleV9leGlz dHMoJ2RheScsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkgewoJCQkJCSRtb250aCA9ICcnOwoJ CQkJCSRtb250aCAuPSAoYXJyYXlfa2V5X2V4aXN0cygneWVhcicsICRwcmV0ZXh0X3JlcGxh Y2VtZW50KSkKCQkJCQkJPyAkcHJldGV4dF9yZXBsYWNlbWVudFsneWVhciddLictJyA6ICdf X19fLSc7CgkJCQkJJG1vbnRoIC49IChhcnJheV9rZXlfZXhpc3RzKCdtb250aCcsICRwcmV0 ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAkcHJldGV4dF9yZXBsYWNlbWVudFsnbW9udGgn XS4nLScgOiAnX18tJzsKCQkJCQkkbW9udGggLj0gKGFycmF5X2tleV9leGlzdHMoJ2RheScs ICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAkcHJldGV4dF9yZXBsYWNlbWVudFsn ZGF5J10uJyAnIDogJ19fICc7CgoJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50Wydtb250aCdd ID0gJG1vbnRoOwoJCQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50Wyd5ZWFyJ10pOwoJ CQkJCXVuc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50WydkYXknXSk7CgkJCQl9CgoJCQkJLy8g U2VjdGlvbiBuZWVkcyB0byBiZSBkZWZpbmVkIHNvIHdlIGNhbiBhbHdheXMgZ2V0IGEgcGFn ZSB0ZW1wbGF0ZS4KCQkJCWlmICghYXJyYXlfa2V5X2V4aXN0cygncycsICRwcmV0ZXh0X3Jl cGxhY2VtZW50KSkKCQkJCXsKCQkJCQlpZiAoIUAkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQn XSkKCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3MnXSA9ICdkZWZhdWx0JzsKCQkJCQll bHNlCgkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydzJ10gPSBzYWZlX2ZpZWxkKCdTZWN0 aW9uJywgJ3RleHRwYXR0ZXJuJywgJ0lEID0gJy4kcHJldGV4dF9yZXBsYWNlbWVudFsnaWQn XSk7CgkJCQl9CgoJCQkJLy8gU2V0IHRoZSBjc3MgYW5kIHBhZ2UgdGVtcGxhdGUsIG90aGVy d2lzZSB3ZSBnZXQgYW4gdW5rbm93biBzZWN0aW9uCgkJCQkkc2VjdGlvbl9zZXR0aW5ncyA9 IHNhZmVfcm93KCdjc3MsIHBhZ2UnLCAndHhwX3NlY3Rpb24nLCAibmFtZSA9ICd7JHByZXRl eHRfcmVwbGFjZW1lbnRbJ3MnXX0nIGxpbWl0IDEiKTsKCQkJCSRwcmV0ZXh0X3JlcGxhY2Vt ZW50WydwYWdlJ10gPSAoQCRkZXNfcGFnZSkgPyAkZGVzX3BhZ2UgOiAkc2VjdGlvbl9zZXR0 aW5nc1sncGFnZSddOwoJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2NzcyddICA9ICRzZWN0 aW9uX3NldHRpbmdzWydjc3MnXTsKCgkJCQkkdGhpcy0+bWF0Y2hlZF9wZXJtbGluayA9ICRw cmV0ZXh0X3JlcGxhY2VtZW50OwoKCQkJCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCgkJCQlp ZiAoaW5fYXJyYXkoJHByZWZzWydwZXJtbGlua19tb2RlJ10sIGFycmF5KCdpZF90aXRsZScs ICdzZWN0aW9uX2lkX3RpdGxlJykpICYmIEAkcHJldGV4dF9yZXBsYWNlbWVudFsncGcnXSAm JiAhQCRwcmV0ZXh0X3JlcGxhY2VtZW50WydpZCddKSB7CgkJCQkJJHByZXRleHRfcmVwbGFj ZW1lbnRbJ2lkJ10gPSAnJzsKCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsnaXNfYXJ0aWNs ZV9saXN0J10gPSB0cnVlOwoJCQkJfQoKCQkJCS8vIE1lcmdlIHByZXRleHRfcmVwbGFjZW1l bnQgd2l0aCBwcmV0ZXh0CgkJCQkkcHJldGV4dCA9IGFycmF5X21lcmdlKCRwcmV0ZXh0LCAk cHJldGV4dF9yZXBsYWNlbWVudCk7CgoJCQkJaWYgKGlzX251bWVyaWMoQCRwcmV0ZXh0Wydp ZCddKSkgewoJCQkJCSRhID0gc2FmZV9yb3coJyosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkg YXMgdVBvc3RlZCwgdW5peF90aW1lc3RhbXAoRXhwaXJlcykgYXMgdUV4cGlyZXMsIHVuaXhf dGltZXN0YW1wKExhc3RNb2QpIGFzIHVMYXN0TW9kJywgJ3RleHRwYXR0ZXJuJywgJ0lEPScu aW50dmFsKCRwcmV0ZXh0WydpZCddKS4nIGFuZCBTdGF0dXMgPj0gNCcpOwoJCQkJCXBvcHVs YXRlQXJ0aWNsZURhdGEoJGEpOwoJCQkJfQoKCQkJCS8vIEV4cG9ydCByZXF1aXJlZCB2YWx1 ZXMgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UKCQkJCWZvcmVhY2ggKGFycmF5KCdpZCcsICdz JywgJ2MnLCAncGcnLCAnaXNfYXJ0aWNsZV9saXN0JywgJ3ByZXZfaWQnLCAncHJldl90aXRs ZScsICduZXh0X2lkJywgJ25leHRfdGl0bGUnLCAnY3NzJykgYXMgJGtleSkgewoJCQkJCWlm IChhcnJheV9rZXlfZXhpc3RzKCRrZXksICRwcmV0ZXh0KSkKCQkJCQkJJEdMT0JBTFNbJGtl eV0gPSAkcHJldGV4dFska2V5XTsKCQkJCX0KCgkJCQlpZiAoY291bnQoJHRoaXMtPm1hdGNo ZWRfcGVybWxpbmspIHx8IEAkbXRfcmVkaXJlY3QpIHsKCQkJCQkkcGxfaW5kZXggPSAkcHJl dGV4dFsncGVybWxpbmtfaWQnXTsKCQkJCQlpZiAoIUAkbXRfcmVkaXJlY3QgfHwgISR0aGlz LT5wcmVmKCdyZWRpcmVjdF9tdF9zdHlsZV9saW5rcycpKSB7CgkJCQkJCSRwbCA9ICR0aGlz LT5nZXRfcGVybWxpbmsoJHByZXRleHRbJ3Blcm1saW5rX2lkJ10pOwoJCQkJCQkkcGxfaW5k ZXggPSBAJHBsWydzZXR0aW5ncyddWydkZXNfcGVybWxpbmsnXTsKCQkJCQl9CgoJCQkJCWlm IChAJHByZXRleHRbJ2lkJ10gJiYgJHBsX2luZGV4KSB7CgkJCQkJCWlmIChjb3VudCgkdGhp cy0+Z2V0X3Blcm1saW5rKCRwbF9pbmRleCkpID4gMCkgewoJCQkJCQkJb2JfY2xlYW4oKTsK CQkJCQkJCWdsb2JhbCAkc2l0ZXVybDsKCQkJCQkJCSRycyA9IHNhZmVfcm93KCcqLCBJRCBh cyB0aGlzaWQsIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgcG9zdGVkJywgJ3RleHRwYXR0 ZXJuJywgIklEID0gJ3skcHJldGV4dFsnaWQnXX0nIik7CgkJCQkJCQkkaG9zdCA9IHJ0cmlt KHN0cl9yZXBsYWNlKHJ0cmltKGRvU3RyaXAoJHByZXRleHRbJ3N1YnBhdGgnXSksICcvJyks ICcnLCBodSksICcvJyk7CgkJCQkJCQkkdGhpcy0+cmVkaXJlY3QoJGhvc3QuJHRoaXMtPl9w ZXJtbGlua3VybCgkcnMsIFBFUk1MSU5LVVJMLCAkcGxfaW5kZXgpLCAkdGhpcy0+cHJlZign cGVybWxpbmtfcmVkaXJlY3RfaHR0cF9zdGF0dXMnKSk7CgkJCQkJCX0KCQkJCQl9IGVsc2Ug aWYgKCR1cmwgPSBAJHBsWydzZXR0aW5ncyddWydkZXNfbG9jYXRpb24nXSkgewoJCQkJCQlv Yl9jbGVhbigpOwoJCQkJCQkkdGhpcy0+cmVkaXJlY3QoJHVybCwgJHRoaXMtPnByZWYoJ3Vy bF9yZWRpcmVjdF9odHRwX3N0YXR1cycpKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKEAkcHJl dGV4dFsncnNzJ10pIHsKCQkJCQlpZiAoQCRwcmV0ZXh0WydzJ10pCgkJCQkJCSRfUE9TVFsn c2VjdGlvbiddID0gJHByZXRleHRbJ3MnXTsKCQkJCQlpZiAoQCRwcmV0ZXh0WydjJ10pCgkJ CQkJCSRfUE9TVFsnY2F0ZWdvcnknXSA9ICRwcmV0ZXh0WydjJ107CgkJCQkJb2JfY2xlYW4o KTsKCQkJCQlpbmNsdWRlIHR4cGF0aC4nL3B1Ymxpc2gvcnNzLnBocCc7CgkJCQkJZXhpdChy c3MoKSk7CgkJCQl9CgoJCQkJaWYgKEAkcHJldGV4dFsnYXRvbSddKSB7CgkJCQkJaWYgKEAk cHJldGV4dFsncyddKQoJCQkJCQkkX1BPU1RbJ3NlY3Rpb24nXSA9ICRwcmV0ZXh0WydzJ107 CgkJCQkJaWYgKEAkcHJldGV4dFsnYyddKQoJCQkJCQkkX1BPU1RbJ2NhdGVnb3J5J10gPSAk cHJldGV4dFsnYyddOwoJCQkJCW9iX2NsZWFuKCk7CgkJCQkJaW5jbHVkZSB0eHBhdGguJy9w dWJsaXNoL2F0b20ucGhwJzsKCQkJCQlleGl0KGF0b20oKSk7CgkJCQl9CgoJCQkJJHRoaXMt PmRlYnVnKCdQcmV0ZXh0ICcucHJpbnRfcigkcHJldGV4dCwgMSkpOwoJCQl9IGVsc2UgewoJ CQkJJHRoaXMtPmRlYnVnKCdOTyBDSEFOR0VTIE1BREUnKTsKCQkJfQoKCQkJLy8gTG9nIHRo aXMgcGFnZSBoaXQKCQkJaWYgKEAkb3JnaW5pYWxfc3RhdHVzID09IDQwNCkKCQkJCWxvZ19o aXQoJHByZXRleHRbJ3N0YXR1cyddKTsKCgkJCS8vIFN0YXJ0IG91dHB1dCBidWZmZXJpbmcg YW5kIHBzZXVkbyBjYWxsYmFjayB0byB0ZXh0cGF0dGVybl9lbmQKCQkJb2Jfc3RhcnQoYXJy YXkoJiR0aGlzLCAnX3RleHRwYXR0ZXJuX2VuZF9jYWxsYmFjaycpKTsKCgkJCS8vIFR4UCA0 LjAuNSAocjI0MzYpIGludHJvZHVjZWQgdGhlIHRleHRwYXR0ZXJuX2VuZCBjYWxsYmFjayBt YWtpbmcgdGhlIGZvbGxvd2luZyByZWR1bmRhbnQKCQkJJHZlcnNpb24gPSBhcnJheV9zdW0o YXJyYXlfbWFwKAoJCQkJY3JlYXRlX2Z1bmN0aW9uKCckbGluZScsICdpZiAocHJlZ19tYXRj aChcJy9eXCQnLidMYXN0Q2hhbmdlZFJldmlzaW9uOiAoXHcrKSBcJC9cJywgJGxpbmUsICRt YXRjaCkpIHJldHVybiAkbWF0Y2hbMV07JyksCgkJCQlAZmlsZSh0eHBhdGggLiAnL3B1Ymxp c2gucGhwJykKCQkJKSk7CgkJCWlmICgkdmVyc2lvbiA+PSAnMjQzNicpIHJldHVybjsKCgkJ CS8vIFJlbW92ZSB0aGUgcGx1Z2luIGNhbGxiYWNrcyB3aGljaCBoYXZlIGFscmVhZHkgYmVl biBjYWxsZWQKCQkJZnVuY3Rpb24gZmlsdGVyX2NhbGxiYWNrcygkYykgewoJCQkJaWYgKCRj WydldmVudCddIT0ndGV4dHBhdHRlcm4nKSByZXR1cm4gdHJ1ZTsKCQkJCWlmIChAJGNbJ2Z1 bmN0aW9uJ11bMF0tPnBsdWdpbl9uYW1lID09ICdnYnBfcGVybWFuZW50X2xpbmtzJyAmJgoJ CQkJCQlAJGNbJ2Z1bmN0aW9uJ11bMV0gPT0gJ190ZXh0cGF0dGVybicpCgkJCQl7CgkJCQkJ JEdMT0JBTFNbJ2dicF9mb3VuZF9zZWxmJ10gPSB0cnVlOwoJCQkJCXJldHVybiBmYWxzZTsK CQkJCX0KCQkJCXJldHVybiBAJEdMT0JBTFNbJ2dicF9mb3VuZF9zZWxmJ107CgkJCX0KCQkJ JHBsdWdpbl9jYWxsYmFjayA9IGFycmF5X2ZpbHRlcigkcGx1Z2luX2NhbGxiYWNrLCAnZmls dGVyX2NhbGxiYWNrcycpOwoJCQl1bnNldCgkR0xPQkFMU1snZ2JwX2ZvdW5kX3NlbGYnXSk7 CgoJCQkvLyBSZS1jYWxsIHRleHRwYXR0ZXJuCgkJCXRleHRwYXR0ZXJuKCk7CgoJCQkvLyBD YWxsIGN1c3RvbSB0ZXh0cGF0dGVybl9lbmQgY2FsbGJhY2sKCQkJJHRoaXMtPl90ZXh0cGF0 dGVybl9lbmQoKTsKCgkJCS8vIHRleHRwYXR0ZXJuKCkgaGFzIHJ1biwga2lsbCB0aGUgY29u bmVjdGlvbgoJCQlkaWUoKTsKCQl9CgoJfSAvLyBmdW5jdGlvbiBfdGV4dHBhdHRlcm4gZW5k CgoJZnVuY3Rpb24gX3RleHRwYXR0ZXJuX2VuZCAoKSB7CgkJLy8gUmVkaXJlY3QgdG8gYSA0 MDQgaWYgdGhlIHBhZ2UgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG51bWJlciBv ZiBwYWdlcwoJCS8vIEhhcyB0byBiZSBhZnRlciB0ZXh0cGF0dGVybigpIGFzICR0aGlzcGFn ZSBpcyBzZXQgZHVyaW5nIDx0eHA6YXJ0aWNsZSAvPgoJCWdsb2JhbCAkdGhpc3BhZ2UsICRw cmV0ZXh0OwoJCWlmICgoQCRwcmV0ZXh0WydwZyddICYmIGlzc2V0KCR0aGlzcGFnZSkpICYm CgkJKCR0aGlzcGFnZVsnbnVtUGFnZXMnXSA8ICRwcmV0ZXh0WydwZyddKSkgewoJCQlvYl9l bmRfY2xlYW4oKTsKCQkJdHhwX2RpZShnVHh0KCc0MDRfbm90X2ZvdW5kJyksICc0MDQnKTsK CQl9CgoJCS8vIFN0b3Agb3V0cHV0IGJ1ZmZlcmluZywgdGhpcyBzZW5kcyB0aGUgYnVmZmVy IHRvIF90ZXh0cGF0dGVybl9lbmRfY2FsbGJhY2soKQoJCXdoaWxlIChAb2JfZW5kX2ZsdXNo KCkpOwoKCX0gLy8gZnVuY3Rpb24gX3RleHRwYXR0ZXJuX2VuZCBlbmQKCglmdW5jdGlvbiBf dGV4dHBhdHRlcm5fZW5kX2NhbGxiYWNrICgkaHRtbCwgJG92ZXJyaWRlID0gJycpIHsKCQln bG9iYWwgJHByZXRleHQsICRwcm9kdWN0aW9uX3N0YXR1czsKCgkJaWYgKCRvdmVycmlkZSkg JHByZXRleHRbJ3Blcm1saW5rX292ZXJyaWRlJ10gPSAkb3ZlcnJpZGU7CgkJJGh0bWwgPSBw cmVnX3JlcGxhY2VfY2FsbGJhY2soCgkJCSclaHJlZj0iKCcuaHUuJ3xcPykoW14iXSopIiUn LAoJCQlhcnJheSgmJHRoaXMsICdfcGFnZWxpbmt1cmwnKSwKCQkJJGh0bWwKCQkpOwoJCXVu c2V0KCRwcmV0ZXh0WydwZXJtbGlua19vdmVycmlkZSddKTsKCgkJaWYgKCR0aGlzLT5wcmVm KCdkZWJ1ZycpICYmIGluX2FycmF5KCRwcm9kdWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVn JywgJ3Rlc3RpbmcnKSkpIHsKCQkJJGRlYnVnID0gam9pbihuLCAkdGhpcy0+YnVmZmVyX2Rl YnVnKTsKCQkJJHRoaXMtPmJ1ZmZlcl9kZWJ1ZyA9IGFycmF5KCk7CgkJCWlmICgkZGVidWcp CgkJCQkkaHRtbCA9IGNvbW1lbnQobi4kZGVidWcubikgLiAkaHRtbDsKCQl9CgoJCXJldHVy biAkaHRtbDsKCX0gLy8gZnVuY3Rpb24gX3RleHRwYXR0ZXJuX2VuZF9jYWxsYmFjayBlbmQK CglmdW5jdGlvbiBjaGVja19wZXJtbGlua19jb25kaXRpb25zICgkcGwsICRhcnRpY2xlX2Fy cmF5KSB7CgkJaWYgKGVtcHR5KCRhcnRpY2xlX2FycmF5WydzZWN0aW9uJ10pKSAkYXJ0aWNs ZV9hcnJheVsnc2VjdGlvbiddID0gQCRhcnRpY2xlX2FycmF5WydTZWN0aW9uJ107CgkJaWYg KGVtcHR5KCRhcnRpY2xlX2FycmF5WydjYXRlZ29yeTEnXSkpICRhcnRpY2xlX2FycmF5Wydj YXRlZ29yeTEnXSA9IEAkYXJ0aWNsZV9hcnJheVsnQ2F0ZWdvcnkxJ107CgkJaWYgKGVtcHR5 KCRhcnRpY2xlX2FycmF5WydjYXRlZ29yeTInXSkpICRhcnRpY2xlX2FycmF5WydjYXRlZ29y eTInXSA9IEAkYXJ0aWNsZV9hcnJheVsnQ2F0ZWdvcnkyJ107CgoJCWlmIChAJHBsWydzZXR0 aW5ncyddWydjb25fY2F0ZWdvcnknXSAmJiAoJHBsWydzZXR0aW5ncyddWydjb25fY2F0ZWdv cnknXSAhPSAkYXJ0aWNsZV9hcnJheVsnY2F0ZWdvcnkxJ10gfHwgJHBsWydzZXR0aW5ncydd Wydjb25fY2F0ZWdvcnknXSAhPSAkYXJ0aWNsZV9hcnJheVsnY2F0ZWdvcnkyJ10pKQoJCQly ZXR1cm4gZmFsc2U7CgkJaWYgKEAkcGxbJ3NldHRpbmdzJ11bJ2Nvbl9zZWN0aW9uJ10gJiYg JHBsWydzZXR0aW5ncyddWydjb25fc2VjdGlvbiddICE9ICRhcnRpY2xlX2FycmF5WydzZWN0 aW9uJ10pCgkJCXJldHVybiBmYWxzZTsKCgkJcmV0dXJuIHRydWU7Cgl9CgoJZnVuY3Rpb24g X3Blcm1saW5rdXJsICgkYXJ0aWNsZV9hcnJheSwgJHR5cGUgPSBQRVJNTElOS1VSTCwgJHBs X2luZGV4ID0gTlVMTCkgewoJCWdsb2JhbCAkcHJldGV4dCwgJHByZWZzLCAkcHJvZHVjdGlv bl9zdGF0dXM7CgoJCWlmICgkdHlwZSA9PSBQQUdFTElOS1VSTCkKCQkJcmV0dXJuICR0aGlz LT50b2dnbGVfY3VzdG9tX3VybF9mdW5jKCdwYWdlbGlua3VybCcsICRhcnRpY2xlX2FycmF5 KTsKCgkJaWYgKGVtcHR5KCRhcnRpY2xlX2FycmF5KSkgcmV0dXJuOwoKCQlpZiAoJHBsX2lu ZGV4KQoJCQkkcGwgPSAkdGhpcy0+Z2V0X3Blcm1saW5rKCRwbF9pbmRleCk7CgkJZWxzZSB7 CgkJCS8vIEdldCB0aGUgbWF0Y2hlZCBwcmV0ZXh0IHJlcGxhY2VtZW50IGFycmF5LgoJCQkk bWF0Y2hlZCA9IChjb3VudCgkdGhpcy0+bWF0Y2hlZF9wZXJtbGluaykpCgkJCT8gJHRoaXMt Pm1hdGNoZWRfcGVybWxpbmsKCQkJOiBAYXJyYXlfc2hpZnQoYXJyYXlfc2xpY2UoJHRoaXMt PnBhcnRpYWxfbWF0Y2hlcywgLTEpKTsKCgkJCWlmICghaXNzZXQoJHBsKSAmJiAkbWF0Y2hl ZCAmJiBhcnJheV9rZXlfZXhpc3RzKCdpZCcsICRtYXRjaGVkKSkgewoJCQkJLy8gVGhlIHBl cm1saW5rIGlkIGlzIHN0b3JlZCBpbiB0aGUgcHJldGV4dCByZXBsYWNlbWVudCBhcnJheSwg c28gd2UgY2FuIGZpbmQgdGhlIHBlcm1saW5rLgoJCQkJJHBsID0gJHRoaXMtPmdldF9wZXJt bGluaygkbWF0Y2hlZFsncGVybWxpbmtfaWQnXSk7CgkJCQlmb3JlYWNoICgkcGxbJ2NvbXBv bmVudHMnXSBhcyAkcGxfYykKCQkJCQlpZiAoaW5fYXJyYXkoJHBsX2NbJ3R5cGUnXSwgYXJy YXkoJ2ZlZWQnLCAncGFnZScpKSB8fCAhJHRoaXMtPmNoZWNrX3Blcm1saW5rX2NvbmRpdGlv bnMoJHBsLCAkYXJ0aWNsZV9hcnJheSkpIHsKCQkJCQkJdW5zZXQoJHBsKTsKCQkJCQkJYnJl YWs7CgkJCQkJfQoJCQl9CgoJCQlpZiAoIWlzc2V0KCRwbCkpIHsKCQkJCS8vIFdlIGhhdmUg bm8gcGVybWxpbmsgaWQgc28gZ3JhYiB0aGUgcGVybWxpbmsgd2l0aCB0aGUgaGlnaGVzdCBw cmVjZWRlbmNlLgoJCQkJJHBlcm1saW5rcyA9ICR0aGlzLT5nZXRfYWxsX3Blcm1saW5rcygx LCBhcnJheSgnZmVlZCcsICdwYWdlJykpOwoJCQkJZm9yZWFjaCAoJHBlcm1saW5rcyBhcyAk a2V5ID0+ICRwbCkKCQkJCQlpZiAoISR0aGlzLT5jaGVja19wZXJtbGlua19jb25kaXRpb25z KCRwbCwgJGFydGljbGVfYXJyYXkpKQoJCQkJCQl1bnNldCgkcGVybWxpbmtzWyRrZXldKTsK CQkJCSRwbCA9IGFycmF5X3NoaWZ0KCRwZXJtbGlua3MpOwoJCQl9CgkJfQoKCQkkdXJpID0g Jyc7CgoJCWlmIChpc19hcnJheSgkcGwpICYmIGFycmF5X2tleV9leGlzdHMoJ2NvbXBvbmVu dHMnLCAkcGwpKSB7CgkJCWV4dHJhY3QoJGFydGljbGVfYXJyYXkpOwoKCQkJaWYgKCFpc3Nl dCgkdGl0bGUpKSAkdGl0bGUgPSAkVGl0bGU7CgkJCWlmIChlbXB0eSgkdXJsX3RpdGxlKSkg JHVybF90aXRsZSA9IHN0cmlwU3BhY2UoJHRpdGxlKTsKCQkJaWYgKGVtcHR5KCRzZWN0aW9u KSkgJHNlY3Rpb24gPSAkU2VjdGlvbjsKCQkJaWYgKGVtcHR5KCRwb3N0ZWQpKSAkcG9zdGVk ID0gJFBvc3RlZDsKCQkJaWYgKGVtcHR5KCRhdXRob3JpZCkpICRhdXRob3JpZCA9IEAkQXV0 aG9ySUQ7CgkJCWlmIChlbXB0eSgkY2F0ZWdvcnkxKSkgJGNhdGVnb3J5MSA9IEAkQ2F0ZWdv cnkxOwoJCQlpZiAoZW1wdHkoJGNhdGVnb3J5MikpICRjYXRlZ29yeTIgPSBAJENhdGVnb3J5 MjsKCQkJaWYgKGVtcHR5KCR0aGlzaWQpKSAkdGhpc2lkID0gJElEOwoKCQkJJHBsX2NvbXBv bmVudHMgPSAkcGxbJ2NvbXBvbmVudHMnXTsKCgkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGVy ZSBpcyBhIHRpdGxlIGNvbXBvbmVudC4KCQkJJHRpdGxlID0gZmFsc2U7CgkJCWZvcmVhY2go JHBsX2NvbXBvbmVudHMgYXMgJHBsX2MpCgkJCQlpZiAoJHBsX2NbJ3R5cGUnXSA9PSAndGl0 bGUnIHx8ICRwbF9jWyd0eXBlJ10gPT0gJ2lkJykKCQkJCQkkdGl0bGUgPSB0cnVlOwoKCQkJ Ly8gSWYgdGhlcmUgaXNuJ3QgYSB0aXRsZSBjb21wb25lbnQgdGhlbiB3ZSBuZWVkIHRvIGFw cGVuZCBvbmUgdG8gdGhlIGVuZCBvZiB0aGUgVVJJCgkJCWlmICghJHRpdGxlICYmICR0aGlz LT5wcmVmKCdhdXRvbWF0aWNhbGx5X2FwcGVuZF90aXRsZScpKQoJCQkJJHBsX2NvbXBvbmVu dHNbXSA9IGFycmF5KCd0eXBlJyA9PiAndGl0bGUnLCAncHJlZml4JyA9PiAnJywgJ3N1ZmZp eCcgPT4gJycsICdyZWdleCcgPT4gJycsICd0ZXh0JyA9PiAnJyk7CgoJCQkkdXJpID0gcnRy aW0oZG9TdHJpcChAJHByZXRleHRbJ3N1YnBhdGgnXSksICcvJyk7CgkJCWZvcmVhY2ggKCRw bF9jb21wb25lbnRzIGFzICRwbF9jKSB7CgkJCQkkdXJpIC49ICcvJzsKCgkJCQkkdHlwZSA9 ICRwbF9jWyd0eXBlJ107CgkJCQlzd2l0Y2ggKCR0eXBlKSB7CgkJCQkJY2FzZSAnY2F0ZWdv cnknOgoJCQkJCQlpZiAoIUAkcGxfY1snY2F0ZWdvcnknXSkgJHBsX2NbJ2NhdGVnb3J5J10g PSAxOwoJCQkJCQkkcHJpbWFyeSA9ICdjYXRlZ29yeScuICRwbF9jWydjYXRlZ29yeSddOwoJ CQkJCQkkc2Vjb25kYXJ5ID0gJ2NhdGVnb3J5Jy4gKDMtKGludCkkcGxfY1snY2F0ZWdvcnkn XSk7CgkJCQkJCSRjaGVja19jb250ZXh0ID0gKCR0aGlzLT5wcmVmKCdqb2luX3ByZXRleHRf dG9fcGFnZWxpbmtzJykgJiYgJHRoaXMtPnByZWYoJ2NoZWNrX3ByZXRleHRfY2F0ZWdvcnlf Y29udGV4dCcpKTsKCQkJCQkJaWYgKCEkY2hlY2tfY29udGV4dCB8fCAkJHByaW1hcnkgPT0g JHByZXRleHRbJ2MnXSkKCQkJCQkJCSR1cmlfYyA9ICQkcHJpbWFyeTsKCQkJCQkJZWxzZSBp ZiAoISRjaGVja19jb250ZXh0IHx8ICQkc2Vjb25kYXJ5ID09ICRwcmV0ZXh0WydjJ10pCgkJ CQkJCQkkdXJpX2MgPSAkJHNlY29uZGFyeTsKCQkJCQkJZWxzZSBpZiAoJHRoaXMtPnByZWYo J2RlYnVnJykgJiYgaW5fYXJyYXkoJHByb2R1Y3Rpb25fc3RhdHVzLCBhcnJheSgnZGVidWcn LCAndGVzdGluZycpKSkKCQkJCQkJCSR1cmlfYyA9ICctLUlOVkFMSURfQ0FURUdPUlktLSc7 CgkJCQkJCWVsc2UgewoJCQkJCQkJdW5zZXQoJHVyaSk7CgkJCQkJCQlicmVhayAyOwoJCQkJ CQl9CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnc2VjdGlvbic6CgkJCQkJCSRjaGVja19jb250 ZXh0ID0gKCR0aGlzLT5wcmVmKCdqb2luX3ByZXRleHRfdG9fcGFnZWxpbmtzJykgJiYgJHRo aXMtPnByZWYoJ2NoZWNrX3ByZXRleHRfc2VjdGlvbl9jb250ZXh0JykpOwoJCQkJCQlpZiAo ISRjaGVja19jb250ZXh0IHx8ICRzZWN0aW9uID09ICRwcmV0ZXh0WydzJ10pCgkJCQkJCQkk dXJpX2MgPSAkc2VjdGlvbjsKCQkJCQkJZWxzZSB7CgkJCQkJCQl1bnNldCgkdXJpKTsKCQkJ CQkJCWJyZWFrIDI7CgkJCQkJCX0KCQkJCQlicmVhazsKCQkJCQljYXNlICd0aXRsZSc6ICR1 cmlfYyA9ICR1cmxfdGl0bGU7IGJyZWFrOwoJCQkJCWNhc2UgJ2lkJzogJHVyaV9jID0gJHRo aXNpZDsgYnJlYWs7CgkJCQkJY2FzZSAnYXV0aG9yJzogJHVyaV9jID0gc2FmZV9maWVsZCgn UmVhbE5hbWUnLCAndHhwX3VzZXJzJywgIm5hbWUgbGlrZSAneyRhdXRob3JpZH0nIik7IGJy ZWFrOwoJCQkJCWNhc2UgJ2xvZ2luJzogJHVyaV9jID0gJGF1dGhvcmlkOyBicmVhazsKCQkJ CQljYXNlICdkYXRlJzogJHVyaV9jID0gZXhwbG9kZSgnLycsIGRhdGUoJ1kvbS9kJywgJHBv c3RlZCkpOyBicmVhazsKCQkJCQljYXNlICd5ZWFyJzogJHVyaV9jID0gZGF0ZSgnWScsICRw b3N0ZWQpOyBicmVhazsKCQkJCQljYXNlICdtb250aCc6ICR1cmlfYyA9IGRhdGUoJ20nLCAk cG9zdGVkKTsgYnJlYWs7CgkJCQkJY2FzZSAnZGF5JzogJHVyaV9jID0gZGF0ZSgnZCcsICRw b3N0ZWQpOyBicmVhazsKCQkJCQljYXNlICdjdXN0b20nOgoJCQkJCQlpZiAoJHVyaV9jID0g QCRhcnRpY2xlX2FycmF5WyRwcmVmc1siY3VzdG9tX3skcGxfY1snY3VzdG9tJ119X3NldCJd XSk7CgkJCQkJCWVsc2UgaWYgKCR1cmlfYyA9IEAkYXJ0aWNsZV9hcnJheVsiY3VzdG9tX3sk cGxfY1snY3VzdG9tJ119Il0pOwoJCQkJCQllbHNlIGlmICgkdGhpcy0+cHJlZignZGVidWcn KSAmJiBpbl9hcnJheSgkcHJvZHVjdGlvbl9zdGF0dXMsIGFycmF5KCdkZWJ1ZycsICd0ZXN0 aW5nJykpKQoJCQkJCQkJJHVyaV9jID0gJy0tVU5TRVRfQ1VTVE9NX0ZJRUxELS0nOwoJCQkJ CQllbHNlIHsKCQkJCQkJCXVuc2V0KCR1cmkpOwoJCQkJCQkJYnJlYWsgMjsKCQkJCQkJfQoJ CQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3RleHQnOiAkdXJpX2MgPSAkcGxfY1sndGV4dCddOyBi cmVhazsKCQkJCQljYXNlICdyZWdleCc6CgkJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiByZWdl eCBpcyB2YWxpZCB3aXRob3V0IG91dHB1dHRpbmcgZXJyb3IgbWVzc2FnZXMuCgkJCQkJCW9i X3N0YXJ0KCk7CgkJCQkJCXByZWdfbWF0Y2goJHBsX2NbJ3JlZ2V4J10sICRwbF9jWydyZWdl eCddLCAkcmVnZXhfbWF0Y2hlcyk7CgkJCQkJCSRpc192YWxpZF9yZWdleCA9ICEob2JfZ2V0 X2NsZWFuKCkpOwoJCQkJCQlpZiAoJGlzX3ZhbGlkX3JlZ2V4KSB7CgkJCQkJCQkka2V5ID0g InBlcm1saW5rX3JlZ2V4X3skcGxfY1snbmFtZSddfSI7CgkJCQkJCQkkdXJpX2MgPSAoYXJy YXlfa2V5X2V4aXN0cygka2V5LCAkcHJldGV4dCkpID8gJHByZXRleHRbJGtleV0gOiAkcmVn ZXhfbWF0Y2hlc1swXTsKCQkJCQkJfSBlbHNlIGlmICgkdGhpcy0+cHJlZignZGVidWcnKSkK CQkJCQkJCSR1cmlfYyA9ICctLUlOVkFMSURfUkVHRVgtLSc7CgkJCQkJYnJlYWs7CgkJCQl9 CgoJCQkJaWYgKGVtcHR5KCR1cmlfYykpCgkJCQkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1Zycp ICYmIGluX2FycmF5KCRwcm9kdWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3Rp bmcnKSkpCgkJCQkJCSR1cmlfYyA9ICctLVBFUk1MSU5LX0ZPUk1BVF9FUlJPUi0tJzsKCQkJ CQllbHNlIHsKCQkJCQkJdW5zZXQoJHVyaSk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCgkJCQlp ZiAoQCRwbF9jWydwcmVmaXgnXSkKCQkJCQkkdXJpIC49ICR0aGlzLT5lbmNvZGVfdXJsKCRw bF9jWydwcmVmaXgnXSk7CgoJCQkJaWYgKGlzX2FycmF5KCR1cmlfYykpIHsKCQkJCQlmb3Jl YWNoICgkdXJpX2MgYXMgJHVyaV9jMikKCQkJCQkJJHVyaSAuPSAkdGhpcy0+ZW5jb2RlX3Vy bCgkdXJpX2MyKSAuICcvJzsKCQkJCQkkdXJpID0gcnRyaW0oJHVyaSwgJy8nKTsKCQkJCX0g ZWxzZQoJCQkJCSR1cmkgLj0gJHRoaXMtPmVuY29kZV91cmwoJHVyaV9jKTsKCgkJCQlpZiAo QCRwbF9jWydzdWZmaXgnXSkKCQkJCQkkdXJpIC49ICR0aGlzLT5lbmNvZGVfdXJsKCRwbF9j WydzdWZmaXgnXSk7CgoJCQkJdW5zZXQoJHVyaV9jKTsKCQkJfQoKCQkJaWYgKGlzc2V0KCR1 cmkpKQoJCQkJJHVyaSAuPSAnLyc7CgkJfQoKCQlpZiAoJHVyaV9lbXB0eSA9IGVtcHR5KCR1 cmkpKSB7CgkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSB1cmkgaXMgc3RpbGwgZW1wdHkgaWYg dGhlcmUgaXMgbm8gbWF0Y2ggb3IgaWYgd2UncmUgdXNpbmcKCQkJLy8gc3RyaWN0IG1hdGNo aW5nIGlmIHNvIHRyeSB0aGUgZGVmYXVsdCBwZXJtbGluayBtb2RlLgoJCQkkdXJpID0gJHRo aXMtPnRvZ2dsZV9wZXJtbGlua19tb2RlKCdwZXJtbGlua3VybCcsICRhcnRpY2xlX2FycmF5 KTsKCQl9CgoJCWlmICgkdGhpcy0+cHJlZignb21pdF90cmFpbGluZ19zbGFzaCcpKQoJCQkk dXJpID0gcnRyaW0oJHVyaSwgJy8nKTsKCgkJaWYgKCEkdXJpX2VtcHR5ICYmIGluX2FycmF5 KHR4cGF0aC4nL3B1Ymxpc2gvcnNzLnBocCcsIGdldF9pbmNsdWRlZF9maWxlcygpKSB8fCBp bl9hcnJheSh0eHBhdGguJy9wdWJsaXNoL2F0b20ucGhwJywgZ2V0X2luY2x1ZGVkX2ZpbGVz KCkpKSB7CgkJCSRob3N0ID0gcnRyaW0oc3RyX3JlcGxhY2UocnRyaW0oZG9TdHJpcChAJHBy ZXRleHRbJ3N1YnBhdGgnXSksICcvJyksICcnLCBodSksICcvJyk7CgkJCSR1cmkgPSAkaG9z dCAuICR1cmk7CgkJfQoKCQlyZXR1cm4gKCR0aGlzLT5wcmVmKCdmb3JjZV9sb3dlcmNhc2Vf dXJscycpKSA/IHN0cnRvbG93ZXIoJHVyaSkgOiAkdXJpOwoJfQoKCWZ1bmN0aW9uIF9wYWdl bGlua3VybCAoJHBhcnRzKSB7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ3BhdGgnCQk9 PiAnaW5kZXgucGhwJywKCQkJJ3F1ZXJ5JwkJPT4gJycsCgkJCSdmcmFnbWVudCcJPT4gJycs CgkJKSwgcGFyc2VfdXJsKGh0bWxfZW50aXR5X2RlY29kZShzdHJfcmVwbGFjZSgnJiMzODsn LCAnJicsICRwYXJ0c1syXSkpKSkpOwoKCQkvLyBUaWR5IHVwIGxpbmtzIGJhY2sgdG8gdGhl IHNpdGUgaG9tZXBhZ2UKCQlpZiAoJHBhdGggPT0gJ2luZGV4LnBocCcgJiYgZW1wdHkoJHF1 ZXJ5KSkKCQkJcmV0dXJuICdocmVmPSInIC5odS4gJyInOwoKCQkvLyBGaXggbWF0Y2hlcyBs aWtlIGhyZWY9Ij9zPWZvbyIKCQllbHNlIGlmICgkcGF0aCAmJiBlbXB0eSgkcXVlcnkpICYm ICRwYXJ0c1sxXSA9PSAnPycpIHsKCQkJJHF1ZXJ5ID0gJHBhdGg7CgkJCSRwYXRoID0gJ2lu ZGV4LnBocCc7CgkJfQoKCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgcXVlcnkgdG8g d29yayB3aXRoLgoJCWVsc2UgaWYgKGVtcHR5KCRxdWVyeSkgfHwgJHBhdGggIT0gJ2luZGV4 LnBocCcgfHwgc3RycG9zKCRxdWVyeSwgJy8nKSA9PT0gdHJ1ZSkKCQkJcmV0dXJuICRwYXJ0 c1swXTsKCgkJLy8gJyZhbXA7JyB3aWxsIGJyZWFrIHBhcnNlX3N0cigpIGlmIHRoZXkgYXJl IGZvdW5kIGluIGEgcXVlcnkgc3RyaW5nCgkJJHF1ZXJ5ID0gc3RyX3JlcGxhY2UoJyZhbXA7 JywgJyYnLCAkcXVlcnkpOwoKCQlpZiAoJGZyYWdtZW50KQoJCQkkZnJhZ21lbnQgPSAnIycu JGZyYWdtZW50OwoKCQlnbG9iYWwgJHByZXRleHQ7CgkJcGFyc2Vfc3RyKCRxdWVyeSwgJHF1 ZXJ5X3BhcnQpOwoJCWlmICghYXJyYXlfa2V5X2V4aXN0cygncGcnLCAkcXVlcnlfcGFydCkp CgkJCSRxdWVyeV9wYXJ0WydwZyddID0gMDsKCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJ2lk JywgJHF1ZXJ5X3BhcnQpKQoJCQkkcXVlcnlfcGFydFsnaWQnXSA9IDA7CgkJaWYgKCFhcnJh eV9rZXlfZXhpc3RzKCdyc3MnLCAkcXVlcnlfcGFydCkpCgkJCSRxdWVyeV9wYXJ0Wydyc3Mn XSA9IDA7CgkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdhdG9tJywgJHF1ZXJ5X3BhcnQpKQoJ CQkkcXVlcnlfcGFydFsnYXRvbSddID0gMDsKCQlpZiAoJHRoaXMtPnByZWYoJ2pvaW5fcHJl dGV4dF90b19wYWdlbGlua3MnKSkKCQkJZXh0cmFjdChhcnJheV9tZXJnZSgkcHJldGV4dCwg JHF1ZXJ5X3BhcnQpKTsKCQllbHNlCgkJCWV4dHJhY3QoJHF1ZXJ5X3BhcnQpOwoKCQkvLyBX ZSBoYXZlIGEgaWQsIHBhc3MgdG8gcGVybWxpbmt1cmwoKQoJCWlmICgkaWQpIHsKCQkJaWYg KEAkcyA9PSAnZmlsZV9kb3dubG9hZCcpIHsKCQkJCSR0aXRsZSA9ICh2ZXJzaW9uX2NvbXBh cmUoJGRidmVyc2lvbiwgJzQuMicsICc+PScpKSA/IE5VTEwgOiBzYWZlX2ZpZWxkKCdmaWxl bmFtZScsICd0eHBfZmlsZScsICJpZCA9ICd7JGlkfSciKTsKCQkJCSR1cmwgPSAkdGhpcy0+ dG9nZ2xlX3Blcm1saW5rX21vZGUoJ2ZpbGVkb3dubG9hZHVybCcsIGFycmF5KCRpZCwgJHRp dGxlKSwgdHJ1ZSk7CgkJCX0gZWxzZSB7CgkJCQkkcnMgPSBzYWZlX3JvdygnKiwgSUQgYXMg dGhpc2lkLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHBvc3RlZCcsICd0ZXh0cGF0dGVy bicsICJJRCA9ICd7JGlkfSciKTsKCQkJCSR1cmwgPSAkdGhpcy0+X3Blcm1saW5rdXJsKCRy cywgUEVSTUxJTktVUkwpIC4gJGZyYWdtZW50OwoJCQl9CgkJCXJldHVybiAnaHJlZj0iJy4g JHVybCAuJyInOwoJCX0KCgkJaWYgKEAkcyA9PSAnZGVmYXVsdCcpCgkJCXVuc2V0KCRzKTsK CgkJLy8gU29tZSBUeFAgdGFncywgZS5nLiA8dHhwOmZlZWRfbGluayAvPiB1c2UgJ3NlY3Rp b24nIG9yICdjYXRlZ29yeScgaW5jb25zaXN0ZW50CgkJLy8gd2l0aCBtb3N0IG90aGVyIHRh Z3MuIFByb2Nlc3MgdGhlc2Ugbm93IHNvIHdlIG9ubHkgaGF2ZSB0byBjaGVjayAkcyBhbmQg JGMuCgkJaWYgKEAkc2VjdGlvbikgICRzID0gJHNlY3Rpb247CgkJaWYgKEAkY2F0ZWdvcnkp ICRjID0gJGNhdGVnb3J5OwoKCQkvLyBEZWJ1Z2dpbmcgZm9yIGJ1ZmZlcnMKCQkkdGhpcy0+ YnVmZmVyX2RlYnVnW10gPSAndXJsOiAnLnN0cl9yZXBsYWNlKCcmYW1wOycsICcmJywgJHBh cnRzWzFdLiRwYXJ0c1syXSk7CgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3BhdGg6ICcu JHBhdGg7CgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3F1ZXJ5OiAnLiRxdWVyeTsKCQlp ZiAoJGZyYWdtZW50KSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnZnJhZ21lbnQ6ICcuJGZy YWdtZW50OwoKCQlpZiAoQCRpZCkgJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ2lkOiAnLiRp ZDsKCQlpZiAoQCRzKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnczogJy4kczsKCQlpZiAo QCRjKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnYzogJy4kYzsKCQlpZiAoQCRyc3MpICR0 aGlzLT5idWZmZXJfZGVidWdbXSA9ICdyc3M6ICcuJHJzczsKCQlpZiAoQCRhdG9tKSAkdGhp cy0+YnVmZmVyX2RlYnVnW10gPSAnYXRvbTogJy4kYXRvbTsKCQlpZiAoQCRwZykgJHRoaXMt PmJ1ZmZlcl9kZWJ1Z1tdID0gJ3BnOiAnLiRwZzsKCQlpZiAoQCRxKSAkdGhpcy0+YnVmZmVy X2RlYnVnW10gPSAncTogJy4kcTsKCgkJaWYgKEAkcHJldGV4dFsncGVybWxpbmtfb3ZlcnJp ZGUnXSkgewoJCQkkb3ZlcnJpZGVfaWRzID0gZXhwbG9kZSgnLCcsICRwcmV0ZXh0WydwZXJt bGlua19vdmVycmlkZSddKTsKCQkJZm9yZWFjaCAoJG92ZXJyaWRlX2lkcyBhcyAkb3ZlcnJp ZGVfaWQpIHsKCQkJCSRwbCA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJG92ZXJyaWRlX2lkKTsK CQkJCWlmIChjb3VudCgkcGwpID4gMCkgJHBlcm1saW5rc1tdID0gJHBsOwoJCQl9CgkJfQoK CQlpZiAoZW1wdHkoJHBlcm1saW5rcykpIHsKCQkJJHBlcm1saW5rcyA9ICR0aGlzLT5nZXRf YWxsX3Blcm1saW5rcygxKTsKCgkJCSRwZXJtbGlua3NbJ2dicF9wZXJtYW5lbnRfbGlua3Nf ZGVmYXVsdCddID0gYXJyYXkoCgkJCQknY29tcG9uZW50cycgPT4gYXJyYXkoCgkJCQkJYXJy YXkoJ3R5cGUnID0+ICd0ZXh0JywgJ3RleHQnID0+IHN0cnRvbG93ZXIodXJsZW5jb2RlKGdU eHQoJ2NhdGVnb3J5JykpKSksCgkJCQkJYXJyYXkoJ3R5cGUnID0+ICdjYXRlZ29yeScpLAoJ CQkJKSwKCQkJCSdzZXR0aW5ncycgPT4gYXJyYXkoCgkJCQkJJ3BsX25hbWUnID0+ICdnYnBf cGVybWFuZW50X2xpbmtzX2RlZmF1bHQnLCAncGxfcHJlY2VkZW5jZScgPT4gJycsICdwbF9w cmV2aWV3JyA9PiAnJywKCQkJCQknY29uX3NlY3Rpb24nID0+ICcnLCAnY29uX2NhdGVnb3J5 JyA9PiAnJywgJ2Rlc19zZWN0aW9uJyA9PiAnJywgJ2Rlc19jYXRlZ29yeScgPT4gJycsCgkJ CQkJJ2Rlc19wZXJtbGluaycgPT4gJycsICdkZXNfZmVlZCcgPT4gJycsICdkZXNfbG9jYXRp b24nID0+ICcnLAoJCQkpKTsKCQl9CgoJCSRjdXJyZW50X3NlZ21lbnRzID0gZXhwbG9kZSgn LycsIGx0cmltKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCAnLycpKTsKCgkJJGhpZ2hlc3Rf bWF0Y2hfY291bnQgPSBudWxsOwoJCWZvcmVhY2ggKCRwZXJtbGlua3MgYXMgJGtleSA9PiAk cGwpIHsKCQkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ1Rlc3RpbmcgcGVybWxpbms6ICcu ICRwbFsnc2V0dGluZ3MnXVsncGxfbmFtZSddIC4nIC0gJy4gJGtleTsKCQkJJHRoaXMtPmJ1 ZmZlcl9kZWJ1Z1tdID0gJ1ByZXZpZXc6ICcuICRwbFsnc2V0dGluZ3MnXVsncGxfcHJldmll dyddOwoJCQkkb3V0ID0gYXJyYXkoKTsgJGtleXMgPSBhcnJheSgpOyAkbWF0Y2hfY291bnQg PSAwOwoJCQlmb3JlYWNoICgkcGxbJ2NvbXBvbmVudHMnXSBhcyAkaSA9PiAkcGxfYykgewoJ CQkJc3dpdGNoICgkcGxfY1sndHlwZSddKSB7CgkJCQkJY2FzZSAndGV4dCc6CgkJCQkJCSRv dXRbXSA9ICRwbF9jWyd0ZXh0J107CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAncmVnZXgnOgoJ CQkJCQkkb3V0W10gPSAkcHJldGV4dFsncGVybWxpbmtfcmVnZXhfJy4kcGxfY1snbmFtZSdd XTsKCQkJCQlicmVhazsKCQkJCQljYXNlICdzZWN0aW9uJzoKCQkJCQkJaWYgKEAkcykgJG91 dFtdID0gJHM7CgkJCQkJCWVsc2UgYnJlYWsgMjsKCQkJCQlicmVhazsKCQkJCQljYXNlICdj YXRlZ29yeSc6CgkJCQkJCWlmIChAJGMpICRvdXRbXSA9ICRjOwoJCQkJCQllbHNlIGJyZWFr IDI7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnZmVlZCc6CgkJCQkJCWlmIChAJHJzcykgJGtl eXNbXSA9ICRvdXRbXSA9ICdyc3MnOwoJCQkJCQllbHNlIGlmIChAJGF0b20pICRrZXlzW10g PSAkb3V0W10gPSAnYXRvbSc7CgkJCQkJCWVsc2UgYnJlYWsgMjsKCQkJCQlicmVhazsKCQkJ CQljYXNlICdzZWFyY2gnOgoJCQkJCQlpZiAoQCRxKSAkb3V0W10gPSAkcTsKCQkJCQkJZWxz ZSBicmVhayAyOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3BhZ2UnOgoJCQkJCQlpZiAoQCRw ZykgewoJCQkJCQkJJG91dFtdID0gJHBnOwoJCQkJCQkJJGtleXNbXSA9ICdwZyc7CgkJCQkJ CX0KCQkJCQkJZWxzZSBicmVhayAyOwoJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6IGJyZWFr IDI7CgkJCQl9CgkJCQlpZiAoaW5fYXJyYXkoJHBsX2NbJ3R5cGUnXSwgYXJyYXkoJ3RleHQn LCAncmVnZXgnKSkpIHsKCQkJCQlpZiAoJGN1cnJlbnRfc2VnbWVudHNbJGldID09IGVuZCgk b3V0KSAmJiBzdHJsZW4oZW5kKCRvdXQpKSA+IDApCgkJCQkJCSRtYXRjaF9jb3VudCArPSAk dGhpcy0+cHJlZigndGV4dF9hbmRfcmVnZXhfc2VnbWVudF9zY29yZXMnKTsKCQkJCX0KCQkJ CWVsc2VpZiAoIWluX2FycmF5KCRwbF9jWyd0eXBlJ10sIGFycmF5KCd0aXRsZScsICdpZCcp KSkKCQkJCQkkbWF0Y2hfY291bnQrKzsKCQkJCWVsc2UgYnJlYWs7CgkJCX0KCgkJCSR0aGlz LT5idWZmZXJfZGVidWdbXSA9ICdNYXRjaCBjb3VudDogJy4gJG1hdGNoX2NvdW50OwoKCQkJ Ly8gVG9kbzogU3RvcmUgYWNjb3JkaW5nIHRvIHRoZSBwcmVjZWRlbmNlIHZhbHVlCgkJCWlm IChjb3VudCgkb3V0KSA+IDAgJiYgKCRtYXRjaF9jb3VudCA+ICRoaWdoZXN0X21hdGNoX2Nv dW50IHx8ICFpc3NldCgkaGlnaGVzdF9tYXRjaF9jb3VudCkpICYmCgkJCSEoJGtleSA9PSAn Z2JwX3Blcm1hbmVudF9saW5rc19kZWZhdWx0JyAmJiAhJG1hdGNoX2NvdW50KSkgewoJCQkJ ZXh0cmFjdCgkcGxbJ3NldHRpbmdzJ10pOwoJCQkJaWYgKChlbXB0eSgkcykgJiYgZW1wdHko JGMpKSB8fAoJCQkJKGVtcHR5KCRjb25fc2VjdGlvbikgfHwgQCRzID09ICRjb25fc2VjdGlv bikgfHwKCQkJCShlbXB0eSgkY29uX2NhdGVnb3J5KSB8fCBAJGMgPT0gJGNvbl9jYXRlZ29y eSkpIHsKCQkJCQkkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnTmV3IGhpZ2hlc3QgbWF0Y2gh ICcuIGltcGxvZGUoJy8nLCAkb3V0KTsKCQkJCQkkaGlnaGVzdF9tYXRjaF9jb3VudCA9ICRt YXRjaF9jb3VudDsKCQkJCQkkbWF0Y2ggPSAkb3V0OwoJCQkJCSRtYXRjaF9rZXlzID0gJGtl eXM7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChlbXB0eSgkbWF0Y2gpICYmICghKEAkcGcgJiYg JHRoaXMtPnByZWYoJ2NsZWFuX3BhZ2VfYXJjaGl2ZV9saW5rcycpKSB8fCAoQCRwZyAmJiBA JHEpKSkgewoJCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21vZGU7CgkJ CSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdObyBtYXRjaCc7CgkJCSR0aGlzLT5idWZmZXJf ZGVidWdbXSA9ICctLS0tJzsKCQkJJHByZXRleHRbJ3Blcm1saW5rX21vZGUnXSA9ICRwZXJt bGlua19tb2RlID0gJHByZWZzWydwZXJtbGlua19tb2RlJ107CgkJCSR1cmwgPSBwYWdlbGlu a3VybCgkcXVlcnlfcGFydCk7CgkJCSRwcmV0ZXh0WydwZXJtbGlua19tb2RlJ10gPSAkcGVy bWxpbmtfbW9kZSA9ICdtZXNzeSc7CgkJCXJldHVybiAnaHJlZj0iJy4gJHVybCAuJyInOwoJ CX0KCgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ21hdGNoOiAnLiAgICAgIHNlcmlhbGl6 ZSgkbWF0Y2gpOwoJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdtYXRjaF9rZXlzOiAnLiBz ZXJpYWxpemUoJG1hdGNoX2tleXMpOwoKCQkkdXJsID0gJy8nLmpvaW4oJy8nLCAkbWF0Y2gp OwoJCSR1cmwgPSBydHJpbShodSwgJy8nKS5ydHJpbSgkdXJsLCAnLycpLicvJzsKCgkJaWYg KCRyc3MgJiYgIWluX2FycmF5KCdyc3MnLCAkbWF0Y2hfa2V5cykpCgkJCSR1cmwgLj0gJ3Jz cyc7CgkJZWxzZSBpZiAoJGF0b20gJiYgIWluX2FycmF5KCdhdG9tJywgJG1hdGNoX2tleXMp KQoJCQkkdXJsIC49ICdhdG9tJzsKCQllbHNlIGlmICgkcGcgJiYgIWluX2FycmF5KCdwZycs ICRtYXRjaF9rZXlzKSkgewoJCQlpZiAoJHRoaXMtPnByZWYoJ2NsZWFuX3BhZ2VfYXJjaGl2 ZV9saW5rcycpKQoJCQkJJHVybCAuPSAkcGc7CgkJCWVsc2UgewoJCQkJJHVybCAuPSAnP3Bn PScuICRwZzsKCQkJCSRvbWl0X3RyYWlsaW5nX3NsYXNoID0gdHJ1ZTsKCQkJfQoJCX0KCgkJ JHVybCA9IHJ0cmltKCR1cmwsICcvJykgLiAnLyc7CgoJCWlmIChAJG9taXRfdHJhaWxpbmdf c2xhc2ggfHwgJHRoaXMtPnByZWYoJ29taXRfdHJhaWxpbmdfc2xhc2gnKSkKCQkJJHVybCA9 IHJ0cmltKCR1cmwsICcvJyk7CgoJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICR1cmw7CgkJ JHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJy0tLS0nOwoKCQlpZiAoJHBhdGggPT0gJ2luZGV4 LnBocCcgJiYgJHVybCAhPSBodSkKCQkJcmV0dXJuICdocmVmPSInLiAkdXJsIC4gJGZyYWdt ZW50IC4nIic7CgoJCS8qCgkJMSA9IGluZGV4LCB0ZXh0cGF0dGVybi9jc3MsIE5VTEwgKD1p bmRleCkKCQkyID0gaWQsIHMsIHNlY3Rpb24sIGMsIGNhdGVnb3J5LCByc3MsIGF0b20sIHBn LCBxLCAobiwgcCwgbW9udGgsIGF1dGhvcikKCQkqLwoKCQlyZXR1cm4gKCR0aGlzLT5wcmVm KCdmb3JjZV9sb3dlcmNhc2VfdXJscycpKSA/IHN0cnRvbG93ZXIoJHBhcnRzWzBdKSA6ICRw YXJ0c1swXTsKCX0KCglmdW5jdGlvbiBzZXRfcGVybWxpbmtfbW9kZSAoJHJlc2V0X2Z1bmN0 aW9uID0gZmFsc2UpIHsKCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21v ZGU7CgkJJHByZWZzWydjdXN0b21fdXJsX2Z1bmMnXSA9IGFycmF5KCYkdGhpcywgJ19wZXJt bGlua3VybCcpOwoKCQlpZiAoISRyZXNldF9mdW5jdGlvbikKCQkJJHByZXRleHRbJ3Blcm1s aW5rX21vZGUnXSA9ICRwZXJtbGlua19tb2RlID0gJ21lc3N5JzsKCQllbHNlCgkJCSRwcmV0 ZXh0WydwZXJtbGlua19tb2RlJ10gPSAkcGVybWxpbmtfbW9kZSA9ICRwcmVmc1sncGVybWxp bmtfbW9kZSddOwoJfQoKCWZ1bmN0aW9uIHJlc2V0X3Blcm1saW5rX21vZGUgKCkgewoJCWds b2JhbCAkcHJlZnMsICRwcmV0ZXh0LCAkcGVybWxpbmtfbW9kZTsKCQl1bnNldCgkcHJlZnNb J2N1c3RvbV91cmxfZnVuYyddKTsKCQkkcHJldGV4dFsncGVybWxpbmtfbW9kZSddID0gJHBl cm1saW5rX21vZGUgPSAkcHJlZnNbJ3Blcm1saW5rX21vZGUnXTsKCX0KCglmdW5jdGlvbiB0 b2dnbGVfY3VzdG9tX3VybF9mdW5jICgkZnVuYywgJGF0dHMgPSBOVUxMLCAkdG9vZ2xlX3Bl cm1saW5rX21vZGUgPSBmYWxzZSwgJGV4cGFuZF9hcmd1bWVudHMgPSBmYWxzZSkgewoJCWds b2JhbCAkcHJlZnMsICRwcmV0ZXh0OwoKCQlpZiAoJHRvb2dsZV9wZXJtbGlua19tb2RlKSB7 CgkJCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCQkJJF9wZXJtbGlua19tb2RlID0gJHBlcm1s aW5rX21vZGU7CgkJfQoKCQkkX2NhbGxfdXNlcl9mdW5jID0gQCRwcmVmc1snY3VzdG9tX3Vy bF9mdW5jJ107CgoJCXVuc2V0KCRwcmVmc1snY3VzdG9tX3VybF9mdW5jJ10pOwoJCWlmICgk dG9vZ2xlX3Blcm1saW5rX21vZGUpCgkJCSRwcmV0ZXh0WydwZXJtbGlua19tb2RlJ10gPSAk cGVybWxpbmtfbW9kZSA9ICRwcmVmc1sncGVybWxpbmtfbW9kZSddOwoKCQlpZiAoaXNfY2Fs bGFibGUoJGZ1bmMpKSB7CgkJCWlmIChpc19hcnJheSgkYXR0cykgYW5kICRleHBhbmRfYXJn dW1lbnRzKQoJCQkJJHJzID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmMsICRhdHRzKTsK CQkJZWxzZQoJCQkJJHJzID0gY2FsbF91c2VyX2Z1bmMoJGZ1bmMsICRhdHRzKTsKCQl9CgoJ CSRwcmVmc1snY3VzdG9tX3VybF9mdW5jJ10gPSAkX2NhbGxfdXNlcl9mdW5jOwoKCQlpZiAo JHRvb2dsZV9wZXJtbGlua19tb2RlKQoJCQkkcHJldGV4dFsncGVybWxpbmtfbW9kZSddID0g JHBlcm1saW5rX21vZGUgPSAkX3Blcm1saW5rX21vZGU7CgoJCXJldHVybiAkcnM7Cgl9CgoJ ZnVuY3Rpb24gdG9nZ2xlX3Blcm1saW5rX21vZGUgKCRmdW5jLCAkYXR0cyA9IE5VTEwsICRl eHBhbmRfYXJndW1lbnRzID0gZmFsc2UpIHsKCQlyZXR1cm4gJHRoaXMtPnRvZ2dsZV9jdXN0 b21fdXJsX2Z1bmMoJGZ1bmMsICRhdHRzLCB0cnVlLCAkZXhwYW5kX2FyZ3VtZW50cyk7Cgl9 CgoJZnVuY3Rpb24gZW5jb2RlX3VybCAoJHRleHQpIHsKCQlyZXR1cm4gdXJsZW5jb2RlKHRy aW0oZHVtYkRvd24odXJsZGVjb2RlKCR0ZXh0KSkpKTsKCX0KCglmdW5jdGlvbiBkZWJ1ZyAo KSB7CgkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1ZycpKSB7CgkJCWdsb2JhbCAkcHJvZHVjdGlv bl9zdGF0dXM7CgkJCSRhID0gZnVuY19nZXRfYXJncygpOwoKCQkJaWYgKEB0eHBpbnRlcmZh Y2UgPT0gJ2FkbWluJykKCQkJCWZvcmVhY2ggKCRhIGFzICR0aGluZykKCQkJCQlkbXAoJHRo aW5nKTsKCgkJCWlmIChAdHhwaW50ZXJmYWNlID09ICdwdWJsaWMnICYmIGluX2FycmF5KCRw cm9kdWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3RpbmcnKSkpCgkJCQlmb3Jl YWNoICgkYSBhcyAkdGhpbmcpCgkJCQkJZWNobyBjb21tZW50KGlzX3NjYWxhcigkdGhpbmcp ID8gc3RydmFsKCR0aGluZykgOiB2YXJfZXhwb3J0KCR0aGluZywgdHJ1ZSkpLG47CgkJfQoJ fQp9CgpjbGFzcyBQZXJtYW5lbnRMaW5rc0J1aWxkVGFiVmlldyBleHRlbmRzIEdCUEFkbWlu VGFiVmlldwp7CglmdW5jdGlvbiBwcmVsb2FkICgpIHsKCQlyZWdpc3Rlcl9jYWxsYmFjayhh cnJheSgmJHRoaXMsICdwb3N0X3NhdmVfcGVybWxpbmsnKSwgJHRoaXMtPnBhcmVudC0+ZXZl bnQsIGdicF9zYXZlLCAxKTsKCQlyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJHRoaXMsICdw b3N0X3NhdmVfcGVybWxpbmsnKSwgJHRoaXMtPnBhcmVudC0+ZXZlbnQsIGdicF9wb3N0LCAx KTsKCX0KCglmdW5jdGlvbiBtYWluICgpIHsKCQlnbG9iYWwgJHByZWZzOwoJCWV4dHJhY3Qo Z3BzYShhcnJheSgnc3RlcCcsIGdicF9pZCkpKTsKCgkJLy8gV2l0aCBoYXZlIGFuIElELCBl aXRoZXIgdGhlIHBlcm1saW5rIGhhcyBqdXN0IGJlZW4gc2F2ZWQgb3IgdGhlIHVzZXIgd2Fu dHMgdG8gZWRpdCBpdAoJCWlmICgkaWQpIHsKCQkJLy8gTmV3bHkgc2F2ZWQgb3IgYmVlbmlu ZyBlZGl0ZWQsIGVpdGhlciB3YXkgd2UncmUgZWRpdGluZyBhIHBlcm1saW5rCgkJCSRzdGVw ID0gZ2JwX3NhdmU7CgoJCQkvLyBVc2UgdGhlIElEIHRvIGdyYWIgdGhlIHBlcm1saW5rIGRh dGEgKGNvbXBvbmVudHMgJiBzZXR0aW5ncykKCQkJJHBlcm1saW5rID0gJHRoaXMtPnBhcmVu dC0+Z2V0X3Blcm1saW5rKCRpZCk7CgkJCSRjb21wb25lbnRzID0gJHRoaXMtPnBocEFycmF5 VG9Kc0FycmF5KCdjb21wb25lbnRzJywgJHBlcm1saW5rWydjb21wb25lbnRzJ10pOwoJCQkk c2V0dGluZ3MgPSAkcGVybWxpbmtbJ3NldHRpbmdzJ107CgkJfSBlbHNlIHsKCQkJLy8gQ3Jl YXRpbmcgYSBuZXcgSUQgYW5kIHBlcm1saW5rLgoJCQkkc3RlcCA9IGdicF9wb3N0OwoJCQkk aWQgPSB1bmlxaWQoJycpOwoKCQkJLy8gU2V0IHRoZSBkZWZhdWx0IHNldCBvZiBjb21wb25l bnRzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXJlIGlzIHBhcmVudCBwZXJtbGluawoJCQkk Y29tcG9uZW50cyA9ICR0aGlzLT5waHBBcnJheVRvSnNBcnJheSgnY29tcG9uZW50cycsIGFy cmF5KAoJCQkJYXJyYXkoJ3R5cGUnID0+ICdzZWN0aW9uJywgJ3ByZWZpeCcgPT4gJycsICdz dWZmaXgnID0+ICcnLCAncmVnZXgnID0+ICcnLCAndGV4dCcgPT4gJycpLAoJCQkJYXJyYXko J3R5cGUnID0+ICdjYXRlZ29yeScsICdwcmVmaXgnID0+ICcnLCAnc3VmZml4JyA9PiAnJywg J3JlZ2V4JyA9PiAnJywgJ3RleHQnID0+ICcnLCAnY2F0ZWdvcnknID0+ICcxJyksCgkJCQlh cnJheSgndHlwZScgPT4gJ3RpdGxlJywgJ3ByZWZpeCcgPT4gJycsICdzdWZmaXgnID0+ICcn LCAncmVnZXgnID0+ICcnLCAndGV4dCcgPT4gJycpLAoJCQkpKTsKCgkJCSRzZXR0aW5ncyA9 IGFycmF5KAoJCQkJJ3BsX25hbWUnID0+ICdVbnRpdGxlZCcsICdwbF9wcmVjZWRlbmNlJyA9 PiAnMCcsCgkJCQknY29uX3NlY3Rpb24nID0+ICcnLCAnY29uX2NhdGVnb3J5JyA9PiAnJywK CQkJCSdkZXNfc2VjdGlvbicgPT4gJycsICdkZXNfY2F0ZWdvcnknID0+ICcnLCAnZGVzX3Bh Z2UnID0+ICcnLAoJCQkJJ2Rlc19wZXJtbGluaycgPT4gJycsICdkZXNfZmVlZCcgPT4gJycs ICdkZXNfbG9jYXRpb24nID0+ICcnLAoJCQkpOwoJCX0KCgkJLy8gRXh0cmFjdCBzZXR0aW5n cyAtIHRoaXMgd2lsbCBiZSB1c2VmdWwgd2hlbiBjcmVhdGluZyB0aGUgdXNlciBpbnRlcmZh Y2UKCQlleHRyYWN0KCRzZXR0aW5ncyk7CgoJCS8vIFBIUCAmIEphdmFzY3JpcHQgY29uc3Rh bnRzOwoJCSRzZXBhcmF0b3IgPSBnYnBfc2VwYXJhdG9yOwoJCSRjb21wb25lbnRzX2RpdiA9 ICdwZXJtbGlua19jb21wb25lbnRzX3VpJzsKCQkkY29tcG9uZW50c19mb3JtID0gJ3Blcm1s aW5rX2NvbXBvbmVudHMnOwoJCSRzZXR0aW5nc19mb3JtID0gJ3Blcm1saW5rX3NldHRpbmdz JzsKCQkkc2hvd19wcmVmaXggPSAkdGhpcy0+cHJlZignc2hvd19wcmVmaXgnKTsKCQkkc2hv d19zdWZmaXggPSAkdGhpcy0+cHJlZignc2hvd19zdWZmaXgnKTsKCgkJLy8gQSBsaXR0bGUg Y3JlZGl0IGhlcmUgYW5kIHRoZXJlIGRvZXNuJ3QgaHVydAoJCSRvdXRbXSA9ICI8IS0tIHsk dGhpcy0+cGFyZW50LT5wbHVnaW5fbmFtZX0gYnkgR3JhZW1lIFBvcnRlb3VzIC0tPiI7CgoJ CS8vIFRoZSBKYXZhc2NyaXB0CiRvdXRbXSA9IDw8PEhUTUwKCTxzY3JpcHQgdHlwZT0idGV4 dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgoJ Ly8gPCFbQ0RBVEFbCgoJLy8gR2xvYmFsIHZhcmlhYmxlcwp2YXIgeyRjb21wb25lbnRzfS8v IGNvbXBvbmVudHMgYXJyYXkgZm9yIGFsbCB0aGUgZGF0YQoKCXZhciBfY3VycmVudCA9IDA7 IC8vIEluZGV4IG9mIHRoZSBjb21wb25lbnRzIGFycmF5LCBvZiB0aGUgY3VycmVudGx5IHNl bGVjdGVkIGNvbXBvbmVudAoJdmFyIGNfdmFscyA9IG5ldyBBcnJheSgndHlwZScsICdjdXN0 b20nLCAnY2F0ZWdvcnknLCAnbmFtZScsICdwcmVmaXgnLCAnc3VmZml4JywgJ3JlZ2V4Jywg J3RleHQnKTsKCgl3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CgkJY29tcG9uZW50X3Jl ZnJlc2hfYWxsKCk7CgkJY29tcG9uZW50X3N3aXRjaChjb21wb25lbnQoX2N1cnJlbnQpKTsK CX0KCglmdW5jdGlvbiBjb21wb25lbnRfYWRkICgpIHsKCQkvLyBDcmVhdGUgZGF0YSBzZXQK CQl2YXIgZGF0YSA9IG5ldyBBcnJheSgpOwoJCWZvciAoa2V5IGluIGNfdmFscykgewoJCQlk YXRhW2NfdmFsc1trZXldXSA9ICcnOwoJCX0KCgkJLy8gQWRkIGRhdGEKCQljb21wb25lbnRz LnB1c2goZGF0YSk7CgoJCS8vIFJlc2V0IGNvbXBvbmVudCB0eXBlIGxpc3QKCQlmb3JtKCd7 JGNvbXBvbmVudHNfZm9ybX0nKS50eXBlLnZhbHVlID0gJyc7CgoJCS8vIFN3aXRjaCB0byB0 aGUgbmV3IGNvbXBvbmVudAoJCV9jdXJyZW50ID0gY29tcG9uZW50cy5sZW5ndGggLSAxOwoK CQkvLyBSZWZyZXNoIFVJCgkJY29tcG9uZW50X3JlZnJlc2hfYWxsKCk7CgkJY29tcG9uZW50 X3VwZGF0ZSgpOwoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVudF9yZWZyZXNoIChlbGVtZW50KSB7 CgkJdmFyIGMgPSBjb21wb25lbnRzW2VsZW1lbnQuaWRdOwoKCQkvLyBDU1MKCQlpZiAoX2N1 cnJlbnQgPT0gZWxlbWVudC5pZCkKCQkJZWxlbWVudC5zdHlsZVsnYmFja2dyb3VuZENvbG9y J10gPSAncmdiKDI0OSwgMjA2LCA3MyknOwoJCWVsc2UKCQkJZWxlbWVudC5zdHlsZVsnYmFj a2dyb3VuZENvbG9yJ10gPSAncmdiKDI1NSwgMjU0LCAyMTEpJzsKCQllbGVtZW50LnN0eWxl Wydjb2xvciddID0gJ3JnYigwLCAwLCAwKSc7CgkJZWxlbWVudC5zdHlsZVsnZm9udEZhbWls eSddID0gJ0FyaWFsJzsKCQllbGVtZW50LnN0eWxlWydmb250V2VpZ2h0J10gPSAnYm9sZCc7 CgkJZWxlbWVudC5zdHlsZVsndmVydGljYWxBbGlnbiddID0gJ21pZGRsZSc7CgkJZWxlbWVu dC5zdHlsZVsndGV4dEFsaWduJ10gPSAnY2VudGVyJzsKCQllbGVtZW50LnN0eWxlWydsaW5l SGVpZ2h0J10gPSAnMS41ZW0nOwoJCWVsZW1lbnQuc3R5bGVbJ2hlaWdodCddID0gJzEuNWVt JzsKCQllbGVtZW50LnN0eWxlWydwYWRkaW5nJ10gPSAnMCA1cHgnOwoJCWVsZW1lbnQuc3R5 bGVbJ21hcmdpblJpZ2h0J10gPSAnNXB4JzsKCQllbGVtZW50LnN0eWxlWydjc3NGbG9hdCdd ID0gJ2xlZnQnOwoJCWVsZW1lbnQuc3R5bGVbJ2Rpc3BsYXknXSA9ICdpbmxpbmUnOwoKCQkv LyBSZW1vdmUgYWxsIGNoaWxkIG5vZGVzCgkJd2hpbGUgKGVsZW1lbnQuaGFzQ2hpbGROb2Rl cygpKSB7IGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTsgfQoKCQkv LyBDcmVhdGUgdGhlIHZpc2libGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGNvbXBvbmVu dAoJCXN3aXRjaCAoY1sndHlwZSddKSB7CgkJCWNhc2UgJycgOgoJCQkJc3RyaW5nID0gJy8n OwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3JlZ2V4JyA6CgkJCWNhc2UgJ3RleHQnIDoKCQkJCXN0 cmluZyA9IGNbY1sndHlwZSddXSArICcgLyc7CgkJCQlicmVhazsKCQkJY2FzZSAnZGF0ZScg OgoJCQkJc3RyaW5nID0gY1sndHlwZSddICsgJyAvJzsKCQkJCWJyZWFrOwoJCQljYXNlICdj dXN0b20nIDoKCQkJCXN0cmluZyA9IGNbJ3ByZWZpeCddICsgJ2N1c3RvbV8nICsgY1snY3Vz dG9tJ10gKyBjWydzdWZmaXgnXSArICcgLyc7CgkJCQlicmVhazsKCQkJZGVmYXVsdCA6CgkJ CQlzdHJpbmcgPSBjWydwcmVmaXgnXSArIGNbJ3R5cGUnXSArIGNbJ3N1ZmZpeCddICsgJyAv JzsKCQkJYnJlYWs7CgkJfQoKCQkvLyBTZXQgdGhlIHZpc2libGUgc3RyaW5nCgkJZWxlbWVu dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmcpKTsKCgkJcmV0 dXJuIGVsZW1lbnQ7Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3JlZnJlc2hfYWxsICgpIHsK CQkvLyBSZW1vdmUgYWxsIGNoaWxkIG5vZGVzCgkJd2hpbGUgKHBlcm1saW5rX2RpdigpLmhh c0NoaWxkTm9kZXMoKSkgeyBwZXJtbGlua19kaXYoKS5yZW1vdmVDaGlsZChwZXJtbGlua19k aXYoKS5maXJzdENoaWxkKTsgfQoKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMu bGVuZ3RoOyBpKyspIHsKCQkJdmFyIGMgPSBjb21wb25lbnRzW2ldOwoKCQkJLy8gQ3JlYXRl IHRoZSBuZXcgY29tcG9uZW50CgkJCXZhciBuZXdfY29tcG9uZW50ID0gZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCgnZGl2Jyk7CgoJCQkvLyBTZXQgdGhlIGlkIGludGVyZ2VyIGZvciB0aGlz IGNvbXBvbmVudAoJCQluZXdfY29tcG9uZW50LmlkID0gaTsKCgkJCS8vIEphdmFzY3JpcHQs IG9ubW91c2V1cCBzZXR0aW5nCgkJCW5ld19jb21wb25lbnQuc2V0QXR0cmlidXRlKCdvbm1v dXNlZG93bicsICdjb21wb25lbnRfc3dpdGNoKHRoaXMpOycpOwoJCQluZXdfY29tcG9uZW50 Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24oKSB7IGNvbXBvbmVudF9zd2l0Y2godGhpcyk7IH07 CgoJCQkvLyBSZWZyZXNoIHRoZSBsb29rIG9mIHRoZSBjb21wb25lbnQKCQkJbmV3X2NvbXBv bmVudCA9IGNvbXBvbmVudF9yZWZyZXNoKG5ld19jb21wb25lbnQpOwoKCQkJLy8gQW5kIGFk ZCB0aGUgbmV3IGNvbXBvbmVudCB0byB0aGUgdWkKCQkJcGVybWxpbmtfZGl2KCkuYXBwZW5k Q2hpbGQobmV3X2NvbXBvbmVudCk7CgkJfQoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVudF9yZW1v dmUgKCkgewoJCWlmIChjb21wb25lbnRzLmxlbmd0aCA+IDEpIHsKCQkJY29tcG9uZW50cy5z cGxpY2UoX2N1cnJlbnQsIDEpOwoKCQkJaWYgKF9jdXJyZW50ID49IGNvbXBvbmVudHMubGVu Z3RoKQoJCQkJX2N1cnJlbnQgPSBjb21wb25lbnRzLmxlbmd0aCAtIDE7CgoJCQljb21wb25l bnRfcmVmcmVzaF9hbGwoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3N3aXRjaCAo ZWxlbWVudCkgewoJCS8vIFVwZGF0ZSBjdXJyZW50IGluZGV4CgkJX2N1cnJlbnQgPSBlbGVt ZW50LmlkOwoKCQkvLyBSZWZyZXNoIFVJCgkJY29tcG9uZW50X3JlZnJlc2hfYWxsKCk7CgoJ CS8vIFNldCBmb3JtIGlucHV0IHZhbHVlcwoJCXZhciBjID0gY29tcG9uZW50c1tfY3VycmVu dF07CgkJZm9yIChrZXkgaW4gY192YWxzKSB7CgkJCXZhciBrID0gY192YWxzW2tleV07CgkJ CXZhciBlID0gZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykuZWxlbWVudHMubmFtZWRJdGVt KGspOwoKCQkJaWYgKGNba10pIGUudmFsdWUgPSBjW2tdOwoJCQllbHNlIGUudmFsdWUgPSAn JzsKCQl9CgoJCS8vIEhpZGUgdW5uZWVkZWQgZm9ybSBpbnB1dHMKCQljb21wb25lbnRfdXBk YXRlKCk7Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3VwZGF0ZSAoZWxlbWVudCkgewoJCS8v IFN0b3JlIHRoZSBkYXRhIGluIGZvcm0gaW5wdXRzLCBhbmQgaGlkZSBhbGwgZm9ybSBpbnB1 dHMKCQl2YXIgYyA9IG5ldyBBcnJheSgpCgkJZm9yIChrZXkgaW4gY192YWxzKSB7CgkJCXZh ciBrID0gY192YWxzW2tleV07CgkJCXZhciBlID0gZm9ybSgneyRjb21wb25lbnRzX2Zvcm19 JykuZWxlbWVudHMubmFtZWRJdGVtKGspOwoKCQkJY1trXSA9IGUudmFsdWU7CgoJCQllLnBh cmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICdub25lJzsKCQl9CgoJCS8vIFJlc2hvdyB0 eXBlIG9wdGlvbiBsaXN0CgkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykudHlwZS5wYXJl bnROb2RlLnN0eWxlWydkaXNwbGF5J10gPSAnJzsKCgkJLy8gU2V0IG90aGVyIGZvcm0gaW5w dXRzIHRvIHRoZSBjb3JyZWN0IHZpc2liaWxpdHkgc3RhdGUsIGRlcGVuZGVudCBvbiB0eXBl CgkJc3dpdGNoIChjWyd0eXBlJ10pIHsKCQkJY2FzZSAnJyA6CgkJCWNhc2UgJ2RhdGUnIDog YnJlYWs7CgkJCWNhc2UgJ3JlZ2V4JyA6CgkJCQlmb3JtKCd7JGNvbXBvbmVudHNfZm9ybX0n KS5uYW1lLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZm9ybSgneyRj b21wb25lbnRzX2Zvcm19JykucmVnZXgucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxheSddID0g Jyc7CgkJCWJyZWFrOwoJCQljYXNlICd0ZXh0JyA6CgkJCQlmb3JtKCd7JGNvbXBvbmVudHNf Zm9ybX0nKS5uYW1lLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZm9y bSgneyRjb21wb25lbnRzX2Zvcm19JykudGV4dC5wYXJlbnROb2RlLnN0eWxlWydkaXNwbGF5 J10gPSAnJzsKCQkJYnJlYWs7CgkJCWNhc2UgJ2N1c3RvbScgOgoJCQkJZm9ybSgneyRjb21w b25lbnRzX2Zvcm19JykuY3VzdG9tLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcn OwoJCQkJZGlzcGxheV9maXhlcygpOwoJCQlicmVhazsKCQkJY2FzZSAnY2F0ZWdvcnknIDoK CQkJCWZvcm0oJ3skY29tcG9uZW50c19mb3JtfScpLmNhdGVnb3J5LnBhcmVudE5vZGUuc3R5 bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZGlzcGxheV9maXhlcygpOwoJCQlicmVhazsKCQkJ ZGVmYXVsdCA6CgkJCQlkaXNwbGF5X2ZpeGVzKCk7CgkJCWJyZWFrOwoJCX0KCgkJLy8gU2F2 ZSBkYXRhCgkJY29tcG9uZW50c1tfY3VycmVudF0gPSBjOwoKCQkvLyBSZWZyZXNoIGNvbXBv bmVudCB0byByZWZsZWN0IG5ldyBkYXRhCgkJY29tcG9uZW50X3JlZnJlc2goY29tcG9uZW50 KF9jdXJyZW50KSk7CgoJCS8vIFJlLWZvY3VzIHRoZSBhY3RpdmUgZm9ybSBpbnB1dAoJCWlm IChlbGVtZW50KQoJCQllbGVtZW50LmZvY3VzKCk7Cgl9CgoJZnVuY3Rpb24gZGlzcGxheV9m aXhlcyAoKSB7CgkJaWYgKCd7JHNob3dfcHJlZml4fScpCgkJCWZvcm0oJ3skY29tcG9uZW50 c19mb3JtfScpLnByZWZpeC5wYXJlbnROb2RlLnN0eWxlWydkaXNwbGF5J10gPSAnJzsKCQlp ZiAoJ3skc2hvd19zdWZmaXh9JykKCQkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19Jykuc3Vm Zml4LnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJfQoKCWZ1bmN0aW9uIGNv bXBvbmVudF9sZWZ0ICgpIHsKCQlpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxICYmIF9jdXJy ZW50ID4gMCkgewoJCQkvLyBTdG9yZSBjdXJyZW50IGNvbXBvbmVudAoJCQl2YXIgYyA9IGNv bXBvbmVudHNbX2N1cnJlbnRdOwoKCQkJLy8gUmVtb3ZlIGN1cnJlbnQgY29tcG9uZW50CgkJ CWNvbXBvbmVudHMuc3BsaWNlKF9jdXJyZW50LCAxKTsKCgkJCS8vIFVwZGF0ZSBjdXJyZW50 IGluZGV4CgkJCV9jdXJyZW50LS07CgoJCQkvLyBSZS1hZGQgY3VycmVudCBjb21wb25lbnQK CQkJY29tcG9uZW50cy5zcGxpY2UoX2N1cnJlbnQsIDAsIGMpOwoKCQkJLy8gUmVmcmVzaCBV SQoJCQljb21wb25lbnRfcmVmcmVzaF9hbGwoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gY29tcG9u ZW50X3JpZ2h0ICgpIHsKCQlpZiAoX2N1cnJlbnQgPCBjb21wb25lbnRzLmxlbmd0aCAtIDEp IHsKCQkJLy8gU3RvcmUgY3VycmVudCBjb21wb25lbnQKCQkJdmFyIGMgPSBjb21wb25lbnRz W19jdXJyZW50XTsKCgkJCS8vIFJlbW92ZSBjdXJyZW50IGNvbXBvbmVudAoJCQljb21wb25l bnRzLnNwbGljZShfY3VycmVudCwgMSk7CgoJCQkvLyBVcGRhdGUgY3VycmVudCBpbmRleAoJ CQlfY3VycmVudCsrOwoKCQkJLy8gUmUtYWRkIGN1cnJlbnQgY29tcG9uZW50CgkJCWNvbXBv bmVudHMuc3BsaWNlKF9jdXJyZW50LCAwLCBjKTsKCgkJCS8vIFJlZnJlc2ggVUkKCQkJY29t cG9uZW50X3JlZnJlc2hfYWxsKCk7CgkJfQoJfQoKCWZ1bmN0aW9uIHNhdmUgKGZvcm0pIHsK CQl2YXIgYyA9ICcnOyB2YXIgaXNfcGVybWxpbmsgPSBmYWxzZTsgdmFyIGhhc19wYWdlX29y X3NlYXJjaCA9IGZhbHNlOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5n dGg7IGkrKykgewoJCQlpZiAoY29tcG9uZW50c1tpXVsndHlwZSddID09ICd0aXRsZScgfHwg Y29tcG9uZW50c1tpXVsndHlwZSddID09ICdpZCcpCgkJCQlpc19wZXJtbGluayA9IHRydWU7 CgkJCWlmIChjb21wb25lbnRzW2ldWyd0eXBlJ10gPT0gJ3BhZ2UnIHx8IGNvbXBvbmVudHNb aV1bJ3R5cGUnXSA9PSAnZmVlZCcgfHwgY29tcG9uZW50c1tpXVsndHlwZSddID09ICdzZWFy Y2gnKQoJCQkJaGFzX3BhZ2VfZmVlZF9zZWFyY2ggPSB0cnVlOwoJCQljID0gYyArIGpzQXJy YXlUb1BocEFycmF5KGNvbXBvbmVudHNbaV0pICsgJ3skc2VwYXJhdG9yfSc7CgkJfQoKCQlp ZiAoaXNfcGVybWxpbmsgJiYgaGFzX3BhZ2Vfb3Jfc2VhcmNoKQoJCQlhbGVydCgiWW91ciBw ZXJtYW5lbnQgbGluayBjYW4ndCBjb250YWluIGVpdGhlciBhICdwYWdlJywgJ2ZlZWQnIG9y IGEgJ3NlYXJjaCcgY29tcG9uZW50IHdpdGggJ3RpdGxlJyBvciAnaWQnIGNvbXBvbmVudHMu Iik7CgoJCWVsc2UgaWYgKGlzX3Blcm1saW5rICYmIChmb3JtLnBsX25hbWUudmFsdWUgPT0g JycgfHwgZm9ybS5wbF9uYW1lLnZhbHVlID09ICdVbnRpdGxlZCcpKSB7CgkJCWRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncycpLnN0eWxlWydkaXNwbGF5J10gPSAnJzsKCQkJ Zm9ybS5wbF9uYW1lLnN0eWxlWydib3JkZXInXSA9ICczcHggc29saWQgcmdiKDIyMSwgMCwg MCknOwoJCQlmb3JtLnBsX3ByZWNlZGVuY2Uuc3R5bGVbJ2JvcmRlciddID0gJyc7CgkJCWFs ZXJ0KCdQbGVhc2UgZW50ZXIgYSBuYW1lIGZvciB0aGlzIHBlcm1hbmVudCBsaW5rIHJ1bGUu Jyk7CgkJfSBlbHNlIGlmIChmb3JtLnBsX3ByZWNlZGVuY2UudmFsdWUgPT0gJycpIHsKCQkJ ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzJykuc3R5bGVbJ2Rpc3BsYXknXSA9 ICcnOwoJCQlmb3JtLnBsX3ByZWNlZGVuY2Uuc3R5bGVbJ2JvcmRlciddID0gJzNweCBzb2xp ZCByZ2IoMjIxLCAwLCAwKSc7CgkJCWZvcm0ucGxfbmFtZS5zdHlsZVsnYm9yZGVyJ10gPSAn JzsKCQkJYWxlcnQoJ1BsZWFzZSBlbnRlciBhIHByZWNlZGVuY2UgdmFsdWUgZm9yIHRoaXMg cGVybWFuZW50IGxpbmsgcnVsZS4nKTsKCQl9IGVsc2UgewoJCQlmb3JtLmNvbXBvbmVudHMu dmFsdWUgPSBjOwoJCQlpZiAocGVybWxpbmtfZGl2KCkudGV4dENvbnRlbnQpCgkJCQlmb3Jt LnBsX3ByZXZpZXcudmFsdWUgPSBwZXJtbGlua19kaXYoKS50ZXh0Q29udGVudDsKCQkJZWxz ZSBpZiAocGVybWxpbmtfZGl2KCkuaW5uZXJUZXh0KQoJCQkJZm9ybS5wbF9wcmV2aWV3LnZh bHVlID0gcGVybWxpbmtfZGl2KCkuaW5uZXJUZXh0OwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJ CXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBqc0FycmF5VG9QaHBBcnJheSAoYXJyYXkp IHsKCQkvLyBodHRwOi8vZmFybS50dWNvd3MuY29tL2Jsb2cvX2FyY2hpdmVzLzIwMDUvNS8z MC84OTU5MDEuaHRtbAoJCXZhciBhcnJheV9waHAgPSAiIjsKCQl2YXIgdG90YWwgPSAwOwoJ CWZvciAodmFyIGtleSBpbiBhcnJheSkgewoJCQkrKyB0b3RhbDsKCQkJYXJyYXlfcGhwID0g YXJyYXlfcGhwICsgInM6IiArCgkJCQlTdHJpbmcoa2V5KS5sZW5ndGggKyAiOlwiIiArIFN0 cmluZyhrZXkpICsgIlwiO3M6IiArCgkJCQlTdHJpbmcoYXJyYXlba2V5XSkubGVuZ3RoICsg IjpcIiIgKyBTdHJpbmcoYXJyYXlba2V5XSkgKyAiXCI7IjsKCQl9CgkJYXJyYXlfcGhwID0g ImE6IiArIHRvdGFsICsgIjp7IiArIGFycmF5X3BocCArICJ9IjsKCQlyZXR1cm4gYXJyYXlf cGhwOwoJfQoKCWZ1bmN0aW9uIHBlcm1saW5rX2RpdiAoKSB7CgkJLy8gUmV0dXJuIHRoZSBw ZXJtbGluayBydWxlIGVsZW1lbnQKCQlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo J3skY29tcG9uZW50c19kaXZ9Jyk7Cgl9CgoJZnVuY3Rpb24gZm9ybSAobmFtZSkgewoJCWlm ICghbmFtZSkKCQkJbmFtZSA9ICd7JGNvbXBvbmVudHNfZm9ybX0nCgkJLy8gUmV0dXJuIHRo ZSBmb3JtIGVsZW1lbnQgd2l0aCBuYW1lCgkJcmV0dXJuIGRvY3VtZW50LmZvcm1zLm5hbWVk SXRlbShuYW1lKTsKCX0KCglmdW5jdGlvbiBjb21wb25lbnQgKGluZGV4KSB7CgkJLy8gUmV0 dXJuIGNvbXBvbmVudCB3aXRoIGluZGV4CgkJcmV0dXJuIHBlcm1saW5rX2RpdigpLmNoaWxk Tm9kZXNbaW5kZXhdOwoJfQoKCS8vIF1dPgoJPC9zY3JpcHQ+CkhUTUw7CgoJCS8vIC0tLSBS dWxlIC0tLSAvLwoKCQkkb3V0W10gPSBoZWQoJ1Blcm1hbmVudCBsaW5rIHJ1bGUnLCAyKTsK CQkkb3V0W10gPSAnPGRpdiBpZD0iJy4kY29tcG9uZW50c19kaXYuJyIgc3R5bGU9ImJhY2tn cm91bmQtY29sb3I6IHJnYigyMzAsIDIzMCwgMjMwKTsgd2lkdGg6IGF1dG87IGhlaWdodDog MS41ZW07IG1hcmdpbjogMTBweCAwOyBwYWRkaW5nOiA1cHg7Ij48L2Rpdj4nOwoJCSRvdXRb XSA9IGdyYWYKCQkJKAoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X2Fk ZCcsICdBZGQgY29tcG9uZW50JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X2FkZCgp OycpKS5uLgoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X3JlbW92ZScs ICdSZW1vdmUgY29tcG9uZW50JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X3JlbW92 ZSgpOycpKS5uLgoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X2xlZnQn LCAnTW92ZSBsZWZ0JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X2xlZnQoKTsnKSku bi4KCQkJJHRoaXMtPmZJbnB1dCgnYnV0dG9uJywgJ2NvbXBvbmVudF9yaWdodCcsICdNb3Zl IHJpZ2h0JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X3JpZ2h0KCk7JykpCgkJCSk7 CgoJCS8vIC0tLSBDb21wb25lbnQgZm9ybSAtLS0gLy8KCgkJJG91dFtdID0gJzxmb3JtIGFj dGlvbj0iaW5kZXgucGhwIiBuYW1lPSInLiRjb21wb25lbnRzX2Zvcm0uJyIgb25zdWJtaXQ9 InJldHVybiBmYWxzZTsiPic7CgoJCS8vIC0tLSBDb21wb25lbnQgdHlwZSAtLS0gLy8KCgkJ JGNvbXBvbmVudF90eXBlcyA9IGFycmF5ICgKCQkJJ3NlY3Rpb24nID0+ICdTZWN0aW9uJywg J2NhdGVnb3J5JyA9PiAnQ2F0ZWdvcnknLAoJCQkndGl0bGUnID0+ICdUaXRsZScsICdpZCcg PT4gJ0lEJywKCQkJJ2RhdGUnID0+ICdEYXRlICh5eXl5L21tL2RkKScsICd5ZWFyJyA9PiAn WWVhcicsCgkJCSdtb250aCcgPT4gJ01vbnRoJywgJ2RheScgPT4gJ0RheScsCgkJCSdhdXRo b3InID0+ICdBdXRob3IgKFJlYWwgbmFtZSknLCAnbG9naW4nID0+ICdBdXRob3IgKExvZ2lu KScsCgkJCSdjdXN0b20nID0+ICdDdXN0b20gRmllbGQnLCAncGFnZScgPT4gJ1BhZ2UgTnVt YmVyJywKCQkJJ2ZlZWQnID0+ICdGZWVkJywgJ3NlYXJjaCcgPT4gJ1NlYXJjaCByZXF1ZXN0 JywKCQkJJ3RleHQnID0+ICdQbGFpbiBUZXh0JywgJ3JlZ2V4JyA9PiAnUmVndWxhciBFeHBy ZXNzaW9uJwoJCSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZlNlbGVjdCgndHlwZScsICRj b21wb25lbnRfdHlwZXMsICcnLCAxLCAnQ29tcG9uZW50IHR5cGUnLCAnIG9uY2hhbmdlPSJj b21wb25lbnRfdXBkYXRlKCk7IicpKTsKCgkJLy8gLS0tIENvbXBvbmVudCBkYXRhIC0tLSAv LwoKCQkvLyBHcmFiIHRoZSBjdXN0b20gZmllbGQgdGl0bGVzCgkJJGN1c3RvbV9maWVsZHMg PSBhcnJheSgpOwoJCWZvciAoJGkgPSAxOyAkaSA8PSAxMDsgJGkrKykgewoJCQlpZiAoJHYg PSAkcHJlZnNbImN1c3RvbV97JGl9X3NldCJdKQoJCQkJJGN1c3RvbV9maWVsZHNbJGldID0g JHY7CgkJfQoKCQkkb3V0W10gPSBncmFmICgKCQkJJHRoaXMtPmZTZWxlY3QoJ2N1c3RvbScs ICRjdXN0b21fZmllbGRzLCAnJywgMCwgJ0N1c3RvbScsICcgb25jaGFuZ2U9ImNvbXBvbmVu dF91cGRhdGUodGhpcyk7IicpLm4uCgkJCSR0aGlzLT5mU2VsZWN0KCdjYXRlZ29yeScsIGFy cmF5KCcxJyA9PiAnQ2F0ZWdvcnkgMScsICcyJyA9PiAnQ2F0ZWdvcnkgMicpLCAnJywgMCwg J1ByaW1hcnkgQ2F0ZWdvcnknLCAnIG9uY2hhbmdlPSJjb21wb25lbnRfdXBkYXRlKHRoaXMp OyInKS5uLgoJCQkkdGhpcy0+ZklucHV0KCd0ZXh0JywgJ25hbWUnLCAnJywgYXJyYXkoJ2tl eXVwJyA9PiAnY29tcG9uZW50X3VwZGF0ZSh0aGlzKTsnKSwgJ05hbWUnKS5uLgoJCQkkdGhp cy0+ZklucHV0KCd0ZXh0JywgJ3ByZWZpeCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21w b25lbnRfdXBkYXRlKHRoaXMpOycpLCAnUHJlZml4Jykubi4KCQkJJHRoaXMtPmZJbnB1dCgn dGV4dCcsICdyZWdleCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21wb25lbnRfdXBkYXRl KHRoaXMpOycpLCAnUmVndWxhciBFeHByZXNzaW9uJykubi4KCQkJJHRoaXMtPmZJbnB1dCgn dGV4dCcsICdzdWZmaXgnLCAnJywgYXJyYXkoJ2tleXVwJyA9PiAnY29tcG9uZW50X3VwZGF0 ZSh0aGlzKTsnKSwgJ1N1ZmZpeCcpLm4uCgkJCSR0aGlzLT5mSW5wdXQoJ3RleHQnLCAndGV4 dCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21wb25lbnRfdXBkYXRlKHRoaXMpOycpLCAn VGV4dCcpCgkJKTsKCQkkaHIgPSAnPGhyIHN0eWxlPSJib3JkZXI6IDA7IGhlaWdodDogMXB4 OyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjAwLCAyMDAsIDIwMCk7IGNvbG9yOiByZ2IoMjAw LCAyMDAsIDIwMCk7IG1hcmdpbi1ib3R0b206IDEwcHg7IiAvPic7CgkJJG91dFtdID0gJGhy OwoJCSRvdXRbXSA9ICc8L2Zvcm0+JzsKCgkJLy8gLS0tIFNldHRpbmdzIGZvcm0gLS0tIC8v CgoJCSRvdXRbXSA9ICc8Zm9ybSBhY3Rpb249ImluZGV4LnBocCIgbWV0aG9kPSJwb3N0IiBu YW1lPSInLiRzZXR0aW5nc19mb3JtLiciIG9uc3VibWl0PSJyZXR1cm4gc2F2ZSh0aGlzKTsi Pic7CgoJCS8vIC0tLSBTZXR0aW5ncyAtLS0gLy8KCgkJJG91dFtdID0gaGVkKCc8YSBocmVm PSIjIiBvbmNsaWNrPSJ0b2dnbGVEaXNwbGF5KFwnc2V0dGluZ3NcJyk7IHJldHVybiBmYWxz ZTsiPlNldHRpbmdzPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2IGlkPSJzZXR0aW5ncyI+ JzsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mSW5wdXQoJ3RleHQnLCAncGxfbmFtZScsICRw bF9uYW1lLCBOVUxMLCAnTmFtZScpKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mSW5wdXQo J3RleHQnLCAncGxfcHJlY2VkZW5jZScsICRwbF9wcmVjZWRlbmNlLCBOVUxMLCAnUHJlY2Vk ZW5jZScpKTsKCQkkb3V0W10gPSAnPC9kaXY+JzsKCQkkb3V0W10gPSAkaHI7CgoJCS8vIC0t LSBDb25kaXRpb25zIC0tLSAvLwoKCQkkb3V0W10gPSBoZWQoJzxhIGhyZWY9IiMiIG9uY2xp Y2s9InRvZ2dsZURpc3BsYXkoXCdjb25kaXRpb25zXCcpOyByZXR1cm4gZmFsc2U7Ij5Db25k aXRpb25zPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2IGlkPSJjb25kaXRpb25zIiBzdHls ZT0iZGlzcGxheTpub25lIj4nOwoJCSRvdXRbXSA9IGdyYWYoc3Ryb25nKCdPbmx5IHVzZSB0 aGlzIHBlcm1hbmVudCBsaW5rIGlmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBseS4u LicpKTsKCgkJLy8gR2VuZXJhdGUgYSBzZWN0aW9ucyBhcnJheSAobmFtZT0+dGl0bGUpCgkJ JHNlY3Rpb25zID0gYXJyYXkoKTsKCQkkcnMgPSBzYWZlX3Jvd3MoJ25hbWUsIHRpdGxlJywg J3R4cF9zZWN0aW9uJywgIm5hbWUgIT0gJ2RlZmF1bHQnIG9yZGVyIGJ5IG5hbWUiKTsKCQlm b3JlYWNoICgkcnMgYXMgJHNlYykgewoJCQkkc2VjdGlvbnNbJHNlY1snbmFtZSddXSA9ICRz ZWNbJ3RpdGxlJ107CgkJfQoKCQkvLyBHZW5lcmF0ZSBhIGNhdGVnb3JpZXMgYXJyYXkgKG5h bWU9PnRpdGxlKQoJCSRjYXRlZ29yaWVzID0gYXJyYXkoKTsKCQkkcnMgPSBzYWZlX3Jvd3Mo J25hbWUsIHRpdGxlJywgJ3R4cF9jYXRlZ29yeScsICJ0eXBlID0gJ2FydGljbGUnIGFuZCBu YW1lICE9ICdyb290JyBvcmRlciBieSBuYW1lIik7CgkJZm9yZWFjaCAoJHJzIGFzICRzZWMp IHsKCQkJJGNhdGVnb3JpZXNbJHNlY1snbmFtZSddXSA9ICRzZWNbJ3RpdGxlJ107CgkJfQoK CQkkb3V0W10gPSBncmFmICgKCQkJJHRoaXMtPmZTZWxlY3QoJ2Nvbl9zZWN0aW9uJywgJHNl Y3Rpb25zLCAkY29uX3NlY3Rpb24sIDEsICdXaXRoaW4gc2VjdGlvbicpLm4uCgkJCSR0aGlz LT5mU2VsZWN0KCdjb25fY2F0ZWdvcnknLCAkY2F0ZWdvcmllcywgJGNvbl9jYXRlZ29yeSwg MSwgJ1dpdGhpbiBjYXRlZ29yeScpCgkJKTsKCQkkb3V0W10gPSAnPC9kaXY+JzsKCQkkb3V0 W10gPSAkaHI7CgoJCS8vIC0tLSBEZXN0aW5hdGlvbiAtLS0gLy8KCgkJJG91dFtdID0gaGVk KCc8YSBocmVmPSIjIiBvbmNsaWNrPSJ0b2dnbGVEaXNwbGF5KFwnZGVzdGluYXRpb25cJyk7 IHJldHVybiBmYWxzZTsiPkRlc3RpbmF0aW9uPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2 IGlkPSJkZXN0aW5hdGlvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+JzsKCQkkb3V0W10gPSBn cmFmKHN0cm9uZygnRm9yd2FyZCB0aGlzIHBlcm1hbmVudCBsaW5rIHRvLi4uJykpOwoJCSRv dXRbXSA9IGdyYWYgKAoJCQkkdGhpcy0+ZlNlbGVjdCgnZGVzX3NlY3Rpb24nLCAkc2VjdGlv bnMsICRkZXNfc2VjdGlvbiwgMSwgJ1NlY3Rpb24nKS5uLgoJCQkkdGhpcy0+ZlNlbGVjdCgn ZGVzX2NhdGVnb3J5JywgJGNhdGVnb3JpZXMsICRkZXNfY2F0ZWdvcnksIDEsICdDYXRlZ29y eScpCgkJKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mU2VsZWN0KCdkZXNfcGFnZScsIHNh ZmVfY29sdW1uKCduYW1lJywgJ3R4cF9wYWdlJywgIjEiKSwgQCRkZXNfcGFnZSwgMSwgJ1Bh Z2UnKSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZkJveGVzKCdkZXNfZmVlZCcsIGFycmF5 KCdyc3MnLCAnYXRvbScsICcnKSwgJGRlc19mZWVkLCBOVUxMLCBhcnJheSgnUlNTIGZlZWQn LCAnQXRvbSBmZWVkJywgJ05laXRoZXInKSkpOwoJCSRvdXRbXSA9IGdyYWYoc3Ryb25nKCdS ZWRpcmVjdCB0aGlzIHBlcm1hbmVudCBsaW5rIHRvLi4uJykpOwoJCS8vIEdlbmVyYXRlIGEg cGVybWxpbmtzIGFycmF5CgkJJHBlcm1saW5rcyA9ICR0aGlzLT5wYXJlbnQtPmdldF9hbGxf cGVybWxpbmtzKDEpOwoJCWZvcmVhY2ggKCRwZXJtbGlua3MgYXMgJGtleSA9PiAkcGwpIHsK CQkJJHBlcm1saW5rc1ska2V5XSA9ICRwbFsnc2V0dGluZ3MnXVsncGxfbmFtZSddOwoJCX0K CQl1bnNldCgkcGVybWxpbmtzWyRpZF0pOwoJCSRvdXRbXSA9IGdyYWYoJHRoaXMtPmZTZWxl Y3QoJ2Rlc19wZXJtbGluaycsICRwZXJtbGlua3MsIEAkZGVzX3Blcm1saW5rLCAxLCAnUGVy bWFuZW50IGxpbmsnKSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZklucHV0KCd0ZXh0Jywg J2Rlc19sb2NhdGlvbicsICRkZXNfbG9jYXRpb24sIE5VTEwsICdIVFRQIGxvY2F0aW9uJykp OwoJCSRvdXRbXSA9ICc8L2Rpdj4nOwoJCSRvdXRbXSA9ICRocjsKCgkJLy8gU2F2ZSBidXR0 b24KCQkkb3V0W10gPSBmSW5wdXQoJ3N1Ym1pdCcsICcnLCAnU2F2ZSBwZXJtYW5lbnQgbGlu aycpOwoKCQkvLyBFeHRyYSBmb3JtIGlucHV0cyB3aGljaCBnZXQgZmlsbGVkIG9uIHN1Ym1p dAoJCSRvdXRbXSA9IGhJbnB1dCgnY29tcG9uZW50cycsICcnKTsKCQkkb3V0W10gPSBoSW5w dXQoJ3BsX3ByZXZpZXcnLCAnJyk7CgkJLy8gRXZlbnQgYW5kIHRhYiBmb3JtIGlucHV0cwoJ CSRvdXRbXSA9ICR0aGlzLT5mb3JtX2lucHV0cygpOwoJCS8vIFN0ZXAgYW5kIElEIGZvcm0g aW5wdXRzCgkJJG91dFtdID0gc0lucHV0KCRzdGVwKTsKCQkkb3V0W10gPSBoSW5wdXQoZ2Jw X2lkLCAkaWQpOwoKCQkkb3V0W10gPSAnPC9mb3JtPic7CgoJCS8vIExldHMgZWNobyBldmVy eXRoaW5nIG91dC4gWWFoIQoJCWVjaG8gam9pbihuLCAkb3V0KTsKCX0KCglmdW5jdGlvbiBm TGFiZWwgKCRsYWJlbCwgJGNvbnRlbnRzID0gJycsICRsYWJlbF9yaWdodCA9IGZhbHNlKSB7 CgkJLy8gPGxhYmVsPiB0aGUgY29udGVudHMgd2l0aCB0aGUgbmFtZSAkbGFibGUKCQkkY29u dGVudHMgPSAoJGxhYmVsX3JpZ2h0KQoJCT8gJGNvbnRlbnRzLiRsYWJlbAoJCTogJGxhYmVs LigkY29udGVudHMgPyAnOiAnLiRjb250ZW50cyA6ICcnKTsKCQlyZXR1cm4gdGFnKCRjb250 ZW50cywgJ2xhYmVsJyk7Cgl9CgoJZnVuY3Rpb24gZkJveGVzICgkbmFtZSA9ICcnLCAkdmFs dWUgPSAnJywgJGNoZWNrZWRfdmFsdWUgPSAnJywgJG9uID0gYXJyYXkoKSwgJGxhYmVsID0g JycpIHsKCQkkb3V0ID0gYXJyYXkoKTsKCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewoJCQkk aSA9IDA7CgkJCWZvcmVhY2ggKCR2YWx1ZSBhcyAkdmFsKSB7CgkJCQkkbyA9ICc8aW5wdXQg dHlwZT0icmFkaW8iIG5hbWU9IicuJG5hbWUuJyIgdmFsdWU9IicuJHZhbC4nIic7CgkJCQkk byAuPSAoJGNoZWNrZWRfdmFsdWUgPT0gJHZhbCkgPyAnIGNoZWNrZWQ9ImNoZWNrZWQiJyA6 ICcnOwoJCQkJaWYgKGlzX2FycmF5KCRvbikpIGZvcmVhY2goJG9uIGFzICRrID0+ICR2KQoJ CQkJCSRvIC49ICgkb24pID8gJyBvbicuJGsuJz0iJy4kdi4nIicgOiAnJzsKCQkJCSRvIC49 ICcgLz4nOwoJCQkJJG91dFtdID0gJHRoaXMtPmZMYWJlbCgkbGFiZWxbJGkrK10sICRvLCB0 cnVlKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRvID0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIg bmFtZT0iJy4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyInOwoJCQkkbyAuPSAoJGNoZWNr ZWRfdmFsdWUgPT0gJHZhbHVlKSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJyc7CgkJCWlm IChpc19hcnJheSgkb24pKSBmb3JlYWNoKCRvbiBhcyAkayA9PiAkdikKCQkJCSRvIC49ICgk b24pID8gJyBvbicuJGsuJz0iJy4kdi4nIicgOiAnJzsKCQkJJG8gLj0gJyAvPic7CgkJCSRv dXRbXSA9ICR0aGlzLT5mTGFiZWwoJGxhYmVsLCAkbywgdHJ1ZSk7CgkJfQoKCQlyZXR1cm4g am9pbignJywgJG91dCk7Cgl9CgoJZnVuY3Rpb24gZklucHV0ICgkdHlwZSwgJG5hbWUgPSAn JywgJHZhbHVlID0gJycsICRvbiA9IGFycmF5KCksICRsYWJlbCA9ICcnKSB7CgkJaWYgKCR0 eXBlID09ICdyYWRpbycgfHwgJHR5cGUgPT0gJ2NoZWNrYm94JykKCQkJcmV0dXJuICR0aGlz LT5mQm94ZXMoJG5hbWUsICR2YWx1ZSwgJG9uLCAkbGFiZWwpOwoKCQkkbyA9ICc8aW5wdXQg dHlwZT0iJy4kdHlwZS4nIiBuYW1lPSInLiRuYW1lLiciIHZhbHVlPSInLiR2YWx1ZS4nIic7 CgkJaWYgKGlzX2FycmF5KCRvbikpIGZvcmVhY2goJG9uIGFzICRrID0+ICR2KQoJCQkkbyAu PSAoJG9uKSA/ICcgb24nLiRrLic9IicuJHYuJyInIDogJyc7CgkJJG8gLj0gJyAvPic7CgkJ cmV0dXJuICgkbGFiZWwpID8gJHRoaXMtPmZMYWJlbCgkbGFiZWwsICRvKSA6ICRvOwoJfQoK CWZ1bmN0aW9uIGZTZWxlY3QgKCRuYW1lID0gJycsICRhcnJheSA9ICcnLCAkdmFsdWUgPSAn JywgJGJsYW5rX2ZpcnN0ID0gJycsICRsYWJlbCA9ICcnLCAkb25fc3VibWl0ID0gJycpIHsK CQkkbyA9IHNlbGVjdElucHV0KCRuYW1lLCAkYXJyYXksICR2YWx1ZSwgJGJsYW5rX2ZpcnN0 LCAkb25fc3VibWl0KTsKCQlyZXR1cm4gKCRsYWJlbCA/ICR0aGlzLT5mTGFiZWwoJGxhYmVs LCAkbykgOiAkbyk7Cgl9CgoJZnVuY3Rpb24gcG9zdF9zYXZlX3Blcm1saW5rICgpIHsKCQkv LyBUaGUgZnVuY3Rpb24gcG9zdHMgb3Igc2F2ZXMgYSBwZXJtYW5lbnQgbGluayB0byB0eHBf cHJlZnMKCgkJZXh0cmFjdChncHNhKGFycmF5KCdzdGVwJywgZ2JwX2lkKSkpOwoKCQkvLyBH cmFiIHRoZSB1c2VyIGRlZmluZWQgc2V0dGluZ3MgZnJvbSB0aGUgZm9ybSBQT1NUIGRhdGEK CQkkc2V0dGluZ3MgPSBncHNhKGFycmF5KAoJCQkncGxfbmFtZScsICdwbF9wcmVjZWRlbmNl JywgJ3BsX3ByZXZpZXcnLAoJCQknY29uX3NlY3Rpb24nLCAnY29uX2NhdGVnb3J5JywKCQkJ J2Rlc19zZWN0aW9uJywgJ2Rlc19jYXRlZ29yeScsICdkZXNfcGFnZScsCgkJCSdkZXNfcGVy bWxpbmsnLCAnZGVzX2ZlZWQnLCAnZGVzX2xvY2F0aW9uJywKCQkpKTsKCgkJLy8gUmVtb3Zl IHNwYWNlcyBmcm9tIHRoZSBwZXJtYW5lbnQgbGluayBwcmV2aWV3CgkJJHNldHRpbmdzWydw bF9wcmV2aWV3J10gPSBwcmVnX3JlcGxhY2UoJyVccysvXHMqJScsICcvJywgJHNldHRpbmdz WydwbF9wcmV2aWV3J10pOwoKCQkvLyBFeHBsb2RlIHRoZSBzZXBhcmF0ZWQgc3RyaW5nIG9m IHNlcmlhbGl6ZSBjb21wb25lbnRzIC0gdGhpcyB3YXMgbWFkZSBieSBKYXZhU2NyaXB0LgoJ CSRzZXJpYWxpemVfY29tcG9uZW50cyA9IGV4cGxvZGUoZ2JwX3NlcGFyYXRvciwgcnRyaW0o Z3BzKCdjb21wb25lbnRzJyksIGdicF9zZXBhcmF0b3IpKTsKCgkJLy8gVW5zZXJpYWxpemUg dGhlIGNvbXBvbmVudHMKCQkkY29tcG9uZW50cyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHNl cmlhbGl6ZV9jb21wb25lbnRzIGFzICRjKQoJCQkkY29tcG9uZW50c1tdID0gdW5zZXJpYWxp emUoc3RyaXBzbGFzaGVzKCRjKSk7CgoJCS8vIENvbXBsZXRlIHRoZSBwZXJtYW5lbnQgbGlu ayBhcnJheSAtIHRoaXMgaXMgZXhhY3RseSB3aGF0IG5lZWRzIHRvIGJlIHN0b3JlZCBpbiB0 aGUgZGIKCQkkcGVybWxpbmsgPSBhcnJheSgnc2V0dGluZ3MnID0+ICRzZXR0aW5ncywgJ2Nv bXBvbmVudHMnID0+ICRjb21wb25lbnRzKTsKCgkJLy8gU2F2ZSBpdAoJCSR0aGlzLT5zZXRf cHJlZmVyZW5jZSgkaWQsICRwZXJtbGluaywgJ2dicF9zZXJpYWxpemVkJyk7CgoJCSR0aGlz LT5wYXJlbnQtPm1lc3NhZ2UgPSBtZXNzZW5nZXIoJycsICRzZXR0aW5nc1sncGxfbmFtZSdd LCAnc2F2ZWQnKTsKCX0KCglmdW5jdGlvbiBwaHBBcnJheVRvSnNBcnJheSAoJG5hbWUsICRh cnJheSkgewoJCS8vIEZyb20gUEhQLm5ldAoJCWlmIChpc19hcnJheSgkYXJyYXkpKSB7CgkJ CSRyZXN1bHQgPSAkbmFtZS4nID0gbmV3IEFycmF5KCk7Jy5uOwoJCQlmb3JlYWNoICgkYXJy YXkgYXMgJGtleSA9PiAkdmFsdWUpCgkJCQkkcmVzdWx0IC49ICR0aGlzLT5waHBBcnJheVRv SnNBcnJheSgkbmFtZS4nW1wnJy4ka2V5LidcJ10nLCR2YWx1ZSwnJykubjsKCQl9IGVsc2Ug ewoJCQkkcmVzdWx0ID0gJG5hbWUuJyA9IFwnJy4kYXJyYXkuJ1wnOyc7CgkJfQoJCXJldHVy biAkcmVzdWx0OwoJfQp9CgpjbGFzcyBQZXJtYW5lbnRMaW5rc0xpc3RUYWJWaWV3IGV4dGVu ZHMgR0JQQWRtaW5UYWJWaWV3CnsKCWZ1bmN0aW9uIHByZWxvYWQgKCkgewoJCXJlZ2lzdGVy X2NhbGxiYWNrKGFycmF5KCYkdGhpcywgJHRoaXMtPnBhcmVudC0+ZXZlbnQuJ19tdWx0aV9l ZGl0JyksICR0aGlzLT5wYXJlbnQtPmV2ZW50LCAkdGhpcy0+cGFyZW50LT5ldmVudC4nX211 bHRpX2VkaXQnLCAxKTsKCQlyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJHRoaXMsICR0aGlz LT5wYXJlbnQtPmV2ZW50LidfY2hhbmdlX3BhZ2VieScpLCAkdGhpcy0+cGFyZW50LT5ldmVu dCwgJHRoaXMtPnBhcmVudC0+ZXZlbnQuJ19jaGFuZ2VfcGFnZWJ5JywgMSk7Cgl9CgoJZnVu Y3Rpb24gbWFpbiAoKSB7CgkJZXh0cmFjdChncHNhKGFycmF5KCdwYWdlJywgJ3NvcnQnLCAn ZGlyJywgJ2NyaXQnLCAnc2VhcmNoX21ldGhvZCcpKSk7CgoJCSRldmVudCA9ICR0aGlzLT5w YXJlbnQtPmV2ZW50OwoKCQkkcGVybWxpbmtzID0gJHRoaXMtPnBhcmVudC0+Z2V0X2FsbF9w ZXJtbGlua3MoKTsKCQkkdG90YWwgPSBjb3VudCgkcGVybWxpbmtzKTsKCgkJaWYgKCR0b3Rh bCA8IDEpIHsKCQkJZWNobyBncmFmKCdZb3UgaGF2ZW5cJ3QgY3JlYXRlZCBhbnkgY3VzdG9t IHBlcm1hbmVudCBsaW5rcyBydWxlcyB5ZXQuJywgJyBzdHlsZT0idGV4dC1hbGlnbjogY2Vu dGVyOyInKS4KCQkJCSBncmFmKCc8YSBocmVmPSInLiR0aGlzLT51cmwoYXJyYXkoZ2JwX3Rh YiA9PiAnYnVpbGQnKSwgdHJ1ZSkuJyI+Q2xpY2sgaGVyZTwvYT4gdG8gYWRkIG9uZS4nLCAn IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IicpOwoJCQlyZXR1cm47CgkJfQoKCQkkbGlt aXQgPSBtYXgoJHRoaXMtPnByZWYoJ2xpc3RfcGFnZWJ5JyksIDE1KTsKCgkJbGlzdCgkcGFn ZSwgJG9mZnNldCwgJG51bVBhZ2VzKSA9ICR0aGlzLT5wYWdlcigkdG90YWwsICRsaW1pdCwg JHBhZ2UpOwoKCQlpZiAoZW1wdHkoJHNvcnQpKQoJCQkkc29ydCA9ICdwbF9wcmVjZWRlbmNl JzsKCgkJaWYgKGVtcHR5KCRkaXIpKQoJCQkkZGlyID0gJ2Rlc2MnOwoKCQkkZGlyID0gKCRk aXIgPT0gJ2Rlc2MnKSA/ICdkZXNjJyA6ICdhc2MnOwoKCQkvLyBTb3J0IHRoZSBwZXJtbGlu a3MgdmlhIHRoZSBzZWxlY3RlZCBjb2x1bW4gYW5kIHRoZW4gdGhlaXIgbmFtZXMuCgkJZm9y ZWFjaCAoJHBlcm1saW5rcyBhcyAkaWQgPT4gJHBlcm1saW5rKSB7CgkJCSRzb3J0X2tleXNb JGlkXSA9ICRwZXJtbGlua1snc2V0dGluZ3MnXVskc29ydF07CgkJCSRuYW1lWyRpZF0gPSAk cGVybWxpbmtbJ3NldHRpbmdzJ11bJ3BsX25hbWUnXTsKCQl9CgkJYXJyYXlfbXVsdGlzb3J0 KCRzb3J0X2tleXMsICgoJGRpciA9PSAnZGVzYycpID8gU09SVF9ERVNDIDogU09SVF9BU0Mp LCAkbmFtZSwgU09SVF9BU0MsICRwZXJtbGlua3MpOwoKCQkkc3dpdGNoX2RpciA9ICgkZGly ID09ICdkZXNjJykgPyAnYXNjJyA6ICdkZXNjJzsKCgkJJHBlcm1saW5rcyA9IGFycmF5X3Ns aWNlKCRwZXJtbGlua3MsICRvZmZzZXQsICRsaW1pdCk7CgoJCWlmIChjb3VudCgkcGVybWxp bmtzKSkgewoJCQllY2hvIG4ubi4nPGZvcm0gbmFtZT0ibG9uZ2Zvcm0iIG1ldGhvZD0icG9z dCIgYWN0aW9uPSJpbmRleC5waHAiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0 KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLgoKCQkJCW4uc3RhcnRUYWJsZSgnbGlzdCcpLgoJ CQkJbi50cigKCQkJCQluLmNvbHVtbl9oZWFkKCduYW1lJywgJ3BsX25hbWUnLCAkZXZlbnQs IHRydWUsICRzd2l0Y2hfZGlyLCAkY3JpdCwgJHNlYXJjaF9tZXRob2QpLgoJCQkJCWhDZWxs KCkuCgkJCQkJY29sdW1uX2hlYWQoJ3ByZXZpZXcnLCAncGxfcHJldmlldycsICRldmVudCwg dHJ1ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkuCgkJCQkJY29sdW1u X2hlYWQoJ3ByZWNlZGVuY2UnLCAncGxfcHJlY2VkZW5jZScsICRldmVudCwgdHJ1ZSwgJHN3 aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkuCgkJCQkJaENlbGwoKQoJCQkJKTsK CgkJCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3RhZ2hhbmRsZXJzLnBocCc7CgoJ CQlmb3JlYWNoICgkcGVybWxpbmtzIGFzICRpZCA9PiAkcGVybWxpbmspIHsKCQkJCWV4dHJh Y3QoJHBlcm1saW5rWydzZXR0aW5ncyddKTsKCgkJCQkkbWFuYWdlID0gbi4nPHVsJy4odmVy c2lvbl9jb21wYXJlKCRHTE9CQUxTWyd0aGlzdmVyc2lvbiddLCAnNC4wLjMnLCAnPD0nKSA/ ICcgc3R5bGU9Im1hcmdpbjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlLXR5cGU6bm9uZTsiPicg OiAnPicpLgoJCQkJCQluLnQuJzxsaT4nLmhyZWYoZ1R4dCgnZWRpdCcpLCAkdGhpcy0+dXJs KGFycmF5KGdicF90YWIgPT4gJ2J1aWxkJywgZ2JwX2lkID0+ICRpZCksIHRydWUpKS4nPC9s aT4nLgoJCQkJCQluLic8L3VsPic7CgoJCQkJZWNobyBuLm4udHIoCgoJCQkJCXRkKAoJCQkJ CQlocmVmKCRwbF9uYW1lLCAkdGhpcy0+dXJsKGFycmF5KGdicF90YWIgPT4gJ2J1aWxkJywg Z2JwX2lkID0+ICRpZCksIHRydWUpKQoJCQkJCSwgNzUpLgoKCQkJCQl0ZCgkbWFuYWdlLCAz NSkuCgoJCQkJCXRkKCRwbF9wcmV2aWV3LCAxNzUpLgoJCQkJCXRkKCRwbF9wcmVjZWRlbmNl LicmbmJzcDsnLCA1MCkuCgoJCQkJCXRkKAoJCQkJCQlmSW5wdXQoJ2NoZWNrYm94JywgJ3Nl bGVjdGVkW10nLCAkaWQpCgkJCQkJKQoJCQkJKTsKCQkJfQoKCQkJZWNobyBuLm4udHIoCgkJ CQl0ZGEoCgkJCQkJc2VsZWN0X2J1dHRvbnMoKS4KCQkJCQkkdGhpcy0+cGVybWxpbmtzX211 bHRpZWRpdF9mb3JtKCRwYWdlLCAkc29ydCwgJGRpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9k KQoJCQkJLCcgY29sc3Bhbj0iNCIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyBib3JkZXI6 IG5vbmU7IicpCgkJCSkuCgoJCQluLmVuZFRhYmxlKCkuCgkJCW4uJzwvZm9ybT4nLgoKCQkJ bi4kdGhpcy0+bmF2X2Zvcm0oJGV2ZW50LCAkcGFnZSwgJG51bVBhZ2VzLCAkc29ydCwgJGRp ciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kKS4KCgkJCW4ucGFnZWJ5X2Zvcm0oJGV2ZW50LCAk dGhpcy0+cHJlZignbGlzdF9wYWdlYnknKSk7CgkJfQoJfQoKCWZ1bmN0aW9uIHBhZ2VyICgk dG90YWwsICRsaW1pdCwgJHBhZ2UpIHsKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdwYWdlcicp KQoJCQlyZXR1cm4gcGFnZXIoJHRvdGFsLCAkbGltaXQsICRwYWdlKTsKCgkJLy8gVGhpcyBp cyB0YWtlbiBmcm9tIHR4cGxpYl9taXNjLnBocCByMTU4OCBpdCBpcyByZXF1aXJlZCBmb3Ig NC4wLjMgY29tcGF0aWJpdGx5CgkJJG51bV9wYWdlcyA9IGNlaWwoJHRvdGFsIC8gJGxpbWl0 KTsKCQkkcGFnZSA9ICRwYWdlID8gKGludCkgJHBhZ2UgOiAxOwoJCSRwYWdlID0gbWluKG1h eCgkcGFnZSwgMSksICRudW1fcGFnZXMpOwoJCSRvZmZzZXQgPSBtYXgoKCRwYWdlIC0gMSkg KiAkbGltaXQsIDApOwoJCXJldHVybiBhcnJheSgkcGFnZSwgJG9mZnNldCwgJG51bV9wYWdl cyk7Cgl9CgoJZnVuY3Rpb24gbmF2X2Zvcm0gKCRldmVudCwgJHBhZ2UsICRudW1QYWdlcywg JHNvcnQsICRkaXIsICRjcml0LCAkbWV0aG9kKSB7CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygn bmF2X2Zvcm0nKSkKCQkJcmV0dXJuIG5hdl9mb3JtKCRldmVudCwgJHBhZ2UsICRudW1QYWdl cywgJHNvcnQsICRkaXIsICRjcml0LCAkbWV0aG9kKTsKCgkJLy8gVGhpcyBpcyBiYXNpY2Fs bHkgc3RvbGVuIGZyb20gdGhlIDQuMC4zIHZlcnNpb24gb2YgaW5jbHVkZXMvdHhwX2xpc3Qu cGhwCgkJLy8gLSBsaXN0X25hdl9mb3JtKCkgZm9yIDQuMC4zIGNvbXBhdGliaXRseQoJCSRu YXZbXSA9ICgkcGFnZSA+IDEpCgkJCT8gUHJldk5leHRMaW5rKCRldmVudCwgJHBhZ2UtMSwg Z1R4dCgncHJldicpLCAncHJldicsICRzb3J0LCAkZGlyKSA6ICcnOwoJCSRuYXZbXSA9IHNw LnNtYWxsKCRwYWdlLiAnLycuJG51bVBhZ2VzKS5zcDsKCQkkbmF2W10gPSAoJHBhZ2UgIT0g JG51bVBhZ2VzKQoJCQk/IFByZXZOZXh0TGluaygkZXZlbnQsICRwYWdlKzEsIGdUeHQoJ25l eHQnKSwgJ25leHQnLCAkc29ydCwgJGRpcikgOiAnJzsKCQlyZXR1cm4gKCRuYXYpCgkJCT8g Z3JhZihqb2luKCcnLCAkbmF2KSwgJyBhbGlnbj0iY2VudGVyIicpIDogJyc7Cgl9CgoJZnVu Y3Rpb24gcGVybWxpbmtzX211bHRpZWRpdF9mb3JtICgkcGFnZSwgJHNvcnQsICRkaXIsICRj cml0LCAkc2VhcmNoX21ldGhvZCkgewoJCSRtZXRob2RzID0gYXJyYXkoCgkJCSdkZWxldGUn ID0+IGdUeHQoJ2RlbGV0ZScpLAoJCSk7CgoJCXJldHVybiBldmVudF9tdWx0aWVkaXRfZm9y bSgkdGhpcy0+cGFyZW50LT5ldmVudCwgJG1ldGhvZHMsICRwYWdlLCAkc29ydCwgJGRpciwg JGNyaXQsICRzZWFyY2hfbWV0aG9kKTsKCX0KCglmdW5jdGlvbiBwZXJtbGlua3NfY2hhbmdl X3BhZ2VieSAoKSB7CgkJJHRoaXMtPnNldF9wcmVmZXJlbmNlKCdsaXN0X3BhZ2VieScsIGdw cygncXR5JykpOwoJfQoKCWZ1bmN0aW9uIHBlcm1saW5rc19tdWx0aV9lZGl0ICgpIHsKCQkk bWV0aG9kID0gZ3BzKCdlZGl0X21ldGhvZCcpCgkJCT8gZ3BzKCdlZGl0X21ldGhvZCcpIC8v IEZyb20gVHhwIDQuMC40IGFuZCBncmVhdGVyCgkJCTogZ3BzKCdtZXRob2QnKTsgLy8gVXAg dG8gVHhwIDQuMC4zCgoJCXN3aXRjaCAoJG1ldGhvZCkgewoJCQljYXNlICdkZWxldGUnOgoJ CQkJZm9yZWFjaCAoZ3BzKCdzZWxlY3RlZCcpIGFzICRpZCkgewoJCQkJCQkJJGRlbGV0ZWRb XSA9ICR0aGlzLT5wYXJlbnQtPnJlbW92ZV9wZXJtbGluaygkaWQpOwoJCQkJfQoJCQlicmVh azsKCQl9CgoJCSR0aGlzLT5wYXJlbnQtPm1lc3NhZ2UgPSAoaXNzZXQoJGRlbGV0ZWQpICYm IGlzX2FycmF5KCRkZWxldGVkKSAmJiBjb3VudCgkZGVsZXRlZCkpCgkJCT8gbWVzc2VuZ2Vy KCcnLCBqb2luKCcsICcsICRkZWxldGVkKSAsJ2RlbGV0ZWQnKQoJCQk6IG1lc3Nlbmdlcign YW4gZXJyb3Igb2NjdXJyZWQnLCAnJywgJycpOwoJfQp9CgpnbG9iYWwgJGdicF9wbDsKJGdi cF9wbCA9IG5ldyBQZXJtYW5lbnRMaW5rcygnUGVybWFuZW50IExpbmtzJywgJ3Blcm1saW5r cycsICdhZG1pbicpOwppZiAoQHR4cGludGVyZmFjZSA9PSAncHVibGljJykgewoJcmVnaXN0 ZXJfY2FsbGJhY2soYXJyYXkoJiRnYnBfcGwsICdfZmVlZF9lbnRyeScpLCAncnNzX2VudHJ5 Jyk7CglyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJGdicF9wbCwgJ19mZWVkX2VudHJ5Jyks ICdhdG9tX2VudHJ5Jyk7CglyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJGdicF9wbCwgJ190 ZXh0cGF0dGVybicpLCAndGV4dHBhdHRlcm4nKTsKCXJlZ2lzdGVyX2NhbGxiYWNrKGFycmF5 KCYkZ2JwX3BsLCAnX3RleHRwYXR0ZXJuX2VuZCcpLCAndGV4dHBhdHRlcm5fZW5kJyk7CgoJ ZnVuY3Rpb24gZ2JwX2lmX3JlZ2V4ICgkYXR0cywgJHRoaW5nKSB7CgkJZ2xvYmFsICRwcmV0 ZXh0OwoJCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJCSduYW1lJyA9PiAnJywKCQkJJ3ZhbCcg ID0+ICcnLAoJCSksJGF0dHMpKTsKCQkkbWF0Y2ggPSAoQCRwcmV0ZXh0WyJwZXJtbGlua19y ZWdleF97JG5hbWV9Il0gPT0gJHZhbCk7CgkJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGlu ZywgJG1hdGNoKSk7Cgl9CgoJZnVuY3Rpb24gZ2JwX2lmX3RleHQgKCRhdHRzLCAkdGhpbmcp IHsKCQlnbG9iYWwgJHByZXRleHQ7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ25hbWUn ID0+ICcnLAoJCQkndmFsJyAgPT4gJycsCgkJKSwkYXR0cykpOwoKCQkkbWF0Y2ggPSBmYWxz ZTsKCQlpZiAoIWVtcHR5KCRuYW1lKSkgewoJCQlpZiAoZW1wdHkoJHZhbCkpCgkJCQkkbWF0 Y2ggPSAoaXNzZXQoJHByZXRleHRbInBlcm1saW5rX3RleHRfeyRuYW1lfSJdKSk7CgkJCWVs c2UKCQkJCSRtYXRjaCA9IChAJHByZXRleHRbInBlcm1saW5rX3RleHRfeyRuYW1lfSJdID09 ICR2YWwpOwoJCX0KCQlyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkbWF0Y2gpKTsK CX0KCglmdW5jdGlvbiBnYnBfdXNlX3BhZ2VsaW5rICgkYXR0cywgJHRoaW5nID0gJycpIHsK CQlnbG9iYWwgJGdicF9wbDsKCQlleHRyYWN0KGxBdHRzKGFycmF5KAoJCQkncnVsZScgPT4g JycsCgkJKSwkYXR0cykpOwoJCXJldHVybiAkZ2JwX3BsLT5fdGV4dHBhdHRlcm5fZW5kKHBh cnNlKCR0aGluZyksICRydWxlKTsKCX0KCglmdW5jdGlvbiBnYnBfZGlzYWJsZV9wZXJtbGlu a3MgKCRhdHRzLCAkdGhpbmcgPSAnJykgewoJCWdsb2JhbCAkZ2JwX3BsOwoJCXJldHVybiAk Z2JwX3BsLT50b2dnbGVfcGVybWxpbmtfbW9kZSgncGFyc2UnLCAkdGhpbmcpOwoJfQp9CiI7 czo4OiJoZWxwX3JhdyI7czoxNTE6ImgxLiBnYnBfcGVybWFuZW50X2xpbmtzLgoKVGhlcmUg aXMgbm8gcGx1Z2luIGRvY3VtZW50YXRpb24uIEZvciBoZWxwIHBsZWFzZSB1c2UgdGhlICJm b3J1bSB0aHJlYWQiOmh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBo cD9pZD0xODkxOC4iO3M6MzoibWQ1IjtzOjMyOiIwNzk5YzUyNWVhNTdmOTAzNjJiZWQzOThj MWEzMWJiMiI7fQ==