IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBwYXJzZV9hcmdzIHtyYXJnc30gewogICAgZ2xvYmFsIHBhcnNlZF9hcmdzCgogICAgaWYgW2NhdGNoIHsKCXNldCBwYXJzZV9hcmdzIFtjb25jYXQgLS1kZWZhdWx0IEhFQUQgJHJhcmdzXQoJc2V0IHBhcnNlZF9hcmdzIFtzcGxpdCBbZXZhbCBleGVjIGdpdC1yZXYtcGFyc2UgJHBhcnNlX2FyZ3NdICJcbiJdCiAgICB9XSB7CgkjIGlmIGdpdC1yZXYtcGFyc2UgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4uLgoJaWYgeyRyYXJncyA9PSB7fX0gewoJICAgIHNldCByYXJncyBIRUFECgl9CglzZXQgcGFyc2VkX2FyZ3MgJHJhcmdzCiAgICB9CiAgICByZXR1cm4gJHBhcnNlZF9hcmdzCn0KCnByb2Mgc3RhcnRfcmV2X2xpc3Qge3JsYXJnc30gewogICAgZ2xvYmFsIHN0YXJ0bXNlY3MgbmV4dHVwZGF0ZSBuY211cGRhdGUKICAgIGdsb2JhbCBjb21tZmQgbGVmdG92ZXIgdGNsZW5jb2RpbmcKCiAgICBzZXQgc3RhcnRtc2VjcyBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7JHN0YXJ0bXNlY3MgKyAxMDB9XQogICAgc2V0IG5jbXVwZGF0ZSAxCiAgICBpZiBbY2F0Y2ggewoJc2V0IGNvbW1mZCBbb3BlbiBbY29uY2F0IHwgZ2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciBcCgkJCSAgICAgIC0tcGFyZW50cyAkcmxhcmdzXSByXQogICAgfSBlcnJdIHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0LXJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgbGVmdG92ZXIge30KICAgIGZjb25maWd1cmUgJGNvbW1mZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYKICAgIGlmIHskdGNsZW5jb2RpbmcgIT0ge319IHsKCWZjb25maWd1cmUgJGNvbW1mZCAtZW5jb2RpbmcgJHRjbGVuY29kaW5nCiAgICB9CiAgICBmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAp9Cgpwcm9jIGdldGNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgb2xkY29tbWl0cyBjb21taXRzIHBoYXNlIGNhbnYgbWFpbmZvbnQgZW52CgogICAgIyBjaGVjayB0aGF0IHdlIGNhbiBmaW5kIGEgLmdpdCBkaXJlY3Rvcnkgc29tZXdoZXJlLi4uCiAgICBzZXQgZ2l0ZGlyIFtnaXRkaXJdCiAgICBpZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CgllcnJvcl9wb3B1cCAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgb2xkY29tbWl0cyB7fQogICAgc2V0IGNvbW1pdHMge30KICAgIHNldCBwaGFzZSBnZXRjb21taXRzCiAgICBzdGFydF9yZXZfbGlzdCBbcGFyc2VfYXJncyAkcmFyZ3NdCiAgICAkY2FudiBkZWxldGUgYWxsCiAgICAkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAiUmVhZGluZyBjb21taXRzLi4uIiBcCgktZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dGl0ZW1zCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2NvbW1mZH0gIHsKICAgIGdsb2JhbCBvbGRjb21taXRzIGNvbW1pdHMgcGFyZW50cyBjZGF0ZSBjaGlsZHJlbiBuY2hpbGRyZW4KICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgcGhhc2UgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIGxlZnRvdmVyCiAgICBnbG9iYWwgY2FudgoKICAgIHNldCBzdHVmZiBbcmVhZCAkY29tbWZkXQogICAgaWYgeyRzdHVmZiA9PSB7fX0gewoJaWYgeyFbZW9mICRjb21tZmRdfSByZXR1cm4KCSMgc2V0IGl0IGJsb2NraW5nIHNvIHdlIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIHRlcm1pbmF0ZQoJZmNvbmZpZ3VyZSAkY29tbWZkIC1ibG9ja2luZyAxCglpZiB7IVtjYXRjaCB7Y2xvc2UgJGNvbW1mZH0gZXJyXX0gewoJICAgIGFmdGVyIGlkbGUgZmluaXNoY29tbWl0cwoJICAgIHJldHVybgoJfQoJaWYge1tzdHJpbmcgcmFuZ2UgJGVyciAwIDRdID09ICJ1c2FnZSJ9IHsKCSAgICBzZXQgZXJyIFwKCQkiR2l0azogZXJyb3IgcmVhZGluZyBjb21taXRzOiBiYWQgYXJndW1lbnRzIHRvIGdpdC1yZXYtbGlzdC5cCgkJKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0LXJldi1saXN0XAoJCXRvIGFsbG93IHNlbGVjdGlvbiBvZiBjb21taXRzIHRvIGJlIGRpc3BsYXllZC4pIgoJfSBlbHNlIHsKCSAgICBzZXQgZXJyICJFcnJvciByZWFkaW5nIGNvbW1pdHM6ICRlcnIiCgl9CgllcnJvcl9wb3B1cCAkZXJyCglleGl0IDEKICAgIH0KICAgIHNldCBzdGFydCAwCiAgICB3aGlsZSAxIHsKCXNldCBpIFtzdHJpbmcgZmlyc3QgIlwwIiAkc3R1ZmYgJHN0YXJ0XQoJaWYgeyRpIDwgMH0gewoJICAgIGFwcGVuZCBsZWZ0b3ZlciBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIHJldHVybgoJfQoJc2V0IGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IFtleHByIHskaSAtIDF9XV0KCWlmIHskc3RhcnQgPT0gMH0gewoJICAgIHNldCBjbWl0ICIkbGVmdG92ZXIkY21pdCIKCSAgICBzZXQgbGVmdG92ZXIge30KCX0KCXNldCBzdGFydCBbZXhwciB7JGkgKyAxfV0KCXNldCBqIFtzdHJpbmcgZmlyc3QgIlxuIiAkY21pdF0KCXNldCBvayAwCglpZiB7JGogPj0gMH0gewoJICAgIHNldCBpZHMgW3N0cmluZyByYW5nZSAkY21pdCAwIFtleHByIHskaiAtIDF9XV0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYgeyFbcmVnZXhwIHteWzAtOWEtZl17NDB9JH0gJGlkXX0gewoJCSAgICBzZXQgb2sgMAoJCSAgICBicmVhawoJCX0KCSAgICB9Cgl9CglpZiB7ISRva30gewoJICAgIHNldCBzaG9ydGNtaXQgJGNtaXQKCSAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNob3J0Y21pdF0gPiA4MH0gewoJCXNldCBzaG9ydGNtaXQgIltzdHJpbmcgcmFuZ2UgJHNob3J0Y21pdCAwIDgwXS4uLiIKCSAgICB9CgkgICAgZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1yZXYtbGlzdCBvdXRwdXQ6IHskc2hvcnRjbWl0fSIKCSAgICBleGl0IDEKCX0KCXNldCBpZCBbbGluZGV4ICRpZHMgMF0KCXNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCWxhcHBlbmQgY29tbWl0cyAkaWQKCXNldCBjb21taXRsaXN0ZWQoJGlkKSAxCglwYXJzZWNvbW1pdCAkaWQgJGNtaXQgMSBbbHJhbmdlICRpZHMgMSBlbmRdCglkcmF3Y29tbWl0ICRpZCAxCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJICAgIGRvdXBkYXRlIDEKCX0KCXdoaWxlIHskcmVkaXNwbGF5aW5nfSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgkgICAgaWYgeyRzdG9wcGVkID09IDF9IHsKCQlzZXQgc3RvcHBlZCAwCgkJc2V0IHBoYXNlICJnZXRjb21taXRzIgoJCWZvcmVhY2ggaWQgJGNvbW1pdHMgewoJCSAgICBkcmF3Y29tbWl0ICRpZCAxCgkJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCQkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQkJZG91cGRhdGUgMQoJCSAgICB9CgkJfQoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7cmVhZGluZ30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlIG51bWNvbW1pdHMgbmNtdXBkYXRlCgogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSB7fQogICAgfQogICAgdXBkYXRlCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCiAgICBpZiB7JG51bWNvbW1pdHMgPCAxMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMX1dCiAgICB9IGVsc2VpZiB7JG51bWNvbW1pdHMgPCAxMDAwMH0gewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMH1dCiAgICB9IGVsc2UgewoJc2V0IG5jbXVwZGF0ZSBbZXhwciB7JG51bWNvbW1pdHMgKyAxMDB9XQogICAgfQogICAgaWYgeyRyZWFkaW5nfSB7CglmaWxlZXZlbnQgJGNvbW1mZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkY29tbWZkXQogICAgfQp9Cgpwcm9jIHJlYWRjb21taXQge2lkfSB7CiAgICBpZiBbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQtY2F0LWZpbGUgY29tbWl0ICRpZF19XSByZXR1cm4KICAgIHBhcnNlY29tbWl0ICRpZCAkY29udGVudHMgMCB7fQp9Cgpwcm9jIHVwZGF0ZWNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIGNvbW1mZCBwaGFzZQogICAgZ2xvYmFsIHN0YXJ0bXNlY3MgbmV4dHVwZGF0ZSBuY211cGRhdGUKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxlZnRvdmVyCiAgICBnbG9iYWwgcGFyc2VkX2FyZ3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250CiAgICBnbG9iYWwgb2xkY29tbWl0cyBjb21taXRzCiAgICBnbG9iYWwgcGFyZW50cyBuY2hpbGRyZW4gY2hpbGRyZW4gbmNsZWZ0CgogICAgc2V0IG9sZF9hcmdzICRwYXJzZWRfYXJncwogICAgcGFyc2VfYXJncyAkcmFyZ3MKCiAgICBpZiB7JHBoYXNlID09ICJnZXRjb21taXRzIiB8fCAkcGhhc2UgPT0gImluY3JkcmF3In0gewoJIyBoYXZlbnQgcmVhZCBhbGwgdGhlIG9sZCBjb21taXRzLCBqdXN0IHN0YXJ0IGFnYWluIGZyb20gc2NyYXRjaAoJc3RvcGZpbmRwcm9jCglzZXQgb2xkY29tbWl0cyB7fQoJc2V0IGNvbW1pdHMge30KCWZvcmVhY2ggdiB7Y2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgY29tbWl0bGlzdGVkIGNvbW1pdGluZm8KCQkgICBzZWxlY3RlZGxpbmUgbWF0Y2hpbmdsaW5lcyB0cmVlZGlmZnMKCQkgICBtZXJnZWZpbGVsaXN0IGN1cnJlbnRpZCByb3d0ZXh0eH0gewoJICAgIGdsb2JhbCAkdgoJICAgIGNhdGNoIHt1bnNldCAkdn0KCX0KCXJlYWRyZWZzCglpZiB7JHBoYXNlID09ICJpbmNyZHJhdyJ9IHsKCSAgICBhbGxjYW52cyBkZWxldGUgYWxsCgkgICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJCS1mb250ICRtYWluZm9udCAtdGFncyB0ZXh0aXRlbXMKCSAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwoJfQoJc3RhcnRfcmV2X2xpc3QgJHBhcnNlZF9hcmdzCglyZXR1cm4KICAgIH0KCiAgICBmb3JlYWNoIGlkICRvbGRfYXJncyB7CglpZiB7IVtyZWdleHAge15bMC05YS1mXXs0MH0kfSAkaWRdfSBjb250aW51ZQoJaWYge1tpbmZvIGV4aXN0cyBvbGRyZWYoJGlkKV19IGNvbnRpbnVlCglzZXQgb2xkcmVmKCRpZCkgJGlkCglsYXBwZW5kIGlnbm9yZW9sZCAiXiRpZCIKICAgIH0KICAgIGZvcmVhY2ggaWQgJHBhcnNlZF9hcmdzIHsKCWlmIHshW3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRpZF19IGNvbnRpbnVlCglpZiB7W2luZm8gZXhpc3RzIHJlZigkaWQpXX0gY29udGludWUKCXNldCByZWYoJGlkKSAkaWQKCWxhcHBlbmQgaWdub3JlbmV3ICJeJGlkIgogICAgfQoKICAgIGZvcmVhY2ggYSAkb2xkX2FyZ3MgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRhKV19IHsKCSAgICBsYXBwZW5kIGlnbm9yZW5ldyAkYQoJfQogICAgfQoKICAgIHNldCBwaGFzZSB1cGRhdGVjb21taXRzCiAgICBzZXQgb2xkY29tbWl0cyAkY29tbWl0cwogICAgc2V0IGNvbW1pdHMge30KICAgIHNldCByZW1vdmVkX2NvbW1pdHMgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1saXN0ICRpZ25vcmVuZXddICJcbiIgXQogICAgaWYge1tsbGVuZ3RoICRyZW1vdmVkX2NvbW1pdHNdID4gMH0gewoJYWxsY2FudnMgZGVsZXRlIGFsbAoJZm9yZWFjaCBjICRyZW1vdmVkX2NvbW1pdHMgewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkb2xkY29tbWl0cyAkY10KCSAgICBpZiB7JGkgPj0gMH0gewoJCXNldCBvbGRjb21taXRzIFtscmVwbGFjZSAkb2xkY29tbWl0cyAkaSAkaV0KCQl1bnNldCBjb21taXRsaXN0ZWQoJGMpCgkJZm9yZWFjaCBwICRwYXJlbnRzKCRjKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCQkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGNdCgkJCWlmIHskaiA+PSAwfSB7CgkJCSAgICBzZXQgY2hpbGRyZW4oJHApIFtscmVwbGFjZSAkY2hpbGRyZW4oJHApICRqICRqXQoJCQkgICAgaW5jciBuY2hpbGRyZW4oJHApIC0xCgkJCX0KCQkgICAgfQoJCX0KCSAgICB9Cgl9CglzZXQgcGhhc2UgcmVtb3ZlY29tbWl0cwogICAgfQoKICAgIHNldCBhcmdzIHt9CiAgICBmb3JlYWNoIGEgJHBhcnNlZF9hcmdzIHsKCWlmIHshW2luZm8gZXhpc3RzIG9sZHJlZigkYSldfSB7CgkgICAgbGFwcGVuZCBhcmdzICRhCgl9CiAgICB9CgogICAgcmVhZHJlZnMKICAgIHN0YXJ0X3Jldl9saXN0IFtjb25jYXQgJGlnbm9yZW9sZCAkYXJnc10KfQoKcHJvYyB1cGRhdGVjaGlsZHJlbiB7aWQgb2xkc30gewogICAgZ2xvYmFsIGNoaWxkcmVuIG5jaGlsZHJlbiBwYXJlbnRzIG5wYXJlbnRzIG5jbGVmdAoKICAgIGlmIHshW2luZm8gZXhpc3RzIG5jaGlsZHJlbigkaWQpXX0gewoJc2V0IGNoaWxkcmVuKCRpZCkge30KCXNldCBuY2hpbGRyZW4oJGlkKSAwCglzZXQgbmNsZWZ0KCRpZCkgMAogICAgfQogICAgc2V0IHBhcmVudHMoJGlkKSAkb2xkcwogICAgc2V0IG5wYXJlbnRzKCRpZCkgW2xsZW5ndGggJG9sZHNdCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCSAgICBzZXQgY2hpbGRyZW4oJHApIFtsaXN0ICRpZF0KCSAgICBzZXQgbmNoaWxkcmVuKCRwKSAxCgkgICAgc2V0IG5jbGVmdCgkcCkgMQoJfSBlbHNlaWYge1tsc2VhcmNoIC1leGFjdCAkY2hpbGRyZW4oJHApICRpZF0gPCAwfSB7CgkgICAgbGFwcGVuZCBjaGlsZHJlbigkcCkgJGlkCgkgICAgaW5jciBuY2hpbGRyZW4oJHApCgkgICAgaW5jciBuY2xlZnQoJHApCgl9CiAgICB9Cn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZCBvbGRzfSB7CiAgICBnbG9iYWwgY29tbWl0aW5mbyBjZGF0ZQoKICAgIHNldCBpbmhkciAxCiAgICBzZXQgY29tbWVudCB7fQogICAgc2V0IGhlYWRsaW5lIHt9CiAgICBzZXQgYXVuYW1lIHt9CiAgICBzZXQgYXVkYXRlIHt9CiAgICBzZXQgY29tbmFtZSB7fQogICAgc2V0IGNvbWRhdGUge30KICAgIHVwZGF0ZWNoaWxkcmVuICRpZCAkb2xkcwogICAgc2V0IGhkcmVuZCBbc3RyaW5nIGZpcnN0ICJcblxuIiAkY29udGVudHNdCiAgICBpZiB7JGhkcmVuZCA8IDB9IHsKCSMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgoJc2V0IGhkcmVuZCBbc3RyaW5nIGxlbmd0aCAkY29udGVudHNdCiAgICB9CiAgICBzZXQgaGVhZGVyIFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIDAgW2V4cHIgeyRoZHJlbmQgLSAxfV1dCiAgICBzZXQgY29tbWVudCBbc3RyaW5nIHJhbmdlICRjb250ZW50cyBbZXhwciB7JGhkcmVuZCArIDJ9XSBlbmRdCiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRoZWFkZXIgIlxuIl0gewoJc2V0IHRhZyBbbGluZGV4ICRsaW5lIDBdCglpZiB7JHRhZyA9PSAiYXV0aG9yIn0gewoJICAgIHNldCBhdWRhdGUgW2xpbmRleCAkbGluZSBlbmQtMV0KCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0gZWxzZWlmIHskdGFnID09ICJjb21taXR0ZXIifSB7CgkgICAgc2V0IGNvbWRhdGUgW2xpbmRleCAkbGluZSBlbmQtMV0KCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9CiAgICB9CiAgICBzZXQgaGVhZGxpbmUge30KICAgICMgdGFrZSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWVudCBhcyB0aGUgaGVhZGxpbmUKICAgIHNldCBpIFtzdHJpbmcgZmlyc3QgIlxuIiAkY29tbWVudF0KICAgIGlmIHskaSA+PSAwfSB7CglzZXQgaGVhZGxpbmUgW3N0cmluZyB0cmltIFtzdHJpbmcgcmFuZ2UgJGNvbW1lbnQgMCAkaV1dCiAgICB9IGVsc2UgewoJc2V0IGhlYWRsaW5lICRjb21tZW50CiAgICB9CiAgICBpZiB7ISRsaXN0ZWR9IHsKCSMgZ2l0LXJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkjIGlmIHdlIGdvdCB0aGlzIHZpYSBnaXQtY2F0LWZpbGUsIGFkZCB0aGUgaW5kZW50YXRpb24KCXNldCBuZXdjb21tZW50IHt9Cglmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb21tZW50ICJcbiJdIHsKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAiICAgICIKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAkbGluZQoJICAgIGFwcGVuZCBuZXdjb21tZW50ICJcbiIKCX0KCXNldCBjb21tZW50ICRuZXdjb21tZW50CiAgICB9CiAgICBpZiB7JGNvbWRhdGUgIT0ge319IHsKCXNldCBjZGF0ZSgkaWQpICRjb21kYXRlCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyB0YWdjb250ZW50cwogICAgZ2xvYmFsIG90aGVycmVmaWRzIGlkb3RoZXJyZWZzCgogICAgZm9yZWFjaCB2IHt0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcyBvdGhlcnJlZmlkcyBpZG90aGVycmVmc30gewoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQogICAgc2V0IHJlZmQgW29wZW4gW2xpc3QgfCBnaXQtbHMtcmVtb3RlIFtnaXRkaXJdXSByXQogICAgd2hpbGUgezAgPD0gW3NldCBuIFtnZXRzICRyZWZkIGxpbmVdXX0gewoJaWYgeyFbcmVnZXhwIHteKFswLTlhLWZdezQwfSkJcmVmcy8oW15eXSopJH0gJGxpbmUgXAoJICAgIG1hdGNoIGlkIHBhdGhdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHshW3JlZ2V4cCB7Xih0YWdzfGhlYWRzKS8oLiopJH0gJHBhdGggbWF0Y2ggdHlwZSBuYW1lXX0gewoJICAgIHNldCB0eXBlIG90aGVycwoJICAgIHNldCBuYW1lICRwYXRoCgl9CglpZiB7JHR5cGUgPT0gInRhZ3MifSB7CgkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkbmFtZQoJICAgIHNldCBvYmoge30KCSAgICBzZXQgdHlwZSB7fQoJICAgIHNldCB0YWcge30KCSAgICBjYXRjaCB7CgkJc2V0IGNvbW1pdCBbZXhlYyBnaXQtcmV2LXBhcnNlICIkaWReMCJdCgkJaWYgeyIkY29tbWl0IiAhPSAiJGlkIn0gewoJCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkY29tbWl0CgkJICAgIGxhcHBlbmQgaWR0YWdzKCRjb21taXQpICRuYW1lCgkJfQoJICAgIH0JCQoJICAgIGNhdGNoIHsKCSAgICAgICAgc2V0IHRhZ2NvbnRlbnRzKCRuYW1lKSBbZXhlYyBnaXQtY2F0LWZpbGUgdGFnICIkaWQiXQoJICAgIH0KCX0gZWxzZWlmIHsgJHR5cGUgPT0gImhlYWRzIiB9IHsKCSAgICBzZXQgaGVhZGlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKCX0gZWxzZSB7CgkgICAgc2V0IG90aGVycmVmaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkb3RoZXJyZWZzKCRpZCkgJG5hbWUKCX0KICAgIH0KICAgIGNsb3NlICRyZWZkCn0KCnByb2MgZXJyb3JfcG9wdXAgbXNnIHsKICAgIHNldCB3IC5lcnJvcgogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRyYW5zaWVudCAkdyAuCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgogICAgdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIG1ha2V3aW5kb3cge3JhcmdzfSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0IHRleHRmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4CgogICAgbWVudSAuYmFyCiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRmlsZSIgLW1lbnUgLmJhci5maWxlCiAgICBtZW51IC5iYXIuZmlsZQogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiVXBkYXRlIiAtY29tbWFuZCBbbGlzdCB1cGRhdGVjb21taXRzICRyYXJnc10KICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlcmVhZCByZWZlcmVuY2VzIiAtY29tbWFuZCByZXJlYWRyZWZzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIG1lbnUgLmJhci5lZGl0CiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiRWRpdCIgLW1lbnUgLmJhci5lZGl0CiAgICAuYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJQcmVmZXJlbmNlcyIgLWNvbW1hbmQgZG9wcmVmcwogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7NDUgKiAkY2hhcnNwY31dCglzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHszMCAqICRjaGFyc3BjfV0KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezE1ICogJGNoYXJzcGN9XQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7MjUgKiAkbGluZXNwYyArIDR9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0dykgODAKCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCglzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgMzAKICAgIH0KICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkod2lkdGgpXX0gewoJLmN0b3AgY29uZiAtd2lkdGggJGdlb21ldHJ5KHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShoZWlnaHQpCglzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KCXNldCBnZW9tZXRyeShjdGV4dGgpIFtleHByIHsoJHRleHRoIC0gOCkgLwoJCQkJICAgIFtmb250IG1ldHJpY3MgJHRleHRmb250IC1saW5lc3BhY2VdfV0KICAgIH0KICAgIGZyYW1lIC5jdG9wLnRvcAogICAgZnJhbWUgLmN0b3AudG9wLmJhcgogICAgcGFjayAuY3RvcC50b3AuYmFyIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBzZXQgY3Njcm9sbCAuY3RvcC50b3AuY3NiCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFuZWR3aW5kb3cgLmN0b3AudG9wLmNsaXN0IC1vcmllbnQgaG9yaXpvbnRhbCAtc2FzaHBhZCAwIC1oYW5kbGVzaXplIDQKICAgIHBhY2sgLmN0b3AudG9wLmNsaXN0IC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AgYWRkIC5jdG9wLnRvcAogICAgc2V0IGNhbnYgLmN0b3AudG9wLmNsaXN0LmNhbnYKICAgIGNhbnZhcyAkY2FudiAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MSkgXAoJLWJnIHdoaXRlIC1iZCAwIFwKCS15c2Nyb2xsaW5jciAkbGluZXNwYyAteXNjcm9sbGNvbW1hbmQgIiRjc2Nyb2xsIHNldCIKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYKICAgIHNldCBjYW52MiAuY3RvcC50b3AuY2xpc3QuY2FudjIKICAgIGNhbnZhcyAkY2FudjIgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjIpIFwKCS1iZyB3aGl0ZSAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYyCiAgICBzZXQgY2FudjMgLmN0b3AudG9wLmNsaXN0LmNhbnYzCiAgICBjYW52YXMgJGNhbnYzIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MwogICAgYmluZCAuY3RvcC50b3AuY2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CgogICAgc2V0IHNoYTFlbnRyeSAuY3RvcC50b3AuYmFyLnNoYTEKICAgIHNldCBlbnRyaWVzICRzaGExZW50cnkKICAgIHNldCBzaGExYnV0IC5jdG9wLnRvcC5iYXIuc2hhMWxhYmVsCiAgICBidXR0b24gJHNoYTFidXQgLXRleHQgIlNIQTEgSUQ6ICIgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCBcCgktY29tbWFuZCBnb3RvY29tbWl0IC13aWR0aCA4CiAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuc2hhMWxhYmVsIC1zaWRlIGxlZnQKICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKICAgIHBhY2sgJHNoYTFlbnRyeSAtc2lkZSBsZWZ0IC1wYWR5IDIKCiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLWxlZnQgLWRhdGEgewoJI2RlZmluZSBsZWZ0X3dpZHRoIDE2CgkjZGVmaW5lIGxlZnRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciBsZWZ0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDBlLCAweDAwLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDBlLCAweDAwLCAweDFjLCAweDAwLAoJMHgzOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhjMCwgMHgwMX07CiAgICB9CiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLXJpZ2h0IC1kYXRhIHsKCSNkZWZpbmUgcmlnaHRfd2lkdGggMTYKCSNkZWZpbmUgcmlnaHRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciByaWdodF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweDgwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDBlLCAweDAwLCAweDFjLAoJMHgwMCwgMHgzOCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MGUsIDB4MDAsIDB4MDcsIDB4ODAsIDB4MDMsIDB4YzAsIDB4MDF9OwogICAgfQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIubGVmdGJ1dCAtaW1hZ2UgYm0tbGVmdCAtY29tbWFuZCBnb2JhY2sgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAuY3RvcC50b3AuYmFyLmxlZnRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBidXR0b24gLmN0b3AudG9wLmJhci5yaWdodGJ1dCAtaW1hZ2UgYm0tcmlnaHQgLWNvbW1hbmQgZ29mb3J3IFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5yaWdodGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBidXR0b24gLmN0b3AudG9wLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kYnV0IC1zaWRlIGxlZnQKICAgIHNldCBmaW5kc3RyaW5nIHt9CiAgICBzZXQgZnN0cmluZyAuY3RvcC50b3AuYmFyLmZpbmRzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkZnN0cmluZwogICAgZW50cnkgJGZzdHJpbmcgLXdpZHRoIDMwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIGZpbmRzdHJpbmcKICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAogICAgc2V0IGZpbmR0eXBlIEV4YWN0CiAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZHR5cGUgXAoJCQkgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQogICAgc2V0IGZpbmRsb2MgIkFsbCBmaWVsZHMiCiAgICB0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZGxvYyBmaW5kbG9jICJBbGwgZmllbGRzIiBIZWFkbGluZSBcCglDb21tZW50cyBBdXRob3IgQ29tbWl0dGVyIEZpbGVzIFBpY2theGUKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kbG9jIC1zaWRlIHJpZ2h0CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKICAgICMgZm9yIG1ha2luZyBzdXJlIHR5cGU9PUV4YWN0IHdoZW5ldmVyIGxvYz09UGlja2F4ZQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRsb2Mgd3JpdGUgZmluZGxvY2NoYW5nZQoKICAgIHBhbmVkd2luZG93IC5jdG9wLmNkZXQgLW9yaWVudCBob3Jpem9udGFsCiAgICAuY3RvcCBhZGQgLmN0b3AuY2RldAogICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0CiAgICBzZXQgY3RleHQgLmN0b3AuY2RldC5sZWZ0LmN0ZXh0CiAgICB0ZXh0ICRjdGV4dCAtYmcgd2hpdGUgLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgktd2lkdGggJGdlb21ldHJ5KGN0ZXh0dykgLWhlaWdodCAkZ2VvbWV0cnkoY3RleHRoKSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQubGVmdC5zYiBzZXQiIC13cmFwIG5vbmUKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LmxlZnQuc2IgLWNvbW1hbmQgIiRjdGV4dCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5sZWZ0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGN0ZXh0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wLmNkZXQgYWRkIC5jdG9wLmNkZXQubGVmdAoKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdIC1iYWNrICIjYWFhYWFhIgogICAgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmUgYmx1ZQogICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIHJlZAogICAgJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlICIjMDBhMDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0wIC1mb3JlIHJlZAogICAgJGN0ZXh0IHRhZyBjb25mIG0xIC1mb3JlIGJsdWUKICAgICRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgogICAgJGN0ZXh0IHRhZyBjb25mIG0zIC1mb3JlIHB1cnBsZQogICAgJGN0ZXh0IHRhZyBjb25mIG00IC1mb3JlIGJyb3duCiAgICAkY3RleHQgdGFnIGNvbmYgbW1heCAtZm9yZSBkYXJrZ3JleQogICAgc2V0IG1lcmdlbWF4IDUKICAgICRjdGV4dCB0YWcgY29uZiBtcmVzdWx0IC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgbXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdwoKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQKICAgIHNldCBjZmxpc3QgLmN0b3AuY2RldC5yaWdodC5jZmlsZXMKICAgIGxpc3Rib3ggJGNmbGlzdCAtYmcgd2hpdGUgLXNlbGVjdG1vZGUgZXh0ZW5kZWQgLXdpZHRoICRnZW9tZXRyeShjZmxpc3R3KSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQucmlnaHQuc2Igc2V0IgogICAgc2Nyb2xsYmFyIC5jdG9wLmNkZXQucmlnaHQuc2IgLWNvbW1hbmQgIiRjZmxpc3QgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQucmlnaHQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY2ZsaXN0IC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wLmNkZXQgYWRkIC5jdG9wLmNkZXQucmlnaHQKICAgIGJpbmQgLmN0b3AuY2RldCA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQoKICAgIHBhY2sgLmN0b3AgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiYWxsY2FudnMgc2NhbiBtYXJrIDAgJXkiCiAgICBiaW5kYWxsIDxCMi1Nb3Rpb24+ICJhbGxjYW52cyBzY2FuIGRyYWd0byAwICV5IgogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxLZXktUmlnaHQ+ICJnb2ZvcnciCiAgICBiaW5kIC4gPEtleS1MZWZ0PiAiZ29iYWNrIgogICAgYmluZCAuIDxLZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktRGVsZXRlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1CYWNrU3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LXNwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSBwICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgbiAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgeiAiZ29iYWNrIgogICAgYmluZGtleSB4ICJnb2ZvcnciCiAgICBiaW5ka2V5IGkgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBrICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSBqICJnb2JhY2siCiAgICBiaW5ka2V5IGwgImdvZm9ydyIKICAgIGJpbmRrZXkgYiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgZCAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAxOCB1bml0cyIKICAgIGJpbmRrZXkgdSAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMTggdW5pdHMiCiAgICBiaW5ka2V5IC8ge2ZpbmRuZXh0IDF9CiAgICBiaW5ka2V5IDxLZXktUmV0dXJuPiB7ZmluZG5leHQgMH0KICAgIGJpbmRrZXkgPyBmaW5kcHJldgogICAgYmluZGtleSBmIG5leHRmaWxlCiAgICBiaW5kIC4gPENvbnRyb2wtcT4gZG9xdWl0CiAgICBiaW5kIC4gPENvbnRyb2wtZj4gZG9maW5kCiAgICBiaW5kIC4gPENvbnRyb2wtZz4ge2ZpbmRuZXh0IDB9CiAgICBiaW5kIC4gPENvbnRyb2wtcj4gZmluZHByZXYKICAgIGJpbmQgLiA8Q29udHJvbC1lcXVhbD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxDb250cm9sLUtQX1N1YnRyYWN0PiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kICRjZmxpc3QgPDxMaXN0Ym94U2VsZWN0Pj4gbGlzdGJveHNlbAogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgY3VydGV4dGN1cnNvciAkdGV4dGN1cnNvcgoKICAgIHNldCByb3djdHhtZW51IC5yb3djdHhtZW51CiAgICBtZW51ICRyb3djdHhtZW51IC10ZWFyb2ZmIDAKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiB0aGlzIC0+IHNlbGVjdGVkIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDB9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAxfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSB0YWciIC1jb21tYW5kIG1rdGFnCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIldyaXRlIGNvbW1pdCB0byBmaWxlIiAtY29tbWFuZCB3cml0ZWNvbW1pdAp9CgojIHdoZW4gd2UgbWFrZSBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9wbGV2ZWwsIG1ha2Ugc3VyZQojIGl0IGRvZXNuJ3QgZ2V0IHRyaWdnZXJlZCB3aGVuIHRoYXQga2V5IGlzIHByZXNzZWQgaW4gdGhlCiMgZmluZCBzdHJpbmcgZW50cnkgd2lkZ2V0Lgpwcm9jIGJpbmRrZXkge2V2IHNjcmlwdH0gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGJpbmQgLiAkZXYgJHNjcmlwdAogICAgc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgJGV2XQogICAgaWYgeyRlc2NyaXB0ID09IHt9fSB7CglzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSA8S2V5Pl0KICAgIH0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgliaW5kICRlICRldiAiJGVzY3JpcHQ7IGJyZWFrIgogICAgfQp9CgojIHNldCB0aGUgZm9jdXMgYmFjayB0byB0aGUgdG9wbGV2ZWwgZm9yIGFueSBjbGljayBvdXRzaWRlCiMgdGhlIGVudHJ5IHdpZGdldHMKcHJvYyBjbGljayB7d30gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CglpZiB7JHcgPT0gJGV9IHJldHVybgogICAgfQogICAgZm9jdXMgLgp9Cgpwcm9jIHNhdmVzdHVmZiB7d30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250CiAgICBnbG9iYWwgc3R1ZmZzYXZlZCBmaW5kbWVyZ2VmaWxlcyBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heGdyYXBocGN0ICRtYXhncmFwaHBjdF0KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KCXB1dHMgJGYgInNldCBnZW9tZXRyeSh3aWR0aCkgW3dpbmZvIHdpZHRoIC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52XS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYyXS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjMpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYzXS0yfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudmgpIFtleHByIHtbd2luZm8gaGVpZ2h0ICRjYW52XS0yfV0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciB7JHNhc2gwICsgMjB9XQoJICAgIH0KCSAgICBpZiB7JHNhc2gxID4gJHcgLSAxMH0gewoJCXNldCBzYXNoMSBbZXhwciB7JHcgLSAxMH1dCgkJaWYgeyRzYXNoMCA+ICRzYXNoMSAtIDIwfSB7CgkJICAgIHNldCBzYXNoMCBbZXhwciB7JHNhc2gxIC0gMjB9XQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciB7JHcgLSAxNX1dCgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyBhbGxjYW52cyBhcmdzIHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBldmFsICRjYW52ICRhcmdzCiAgICBldmFsICRjYW52MiAkYXJncwogICAgZXZhbCAkY2FudjMgJGFyZ3MKfQoKcHJvYyBiaW5kYWxsIHtldmVudCBhY3Rpb259IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBiaW5kICRjYW52ICRldmVudCAkYWN0aW9uCiAgICBiaW5kICRjYW52MiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjMgJGV2ZW50ICRhY3Rpb24KfQoKcHJvYyBhYm91dCB7fSB7CiAgICBzZXQgdyAuYWJvdXQKICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0gewoJcmFpc2UgJHcKCXJldHVybgogICAgfQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRpdGxlICR3ICJBYm91dCBnaXRrIgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKR2l0ayB2ZXJzaW9uIDEuMgoKQ29weXJpZ2h0IKkgMjAwNSBQYXVsIE1hY2tlcnJhcwoKVXNlIGFuZCByZWRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZX0gXAoJICAgIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgQ2xvc2UgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbQp9Cgpwcm9jIGFzc2lnbmNvbG9yIHtpZH0gewogICAgZ2xvYmFsIGNvbG9ybWFwIGNvbW1jb2xvcnMgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29ybmVyY3Jvc3NpbmdzIGNyb3NzaW5ncwoKICAgIGlmIFtpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPD0gMSAmJiAkbmNoaWxkcmVuKCRpZCkgPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGNoaWxkcmVuKCRpZCkgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiAkbnBhcmVudHMoJGNoaWxkKSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldfSB7Cglmb3JlYWNoIHggJGNvcm5lcmNyb3NzaW5ncygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyB7fQoJfQogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CglpZiB7W2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXX0gewoJICAgIGZvcmVhY2ggeCAkY3Jvc3NpbmdzKCRpZCkgewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJCX0KCSAgICB9CgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJICAgIH0KCX0KCXNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGNoaWxkKV19IHsKCQlmb3JlYWNoIHAgJHBhcmVudHMoJGNoaWxkKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBpbml0Z3JhcGgge30gewogICAgZ2xvYmFsIGNhbnZ5IGNhbnZ5MCBsaW5lbm8gbnVtY29tbWl0cyBuZXh0Y29sb3IgbGluZXNwYwogICAgZ2xvYmFsIG5jaGlsZHJlbiBuY2xlZnQKICAgIGdsb2JhbCBkaXNwbGlzdCBuaHlwZXJzcGFjZQoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIGZvcmVhY2ggdiB7bWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMgY29sb3JtYXAgY29ybmVyY3Jvc3NpbmdzCgkJY3Jvc3NpbmdzIGlkbGluZSBsaW5laWR9IHsKCWdsb2JhbCAkdgoJY2F0Y2gge3Vuc2V0ICR2fQogICAgfQogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgbmNoaWxkcmVuXSB7CglzZXQgbmNsZWZ0KCRpZCkgJG5jaGlsZHJlbigkaWQpCiAgICB9CiAgICBzZXQgZGlzcGxpc3Qge30KICAgIHNldCBuaHlwZXJzcGFjZSAwCn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKfQoKcHJvYyBkcmF3bGluZXMge2lkIHh0cmEgZGVsb2xkfSB7CiAgICBnbG9iYWwgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMgbHRoaWNrbmVzcyBjb2xvcm1hcCBjYW52CgogICAgaWYgeyRkZWxvbGR9IHsKCSRjYW52IGRlbGV0ZSBsaW5lcy4kaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCXNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkbWFpbmxpbmUoJGlkKSBcCgkJICAgLXdpZHRoIFtleHByIHsoJHh0cmEgKyAxKSAqICRsdGhpY2tuZXNzfV0gXAoJCSAgIC1maWxsICRjb2xvcm1hcCgkaWQpIC10YWdzIGxpbmVzLiRpZCBcCgkJICAgLWFycm93ICRtYWlubGluZWFycm93KCRpZCldCgkkY2FudiBsb3dlciAkdAoJYmluZGxpbmUgJHQgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgdGhpY2sgW2xpbmRleCAkbHMgMV0KCSAgICBzZXQgYXJyb3cgW2xpbmRleCAkbHMgMl0KCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtZmlsbCAkY29sb3JtYXAoJGlkKSBcCgkJICAgICAgIC13aWR0aCBbZXhwciB7KCR0aGljayArICR4dHJhKSAqICRsdGhpY2tuZXNzfV0gXAoJCSAgICAgICAtYXJyb3cgJGFycm93IC10YWdzIGxpbmVzLiRpZF0KCSAgICAkY2FudiBsb3dlciAkdAoJICAgIGJpbmRsaW5lICR0ICRpZAoJfQogICAgfQp9CgojIGxldmVsIGhlcmUgaXMgYW4gaW5kZXggaW4gZGlzcGxpc3QKcHJvYyBkcmF3Y29tbWl0bGluZSB7bGV2ZWx9IHsKICAgIGdsb2JhbCBwYXJlbnRzIGNoaWxkcmVuIG5wYXJlbnRzIGRpc3BsaXN0CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBtYWluZm9udCBuYW1lZm9udCBjYW52eSBsaW5lc3BjCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIGNvbW1pdGluZm8KICAgIGdsb2JhbCBjb2xvcm1hcCBudW1jb21taXRzIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBpZHRhZ3MgaWRsaW5lIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5lbm8gbHRoaWNrbmVzcyBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCByb3d0ZXh0eCBpZHBvcyBsYXN0dXNlIGRpc3BsaXN0CiAgICBnbG9iYWwgb2xkbmxpbmVzIG9sZGRsZXZlbCBvbGRkaXNwbGlzdAoKICAgIGluY3IgbnVtY29tbWl0cwogICAgaW5jciBsaW5lbm8KICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGlzdCAkbGV2ZWxdCiAgICBzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KICAgIHNldCBsaW5laWQoJGxpbmVubykgJGlkCiAgICBzZXQgaWRsaW5lKCRpZCkgJGxpbmVubwogICAgc2V0IG9maWxsIFtleHByIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJcmVhZGNvbW1pdCAkaWQKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CgkgICAgc2V0IG5wYXJlbnRzKCRpZCkgMAoJfQogICAgfQogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgY3VycmVudHBhcmVudHMge30KICAgIHNldCBkdXBwYXJlbnRzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXSAmJiBbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGN1cnJlbnRwYXJlbnRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIGN1cnJlbnRwYXJlbnRzICRwCgkgICAgfSBlbHNlIHsKCQkjIHJlbWVtYmVyIHRoYXQgdGhpcyBwYXJlbnQgd2FzIGxpc3RlZCB0d2ljZQoJCWxhcHBlbmQgZHVwcGFyZW50cyAkcAoJICAgIH0KCX0KICAgIH0KICAgIHNldCB4IFt4Y29vcmQgJGxldmVsICRsZXZlbCAkbGluZW5vXQogICAgc2V0IHkxICRjYW52eQogICAgc2V0IGNhbnZ5IFtleHByIHskY2FudnkgKyAkbGluZXNwY31dCiAgICBhbGxjYW52cyBjb25mIC1zY3JvbGxyZWdpb24gXAoJW2xpc3QgMCAwIDAgW2V4cHIgeyR5MSArIDAuNSAqICRsaW5lc3BjICsgMn1dXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJaWYgeyRtYWlubGluZWFycm93KCRpZCkgbmUgIm5vbmUifSB7CgkgICAgc2V0IG1haW5saW5lKCRpZCkgW3RyaW1kaWFnc3RhcnQgJG1haW5saW5lKCRpZCldCgl9CiAgICB9CiAgICBkcmF3bGluZXMgJGlkIDAgMAogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgeyR4IC0gJG9yYWR9XSBbZXhwciB7JHkxIC0gJG9yYWR9XSBcCgkgICAgICAgW2V4cHIgeyR4ICsgJG9yYWQgLSAxfV0gW2V4cHIgeyR5MSArICRvcmFkIC0gMX1dIFwKCSAgICAgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDFdCiAgICAkY2FudiByYWlzZSAkdAogICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQogICAgc2V0IHh0IFt4Y29vcmQgW2xsZW5ndGggJGRpc3BsaXN0XSAkbGV2ZWwgJGxpbmVub10KICAgIGlmIHtbbGxlbmd0aCAkY3VycmVudHBhcmVudHNdID4gMn0gewoJc2V0IHh0IFtleHByIHskeHQgKyAoW2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSAtIDIpICogJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHJvd3RleHR4KCRsaW5lbm8pICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5MV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldCgl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeTFdCiAgICB9CiAgICBzZXQgaGVhZGxpbmUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDBdCiAgICBzZXQgbmFtZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KICAgIHNldCBkYXRlIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAyXQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgJGRhdGVdCiAgICBzZXQgbGluZWh0YWcoJGxpbmVubykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRoZWFkbGluZSAtZm9udCAkbWFpbmZvbnQgXQogICAgJGNhbnYgYmluZCAkbGluZWh0YWcoJGxpbmVubykgPEJ1dHRvbi0zPiAicm93bWVudSAlWCAlWSAkaWQiCiAgICBzZXQgbGluZW50YWcoJGxpbmVubykgWyRjYW52MiBjcmVhdGUgdGV4dCAzICR5MSAtYW5jaG9yIHcgXAoJCQkgICAgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5hbWVmb250XQogICAgc2V0IGxpbmVkdGFnKCRsaW5lbm8pIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udF0KCiAgICBzZXQgb2xkZGxldmVsICRsZXZlbAogICAgc2V0IG9sZGRpc3BsaXN0ICRkaXNwbGlzdAogICAgc2V0IG9sZG5saW5lcyBbbGxlbmd0aCAkZGlzcGxpc3RdCn0KCnByb2MgZHJhd3RhZ3Mge2lkIHggeHQgeTF9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgaWRsaW5lIHJvd3RleHR4CgogICAgc2V0IG1hcmtzIHt9CiAgICBzZXQgbnRhZ3MgMAogICAgc2V0IG5oZWFkcyAwCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IG1hcmtzICRpZHRhZ3MoJGlkKQoJc2V0IG50YWdzIFtsbGVuZ3RoICRtYXJrc10KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZGhlYWRzKCRpZCldCglzZXQgbmhlYWRzIFtsbGVuZ3RoICRpZGhlYWRzKCRpZCldCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkb3RoZXJyZWZzKCRpZCldCiAgICB9CiAgICBpZiB7JG1hcmtzIGVxIHt9fSB7CglyZXR1cm4gJHh0CiAgICB9CgogICAgc2V0IGRlbHRhIFtleHByIHtpbnQoMC41ICogKCRsaW5lc3BjIC0gJGx0aGlja25lc3MpKX1dCiAgICBzZXQgeXQgW2V4cHIgeyR5MSAtIDAuNSAqICRsaW5lc3BjfV0KICAgIHNldCB5YiBbZXhwciB7JHl0ICsgJGxpbmVzcGMgLSAxfV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgeyR4ICsgJGRlbHRhfV0KCXNldCB4ciBbZXhwciB7JHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3N9XQoJaWYge1tpbmNyIG50YWdzIC0xXSA+PSAwfSB7CgkgICAgIyBkcmF3IGEgdGFnCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBwb2x5Z29uICR4IFtleHByIHskeXQgKyAkZGVsdGF9XSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgeyR5YiAtICRkZWx0YX1dIFwKCQkgICAgICAgLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgeWVsbG93IC10YWdzIHRhZy4kaWRdCgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgkgICAgc2V0IHJvd3RleHR4KCRpZGxpbmUoJGlkKSkgW2V4cHIgeyR4ciArICRsaW5lc3BjfV0KCX0gZWxzZSB7CgkgICAgIyBkcmF3IGEgaGVhZCBvciBvdGhlciByZWYKCSAgICBpZiB7W2luY3IgbmhlYWRzIC0xXSA+PSAwfSB7CgkJc2V0IGNvbCBncmVlbgoJICAgIH0gZWxzZSB7CgkJc2V0IGNvbCAiI2RkZGRmZiIKCSAgICB9CgkgICAgc2V0IHhsIFtleHByIHskeGwgLSAkZGVsdGEvMn1dCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggJHl0ICR4ciAkeXQgJHhyICR5YiAkeCAkeWIgXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsICRjb2wgLXRhZ3MgdGFnLiRpZAoJfQoJc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4bCAkeTEgLWFuY2hvciB3IC10ZXh0ICR0YWcgXAoJCSAgIC1mb250ICRtYWluZm9udCAtdGFncyB0YWcuJGlkXQoJaWYgeyRudGFncyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgl9CiAgICB9CiAgICByZXR1cm4gJHh0Cn0KCnByb2Mgbm90ZWNyb3NzaW5ncyB7aWQgbG8gaGkgY29ybmVyfSB7CiAgICBnbG9iYWwgb2xkZGlzcGxpc3QgY3Jvc3NpbmdzIGNvcm5lcmNyb3NzaW5ncwoKICAgIGZvciB7c2V0IGkgJGxvfSB7W2luY3IgaV0gPCAkaGl9IHt9IHsKCXNldCBwIFtsaW5kZXggJG9sZGRpc3BsaXN0ICRpXQoJaWYgeyRwID09IHt9fSBjb250aW51ZQoJaWYgeyRpID09ICRjb3JuZXJ9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJGlkKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNvcm5lcmNyb3NzaW5ncygkaWQpICRwXSA8IDB9IHsKCQlsYXBwZW5kIGNvcm5lcmNyb3NzaW5ncygkaWQpICRwCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvcm5lcmNyb3NzaW5ncygkcCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjb3JuZXJjcm9zc2luZ3MoJHApICRpZF0gPCAwfSB7CgkJbGFwcGVuZCBjb3JuZXJjcm9zc2luZ3MoJHApICRpZAoJICAgIH0KCX0gZWxzZSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRpZCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjcm9zc2luZ3MoJGlkKSAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjcm9zc2luZ3MoJGlkKSAkcAoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjcm9zc2luZ3MoJHApXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY3Jvc3NpbmdzKCRwKSAkaWRdIDwgMH0gewoJCWxhcHBlbmQgY3Jvc3NpbmdzKCRwKSAkaWQKCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgeGNvb3JkIHtpIGxldmVsIGxufSB7CiAgICBnbG9iYWwgY2FudngwIHhzcGMxIHhzcGMyCgogICAgc2V0IHggW2V4cHIgeyRjYW52eDAgKyAkaSAqICR4c3BjMSgkbG4pfV0KICAgIGlmIHskaSA+IDAgJiYgJGkgPT0gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAwLjUgKiAoJHhzcGMyIC0gJHhzcGMxKCRsbikpfV0KICAgIH0gZWxzZWlmIHskaSA+ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgJHhzcGMyIC0gJHhzcGMxKCRsbil9XQogICAgfQogICAgcmV0dXJuICR4Cn0KCiMgaXQgc2VlbXMgVGsgY2FuJ3QgZHJhdyBhcnJvd3Mgb24gdGhlIGVuZCBvZiBkaWFnb25hbCBsaW5lIHNlZ21lbnRzLi4uCnByb2MgdHJpbWRpYWdlbmQge2xpbmV9IHsKICAgIHdoaWxlIHtbbGxlbmd0aCAkbGluZV0gPiA0fSB7CglzZXQgeDEgW2xpbmRleCAkbGluZSBlbmQtM10KCXNldCB5MSBbbGluZGV4ICRsaW5lIGVuZC0yXQoJc2V0IHgyIFtsaW5kZXggJGxpbmUgZW5kLTFdCglzZXQgeTIgW2xpbmRleCAkbGluZSBlbmRdCglpZiB7KCR4MSA9PSAkeDIpICE9ICgkeTEgPT0gJHkyKX0gYnJlYWsKCXNldCBsaW5lIFtscmVwbGFjZSAkbGluZSBlbmQtMSBlbmRdCiAgICB9CiAgICByZXR1cm4gJGxpbmUKfQoKcHJvYyB0cmltZGlhZ3N0YXJ0IHtsaW5lfSB7CiAgICB3aGlsZSB7W2xsZW5ndGggJGxpbmVdID4gNH0gewoJc2V0IHgxIFtsaW5kZXggJGxpbmUgMF0KCXNldCB5MSBbbGluZGV4ICRsaW5lIDFdCglzZXQgeDIgW2xpbmRleCAkbGluZSAyXQoJc2V0IHkyIFtsaW5kZXggJGxpbmUgM10KCWlmIHsoJHgxID09ICR4MikgIT0gKCR5MSA9PSAkeTIpfSBicmVhawoJc2V0IGxpbmUgW2xyZXBsYWNlICRsaW5lIDAgMV0KICAgIH0KICAgIHJldHVybiAkbGluZQp9Cgpwcm9jIGRyYXdzbGFudHMge2lkIG5lZWRvbnNjcmVlbiBub2hzfSB7CiAgICBnbG9iYWwgY2FudiBtYWlubGluZSBtYWlubGluZWFycm93IHNpZGVsaW5lcwogICAgZ2xvYmFsIGNhbnZ4MCBjYW52eSB4c3BjMSB4c3BjMiBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY3VycmVudHBhcmVudHMgZHVwcGFyZW50cwogICAgZ2xvYmFsIGx0aGlja25lc3MgbGluZXNwYyBjYW52eSBjb2xvcm1hcCBsaW5lbm8gZ2VvbWV0cnkKICAgIGdsb2JhbCBtYXhncmFwaHBjdCBtYXh3aWR0aAogICAgZ2xvYmFsIGRpc3BsaXN0IG9uc2NyZWVuIGxhc3R1c2UKICAgIGdsb2JhbCBwYXJlbnRzIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIG9sZG5saW5lcyBvbGRkbGV2ZWwgb2xkZGlzcGxpc3QKICAgIGdsb2JhbCBuaHlwZXJzcGFjZSBudW1jb21taXRzIG5uZXdwYXJlbnRzCgogICAgaWYgeyRsaW5lbm8gPCAwfSB7CglsYXBwZW5kIGRpc3BsaXN0ICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMQoJcmV0dXJuIDAKICAgIH0KCiAgICBzZXQgeTEgW2V4cHIgeyRjYW52eSAtICRsaW5lc3BjfV0KICAgIHNldCB5MiAkY2FudnkKCiAgICAjIHdvcmsgb3V0IHdoYXQgd2UgbmVlZCB0byBnZXQgYmFjayBvbiBzY3JlZW4KICAgIHNldCByZWlucyB7fQogICAgaWYgeyRvbnNjcmVlbigkaWQpIDwgMH0gewoJIyBuZXh0IHRvIGRvIGlzbid0IGRpc3BsYXllZCwgYmV0dGVyIGdldCBpdCBvbiBzY3JlZW4uLi4KCWxhcHBlbmQgcmVpbnMgW2xpc3QgJGlkIDBdCiAgICB9CiAgICAjIG1ha2Ugc3VyZSBhbGwgdGhlIHByZXZpb3VzIGNvbW1pdHMncyBwYXJlbnRzIGFyZSBvbiB0aGUgc2NyZWVuCiAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCWlmIHskb25zY3JlZW4oJHApIDwgMH0gewoJICAgIGxhcHBlbmQgcmVpbnMgW2xpc3QgJHAgMF0KCX0KICAgIH0KICAgICMgYnJpbmcgYmFjayBhbnl0aGluZyByZXF1ZXN0ZWQgYnkgY2FsbGVyCiAgICBpZiB7JG5lZWRvbnNjcmVlbiBuZSB7fX0gewoJbGFwcGVuZCByZWlucyAkbmVlZG9uc2NyZWVuCiAgICB9CgogICAgIyB0cnkgdGhlIHNob3J0Y3V0CiAgICBpZiB7JGN1cnJlbnRwYXJlbnRzID09ICRpZCAmJiAkb25zY3JlZW4oJGlkKSA9PSAwICYmICRyZWlucyBlcSB7fX0gewoJc2V0IGRsZXZlbCAkb2xkZGxldmVsCglzZXQgeCBbeGNvb3JkICRkbGV2ZWwgJGRsZXZlbCAkbGluZW5vXQoJc2V0IG1haW5saW5lKCRpZCkgW2xpc3QgJHggJHkxXQoJc2V0IG1haW5saW5lYXJyb3coJGlkKSBub25lCglzZXQgbGFzdHVzZSgkaWQpICRsaW5lbm8KCXNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRkbGV2ZWwgJGRsZXZlbCAkaWRdCglzZXQgb25zY3JlZW4oJGlkKSAxCglzZXQgeHNwYzEoW2V4cHIgeyRsaW5lbm8gKyAxfV0pICR4c3BjMSgkbGluZW5vKQoJcmV0dXJuICRkbGV2ZWwKICAgIH0KCiAgICAjIHVwZGF0ZSBkaXNwbGlzdAogICAgc2V0IGRpc3BsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJG9sZGRsZXZlbCAkb2xkZGxldmVsXQogICAgc2V0IGogJG9sZGRsZXZlbAogICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CglzZXQgbGFzdHVzZSgkcCkgJGxpbmVubwoJaWYgeyRvbnNjcmVlbigkcCkgPT0gMH0gewoJICAgIHNldCBkaXNwbGlzdCBbbGluc2VydCAkZGlzcGxpc3QgJGogJHBdCgkgICAgc2V0IG9uc2NyZWVuKCRwKSAxCgkgICAgaW5jciBqCgl9CiAgICB9CiAgICBpZiB7JG9uc2NyZWVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCBkaXNwbGlzdCAkaWQKCXNldCBvbnNjcmVlbigkaWQpIDEKICAgIH0KCiAgICAjIHJlbW92ZSB0aGUgbnVsbCBlbnRyeSBpZiBwcmVzZW50CiAgICBzZXQgbnVsbGVudHJ5IFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3Qge31dCiAgICBpZiB7JG51bGxlbnRyeSA+PSAwfSB7CglzZXQgZGlzcGxpc3QgW2xyZXBsYWNlICRkaXNwbGlzdCAkbnVsbGVudHJ5ICRudWxsZW50cnldCiAgICB9CgogICAgIyBicmluZyBiYWNrIHRoZSBvbmVzIHdlIG5lZWQgbm93IChpZiB3ZSBkaWQgaXQgZWFybGllcgogICAgIyBpdCB3b3VsZCBjaGFuZ2UgZGlzcGxpc3QgYW5kIGludmFsaWRhdGUgb2xkZGxldmVsKQogICAgZm9yZWFjaCBwaSAkcmVpbnMgewoJIyB0ZXN0IGFnYWluIGluIGNhc2Ugb2YgZHVwbGljYXRlcyBpbiByZWlucwoJc2V0IHAgW2xpbmRleCAkcGkgMF0KCWlmIHskb25zY3JlZW4oJHApIDwgMH0gewoJICAgIHNldCBvbnNjcmVlbigkcCkgMQoJICAgIHNldCBsYXN0dXNlKCRwKSAkbGluZW5vCgkgICAgc2V0IGRpc3BsaXN0IFtsaW5zZXJ0ICRkaXNwbGlzdCBbbGluZGV4ICRwaSAxXSAkcF0KCSAgICBpbmNyIG5oeXBlcnNwYWNlIC0xCgl9CiAgICB9CgogICAgc2V0IGxhc3R1c2UoJGlkKSAkbGluZW5vCgogICAgIyBzZWUgaWYgd2UgbmVlZCB0byBtYWtlIGFueSBsaW5lcyBqdW1wIG9mZiBpbnRvIGh5cGVyc3BhY2UKICAgIHNldCBkaXNwbCBbbGxlbmd0aCAkZGlzcGxpc3RdCiAgICBpZiB7JGRpc3BsID4gJG1heHdpZHRofSB7CglzZXQgYWdlcyB7fQoJZm9yZWFjaCB4ICRkaXNwbGlzdCB7CgkgICAgbGFwcGVuZCBhZ2VzIFtsaXN0ICRsYXN0dXNlKCR4KSAkeF0KCX0KCXNldCBhZ2VzIFtsc29ydCAtaW50ZWdlciAtaW5kZXggMCAkYWdlc10KCXNldCBrIDAKCXdoaWxlIHskZGlzcGwgPiAkbWF4d2lkdGh9IHsKCSAgICBzZXQgdXNlIFtsaW5kZXggJGFnZXMgJGsgMF0KCSAgICBzZXQgdmljdGltIFtsaW5kZXggJGFnZXMgJGsgMV0KCSAgICBpZiB7JHVzZSA+PSAkbGluZW5vIC0gNX0gYnJlYWsKCSAgICBpbmNyIGsKCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICR2aWN0aW1dID49IDB9IGNvbnRpbnVlCgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkdmljdGltXQoJICAgIHNldCBkaXNwbGlzdCBbbHJlcGxhY2UgJGRpc3BsaXN0ICRpICRpXQoJICAgIHNldCBvbnNjcmVlbigkdmljdGltKSAtMQoJICAgIGluY3Igbmh5cGVyc3BhY2UKCSAgICBpbmNyIGRpc3BsIC0xCgkgICAgaWYgeyRpIDwgJG51bGxlbnRyeX0gewoJCWluY3IgbnVsbGVudHJ5IC0xCgkgICAgfQoJICAgIHNldCB4IFtsaW5kZXggJG1haW5saW5lKCR2aWN0aW0pIGVuZC0xXQoJICAgIGxhcHBlbmQgbWFpbmxpbmUoJHZpY3RpbSkgJHggJHkxCgkgICAgc2V0IGxpbmUgW3RyaW1kaWFnZW5kICRtYWlubGluZSgkdmljdGltKV0KCSAgICBzZXQgYXJyb3cgImxhc3QiCgkgICAgaWYgeyRtYWlubGluZWFycm93KCR2aWN0aW0pIG5lICJub25lIn0gewoJCXNldCBsaW5lIFt0cmltZGlhZ3N0YXJ0ICRsaW5lXQoJCXNldCBhcnJvdyAiYm90aCIKCSAgICB9CgkgICAgbGFwcGVuZCBzaWRlbGluZXMoJHZpY3RpbSkgW2xpc3QgJGxpbmUgMSAkYXJyb3ddCgkgICAgdW5zZXQgbWFpbmxpbmUoJHZpY3RpbSkKCX0KICAgIH0KCiAgICBzZXQgZGxldmVsIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJGlkXQoKICAgICMgSWYgd2UgYXJlIHJlZHVjaW5nLCBwdXQgaW4gYSBudWxsIGVudHJ5CiAgICBpZiB7JGRpc3BsIDwgJG9sZG5saW5lc30gewoJIyBkb2VzIHRoZSBuZXh0IGxpbmUgbG9vayBsaWtlIGEgbWVyZ2U/CgkjIGkuZS4gZG9lcyBpdCBoYXZlID4gMSBuZXcgcGFyZW50PwoJaWYgeyRubmV3cGFyZW50cygkaWQpID4gMX0gewoJICAgIHNldCBpIFtleHByIHskZGxldmVsICsgMX1dCgl9IGVsc2VpZiB7JG5uZXdwYXJlbnRzKFtsaW5kZXggJG9sZGRpc3BsaXN0ICRvbGRkbGV2ZWxdKSA9PSAwfSB7CgkgICAgc2V0IGkgJG9sZGRsZXZlbAoJICAgIGlmIHskbnVsbGVudHJ5ID49IDAgJiYgJG51bGxlbnRyeSA8ICRpfSB7CgkJaW5jciBpIC0xCgkgICAgfQoJfSBlbHNlaWYgeyRudWxsZW50cnkgPj0gMH0gewoJICAgIHNldCBpICRudWxsZW50cnkKCSAgICB3aGlsZSB7JGkgPCAkZGlzcGwKCQkgICAmJiBbbGluZGV4ICRvbGRkaXNwbGlzdCAkaV0gPT0gW2xpbmRleCAkZGlzcGxpc3QgJGldfSB7CgkJaW5jciBpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgaSAkb2xkZGxldmVsCgkgICAgaWYgeyRkbGV2ZWwgPj0gJGl9IHsKCQlpbmNyIGkKCSAgICB9Cgl9CglpZiB7JGkgPCAkZGlzcGx9IHsKCSAgICBzZXQgZGlzcGxpc3QgW2xpbnNlcnQgJGRpc3BsaXN0ICRpIHt9XQoJICAgIGluY3IgZGlzcGwKCSAgICBpZiB7JGRsZXZlbCA+PSAkaX0gewoJCWluY3IgZGxldmVsCgkgICAgfQoJfQogICAgfQoKICAgICMgZGVjaWRlIG9uIHRoZSBsaW5lIHNwYWNpbmcgZm9yIHRoZSBuZXh0IGxpbmUKICAgIHNldCBsaiBbZXhwciB7JGxpbmVubyArIDF9XQogICAgc2V0IG1heHcgW2V4cHIgeyRtYXhncmFwaHBjdCAqICRnZW9tZXRyeShjYW52MSkgLyAxMDB9XQogICAgaWYgeyRkaXNwbCA8PSAxIHx8ICRjYW52eDAgKyAkZGlzcGwgKiAkeHNwYzIgPD0gJG1heHd9IHsKCXNldCB4c3BjMSgkbGopICR4c3BjMgogICAgfSBlbHNlIHsKCXNldCB4c3BjMSgkbGopIFtleHByIHsoJG1heHcgLSAkY2FudngwIC0gJHhzcGMyKSAvICgkZGlzcGwgLSAxKX1dCglpZiB7JHhzcGMxKCRsaikgPCAkbHRoaWNrbmVzc30gewoJICAgIHNldCB4c3BjMSgkbGopICRsdGhpY2tuZXNzCgl9CiAgICB9CgogICAgZm9yZWFjaCBpZGkgJHJlaW5zIHsKCXNldCBpZCBbbGluZGV4ICRpZGkgMF0KCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJGlkXQoJc2V0IHhqIFt4Y29vcmQgJGogJGRsZXZlbCAkbGpdCglzZXQgbWFpbmxpbmUoJGlkKSBbbGlzdCAkeGogJHkyXQoJc2V0IG1haW5saW5lYXJyb3coJGlkKSBmaXJzdAogICAgfQoKICAgIHNldCBpIC0xCiAgICBmb3JlYWNoIGlkICRvbGRkaXNwbGlzdCB7CglpbmNyIGkKCWlmIHskaWQgPT0ge319IGNvbnRpbnVlCglpZiB7JG9uc2NyZWVuKCRpZCkgPD0gMH0gY29udGludWUKCXNldCB4aSBbeGNvb3JkICRpICRvbGRkbGV2ZWwgJGxpbmVub10KCWlmIHskaSA9PSAkb2xkZGxldmVsfSB7CgkgICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CgkJc2V0IGogW2xzZWFyY2ggLWV4YWN0ICRkaXNwbGlzdCAkcF0KCQlzZXQgY29vcmRzIFtsaXN0ICR4aSAkeTFdCgkJc2V0IHhqIFt4Y29vcmQgJGogJGRsZXZlbCAkbGpdCgkJaWYgeyR4aiA8ICR4aSAtICRsaW5lc3BjfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByIHskeGogKyAkbGluZXNwY31dICR5MQoJCSAgICBub3RlY3Jvc3NpbmdzICRwICRqICRpIFtleHByIHskaiArIDF9XQoJCX0gZWxzZWlmIHskeGogPiAkeGkgKyAkbGluZXNwY30gewoJCSAgICBsYXBwZW5kIGNvb3JkcyBbZXhwciB7JHhqIC0gJGxpbmVzcGN9XSAkeTEKCQkgICAgbm90ZWNyb3NzaW5ncyAkcCAkaSAkaiBbZXhwciB7JGogLSAxfV0KCQl9CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZHVwcGFyZW50cyAkcF0gPj0gMH0gewoJCSAgICAjIGRyYXcgYSBkb3VibGUtd2lkdGggbGluZSB0byBpbmRpY2F0ZSB0aGUgZG91YmxlZCBwYXJlbnQKCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5MgoJCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAyIG5vbmVdCgkJICAgIGlmIHshW2luZm8gZXhpc3RzIG1haW5saW5lKCRwKV19IHsKCQkJc2V0IG1haW5saW5lKCRwKSBbbGlzdCAkeGogJHkyXQoJCQlzZXQgbWFpbmxpbmVhcnJvdygkcCkgbm9uZQoJCSAgICB9CgkJfSBlbHNlIHsKCQkgICAgIyBub3JtYWwgY2FzZSwgbm8gcGFyZW50IGR1cGxpY2F0ZWQKCQkgICAgc2V0IHliICR5MgoJCSAgICBzZXQgZHggW2V4cHIge2FicygkeGkgLSAkeGopfV0KCQkgICAgaWYgezAgJiYgJGR4IDwgJGxpbmVzcGN9IHsKCQkJc2V0IHliIFtleHByIHskeTEgKyAkZHh9XQoJCSAgICB9CgkJICAgIGlmIHshW2luZm8gZXhpc3RzIG1haW5saW5lKCRwKV19IHsKCQkJaWYgeyR4aSAhPSAkeGp9IHsKCQkJICAgIGxhcHBlbmQgY29vcmRzICR4aiAkeWIKCQkJfQoJCQlzZXQgbWFpbmxpbmUoJHApICRjb29yZHMKCQkJc2V0IG1haW5saW5lYXJyb3coJHApIG5vbmUKCQkgICAgfSBlbHNlIHsKCQkJbGFwcGVuZCBjb29yZHMgJHhqICR5YgoJCQlpZiB7JHliIDwgJHkyfSB7CgkJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJCX0KCQkJbGFwcGVuZCBzaWRlbGluZXMoJHApIFtsaXN0ICRjb29yZHMgMSBub25lXQoJCSAgICB9CgkJfQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IGogJGkKCSAgICBpZiB7W2xpbmRleCAkZGlzcGxpc3QgJGldICE9ICRpZH0gewoJCXNldCBqIFtsc2VhcmNoIC1leGFjdCAkZGlzcGxpc3QgJGlkXQoJICAgIH0KCSAgICBpZiB7JGogIT0gJGkgfHwgJHhzcGMxKCRsaW5lbm8pICE9ICR4c3BjMSgkbGopCgkJfHwgKCRvbGRkbGV2ZWwgPCAkaSAmJiAkaSA8ICRkbGV2ZWwpCgkJfHwgKCRkbGV2ZWwgPCAkaSAmJiAkaSA8ICRvbGRkbGV2ZWwpfSB7CgkJc2V0IHhqIFt4Y29vcmQgJGogJGRsZXZlbCAkbGpdCgkJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4aSAkeTEgJHhqICR5MgoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkZGxldmVsCn0KCiMgc2VhcmNoIGZvciB4IGluIGEgbGlzdCBvZiBsaXN0cwpwcm9jIGxsc2VhcmNoIHtsbGlzdCB4fSB7CiAgICBzZXQgaSAwCiAgICBmb3JlYWNoIGwgJGxsaXN0IHsKCWlmIHskbCA9PSAkeCB8fCBbbHNlYXJjaCAtZXhhY3QgJGwgJHhdID49IDB9IHsKCSAgICByZXR1cm4gJGkKCX0KCWluY3IgaQogICAgfQogICAgcmV0dXJuIC0xCn0KCnByb2MgZHJhd21vcmUge3JlYWRpbmd9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbnVtY29tbWl0cyBuY211cGRhdGUgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0b3BwZWQgbmh5cGVyc3BhY2UgcGFyZW50cyBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBtYXh3aWR0aCBvbnNjcmVlbiBkaXNwbGlzdCBjdXJyZW50cGFyZW50cyBvbGRkbGV2ZWwKCiAgICBzZXQgbiBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQogICAgd2hpbGUgeyRudW1jb21taXRzIDwgJG59IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJG51bWNvbW1pdHNdCglzZXQgY3R4ZW5kIFtleHByIHskbnVtY29tbWl0cyArIDEwfV0KCWlmIHshJHJlYWRpbmcgJiYgJGN0eGVuZCA+ICRufSB7CgkgICAgc2V0IGN0eGVuZCAkbgoJfQoJc2V0IGRsaXN0IHt9CglpZiB7JG51bWNvbW1pdHMgPiAwfSB7CgkgICAgc2V0IGRsaXN0IFtscmVwbGFjZSAkZGlzcGxpc3QgJG9sZGRsZXZlbCAkb2xkZGxldmVsXQoJICAgIHNldCBpICRvbGRkbGV2ZWwKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlpZiB7JG9uc2NyZWVuKCRwKSA9PSAwfSB7CgkJICAgIHNldCBkbGlzdCBbbGluc2VydCAkZGxpc3QgJGkgJHBdCgkJICAgIGluY3IgaQoJCX0KCSAgICB9Cgl9CglzZXQgbm9ocyB7fQoJc2V0IHJlaW5zIHt9CglzZXQgaXNmYXQgW2V4cHIge1tsbGVuZ3RoICRkbGlzdF0gPiAkbWF4d2lkdGh9XQoJaWYgeyRuaHlwZXJzcGFjZSA+IDAgfHwgJGlzZmF0fSB7CgkgICAgaWYgeyRjdHhlbmQgPiAkbn0gYnJlYWsKCSAgICAjIHdvcmsgb3V0IHdoYXQgdG8gYnJpbmcgYmFjayBhbmQKCSAgICAjIHdoYXQgd2Ugd2FudCB0byBkb24ndCB3YW50IHRvIHNlbmQgaW50byBoeXBlcnNwYWNlCgkgICAgc2V0IHJvb20gMQoJICAgIGZvciB7c2V0IGsgJG51bWNvbW1pdHN9IHskayA8ICRjdHhlbmR9IHtpbmNyIGt9IHsKCQlzZXQgeCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGtdCgkJc2V0IGkgW2xsc2VhcmNoICRkbGlzdCAkeF0KCQlpZiB7JGkgPCAwfSB7CgkJICAgIHNldCBpIFtsbGVuZ3RoICRkbGlzdF0KCQkgICAgbGFwcGVuZCBkbGlzdCAkeAoJCX0KCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRub2hzICR4XSA8IDB9IHsKCQkgICAgbGFwcGVuZCBub2hzICR4CgkJfQoJCWlmIHskcmVpbnMgZXEge30gJiYgJG9uc2NyZWVuKCR4KSA8IDAgJiYgJHJvb219IHsKCQkgICAgc2V0IHJlaW5zIFtsaXN0ICR4ICRpXQoJCX0KCQlzZXQgbmV3cCB7fQoJCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCR4KV19IHsKCQkgICAgc2V0IHJpZ2h0IDAKCQkgICAgZm9yZWFjaCBwICRwYXJlbnRzKCR4KSB7CgkJCWlmIHtbbGxzZWFyY2ggJGRsaXN0ICRwXSA8IDB9IHsKCQkJICAgIGxhcHBlbmQgbmV3cCAkcAoJCQkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkbm9ocyAkcF0gPCAwfSB7CgkJCQlsYXBwZW5kIG5vaHMgJHAKCQkJICAgIH0KCQkJICAgIGlmIHskcmVpbnMgZXEge30gJiYgJG9uc2NyZWVuKCRwKSA8IDAgJiYgJHJvb219IHsKCQkJCXNldCByZWlucyBbbGlzdCAkcCBbZXhwciB7JGkgKyAkcmlnaHR9XV0KCQkJICAgIH0KCQkJfQoJCQlzZXQgcmlnaHQgMQoJCSAgICB9CgkJfQoJCXNldCBsIFtsaW5kZXggJGRsaXN0ICRpXQoJCWlmIHtbbGxlbmd0aCAkbF0gPT0gMX0gewoJCSAgICBzZXQgbCAkbmV3cAoJCX0gZWxzZSB7CgkJICAgIHNldCBqIFtsc2VhcmNoIC1leGFjdCAkbCAkeF0KCQkgICAgc2V0IGwgW2NvbmNhdCBbbHJlcGxhY2UgJGwgJGogJGpdICRuZXdwXQoJCX0KCQlzZXQgZGxpc3QgW2xyZXBsYWNlICRkbGlzdCAkaSAkaSAkbF0KCQlpZiB7JHJvb20gJiYgJGlzZmF0ICYmIFtsbGVuZ3RoICRuZXdwXSA8PSAxfSB7CgkJICAgIHNldCByb29tIDAKCQl9CgkgICAgfQoJfQoKCXNldCBkbGV2ZWwgW2RyYXdzbGFudHMgJGlkICRyZWlucyAkbm9oc10KCWRyYXdjb21taXRsaW5lICRkbGV2ZWwKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlCgkgICAgJiYgJG51bWNvbW1pdHMgPj0gJG5jbXVwZGF0ZX0gewoJICAgIGRvdXBkYXRlICRyZWFkaW5nCgkgICAgaWYgeyRzdG9wcGVkfSBicmVhawoJfQogICAgfQp9CgojIGxldmVsIGhlcmUgaXMgYW4gaW5kZXggaW4gdG9kbwpwcm9jIHVwZGF0ZXRvZG8ge2xldmVsIG5vc2hvcnRjdXR9IHsKICAgIGdsb2JhbCBuY2xlZnQgdG9kbyBubmV3cGFyZW50cwogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBwYXJlbnRzIG9uc2NyZWVuCgogICAgc2V0IGlkIFtsaW5kZXggJHRvZG8gJGxldmVsXQogICAgc2V0IG9sZHMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldfSB7Cglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkb2xkcyAkcF0gPCAwfSB7CgkJbGFwcGVuZCBvbGRzICRwCgkgICAgfQoJfQogICAgfQogICAgaWYgeyEkbm9zaG9ydGN1dCAmJiBbbGxlbmd0aCAkb2xkc10gPT0gMX0gewoJc2V0IHAgW2xpbmRleCAkb2xkcyAwXQoJaWYgeyRuY2xlZnQoJHApID09IDEgJiYgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXSA8IDB9IHsKCSAgICBzZXQgbmNsZWZ0KCRwKSAwCgkgICAgc2V0IHRvZG8gW2xyZXBsYWNlICR0b2RvICRsZXZlbCAkbGV2ZWwgJHBdCgkgICAgc2V0IG9uc2NyZWVuKCRwKSAwCgkgICAgc2V0IG5uZXdwYXJlbnRzKCRpZCkgMQoJICAgIHJldHVybiAwCgl9CiAgICB9CgogICAgc2V0IHRvZG8gW2xyZXBsYWNlICR0b2RvICRsZXZlbCAkbGV2ZWxdCiAgICBzZXQgaSAkbGV2ZWwKICAgIHNldCBuIDAKICAgIGZvcmVhY2ggcCAkb2xkcyB7CglpbmNyIG5jbGVmdCgkcCkgLTEKCXNldCBrIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkcF0KCWlmIHskayA8IDB9IHsKCSAgICBzZXQgdG9kbyBbbGluc2VydCAkdG9kbyAkaSAkcF0KCSAgICBzZXQgb25zY3JlZW4oJHApIDAKCSAgICBpbmNyIGkKCSAgICBpbmNyIG4KCX0KICAgIH0KICAgIHNldCBubmV3cGFyZW50cygkaWQpICRuCgogICAgcmV0dXJuIDEKfQoKcHJvYyBkZWNpZGVuZXh0IHt7bm9yZWFkIDB9fSB7CiAgICBnbG9iYWwgbmNsZWZ0IHRvZG8KICAgIGdsb2JhbCBkYXRlbW9kZSBjZGF0ZQogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICAjIGNob29zZSB3aGljaCBvbmUgdG8gZG8gbmV4dCB0aW1lIGFyb3VuZAogICAgc2V0IHRvZG9sIFtsbGVuZ3RoICR0b2RvXQogICAgc2V0IGxldmVsIC0xCiAgICBzZXQgbGF0ZXN0IHt9CiAgICBmb3Ige3NldCBrICR0b2RvbH0ge1tpbmNyIGsgLTFdID49IDB9IHt9IHsKCXNldCBwIFtsaW5kZXggJHRvZG8gJGtdCglpZiB7JG5jbGVmdCgkcCkgPT0gMH0gewoJICAgIGlmIHskZGF0ZW1vZGV9IHsKCQlpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKCQkgICAgaWYgeyRub3JlYWR9IHsKCQkJcmV0dXJuIHt9CgkJICAgIH0KCQkgICAgcmVhZGNvbW1pdCAkcAoJCX0KCQlpZiB7JGxhdGVzdCA9PSB7fSB8fCAkY2RhdGUoJHApID4gJGxhdGVzdH0gewoJCSAgICBzZXQgbGV2ZWwgJGsKCQkgICAgc2V0IGxhdGVzdCAkY2RhdGUoJHApCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGxldmVsICRrCgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CgogICAgcmV0dXJuICRsZXZlbAp9Cgpwcm9jIGRyYXdjb21taXQge2lkIHJlYWRpbmd9IHsKICAgIGdsb2JhbCBwaGFzZSB0b2RvIG5jaGlsZHJlbiBkYXRlbW9kZSBuZXh0dXBkYXRlIHJldmxpc3RvcmRlciBuY2xlZnQKICAgIGdsb2JhbCBudW1jb21taXRzIG5jbXVwZGF0ZSBkaXNwbGF5b3JkZXIgdG9kbyBvbnNjcmVlbiBwYXJlbnRzCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIGNvbW1pdG9yZGVyZWQKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCXNldCBwaGFzZSBpbmNyZHJhdwoJc2V0IGRpc3BsYXlvcmRlciB7fQoJc2V0IHRvZG8ge30KCWluaXRncmFwaAoJY2F0Y2gge3Vuc2V0IGNvbW1pdG9yZGVyZWR9CiAgICB9CiAgICBzZXQgY29tbWl0b3JkZXJlZCgkaWQpIDEKICAgIGlmIHskbmNoaWxkcmVuKCRpZCkgPT0gMH0gewoJbGFwcGVuZCB0b2RvICRpZAoJc2V0IG9uc2NyZWVuKCRpZCkgMAogICAgfQogICAgaWYgeyRyZXZsaXN0b3JkZXJ9IHsKCXNldCBsZXZlbCBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJGlkXQoJaWYgeyRsZXZlbCA8IDB9IHsKCSAgICBlcnJvcl9wb3B1cCAib29wcywgJGlkIGlzbid0IGluIHRvZG8iCgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKCXVwZGF0ZXRvZG8gJGxldmVsIDAKICAgIH0gZWxzZSB7CglzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCWlmIHskbGV2ZWwgPT0ge30gfHwgJGxldmVsIDwgMH0gcmV0dXJuCgl3aGlsZSAxIHsKCSAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0b3JkZXJlZCgkaWQpXX0gewoJCWJyZWFrCgkgICAgfQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyIFtsaW5kZXggJHRvZG8gJGxldmVsXQoJICAgIGlmIHtbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXX0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dCAxXQoJCWlmIHskbGV2ZWwgPT0ge30gfHwgJGxldmVsIDwgMH0gYnJlYWsKCSAgICB9Cgl9CiAgICB9CiAgICBkcmF3bW9yZSAkcmVhZGluZwp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIHBoYXNlIG9sZGNvbW1pdHMgY29tbWl0cwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgY3RleHQgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgcGFyZW50cyBkaXNwbGF5b3JkZXIgdG9kbwoKICAgIGlmIHskcGhhc2UgPT0gImluY3JkcmF3IiB8fCAkcGhhc2UgPT0gInJlbW92ZWNvbW1pdHMifSB7Cglmb3JlYWNoIGlkICRvbGRjb21taXRzIHsKCSAgICBsYXBwZW5kIGNvbW1pdHMgJGlkCgkgICAgZHJhd2NvbW1pdCAkaWQgMAoJfQoJc2V0IG9sZGNvbW1pdHMge30KCWRyYXdyZXN0CiAgICB9IGVsc2VpZiB7JHBoYXNlID09ICJ1cGRhdGVjb21taXRzIn0gewoJIyB0aGVyZSB3ZXJlIG5vIG5ldyBjb21taXRzLCBpbiBmYWN0CglzZXQgY29tbWl0cyAkb2xkY29tbWl0cwoJc2V0IG9sZGNvbW1pdHMge30KCXNldCBwaGFzZSB7fQogICAgfSBlbHNlIHsKCSRjYW52IGRlbGV0ZSBhbGwKCSRjYW52IGNyZWF0ZSB0ZXh0IDMgMyAtYW5jaG9yIG53IC10ZXh0ICJObyBjb21taXRzIHNlbGVjdGVkIiBcCgkgICAgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwoJc2V0IHBoYXNlIHt9CiAgICB9CiAgICAuIGNvbmZpZyAtY3Vyc29yICRtYWluY3Vyc29yCiAgICBzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCn0KCiMgRG9uJ3QgY2hhbmdlIHRoZSB0ZXh0IHBhbmUgY3Vyc29yIGlmIGl0IGlzIGN1cnJlbnRseSB0aGUgaGFuZCBjdXJzb3IsCiMgc2hvd2luZyB0aGF0IHdlIGFyZSBvdmVyIGEgc2hhMSBJRCBsaW5rLgpwcm9jIHNldHRleHRjdXJzb3Ige2N9IHsKICAgIGdsb2JhbCBjdGV4dCBjdXJ0ZXh0Y3Vyc29yCgogICAgaWYge1skY3RleHQgY2dldCAtY3Vyc29yXSA9PSAkY3VydGV4dGN1cnNvcn0gewoJJGN0ZXh0IGNvbmZpZyAtY3Vyc29yICRjCiAgICB9CiAgICBzZXQgY3VydGV4dGN1cnNvciAkYwp9Cgpwcm9jIGRyYXdncmFwaCB7fSB7CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBzdGFydG1zZWNzIG5jbXVwZGF0ZQogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBvbnNjcmVlbgoKICAgIGlmIHskZGlzcGxheW9yZGVyID09IHt9fSByZXR1cm4KICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgbmNtdXBkYXRlIDEKICAgIGluaXRncmFwaAogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCXNldCBvbnNjcmVlbigkaWQpIDAKICAgIH0KICAgIGRyYXdtb3JlIDAKfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgcGhhc2Ugc3RvcHBlZCByZWRpc3BsYXlpbmcgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGF0ZW1vZGUgdG9kbyBkaXNwbGF5b3JkZXIgbmNsZWZ0CiAgICBnbG9iYWwgbnVtY29tbWl0cyBuY211cGRhdGUKICAgIGdsb2JhbCBuZXh0dXBkYXRlIHN0YXJ0bXNlY3MgcmV2bGlzdG9yZGVyCgogICAgc2V0IGxldmVsIFtkZWNpZGVuZXh0XQogICAgaWYgeyRsZXZlbCA+PSAwfSB7CglzZXQgcGhhc2UgZHJhd2dyYXBoCgl3aGlsZSAxIHsKCSAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciBbbGluZGV4ICR0b2RvICRsZXZlbF0KCSAgICBzZXQgaGFyZCBbdXBkYXRldG9kbyAkbGV2ZWwgJGRhdGVtb2RlXQoJICAgIGlmIHskaGFyZH0gewoJCXNldCBsZXZlbCBbZGVjaWRlbmV4dF0KCQlpZiB7JGxldmVsIDwgMH0gYnJlYWsKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JHRvZG8gIT0ge319IHsKCXB1dHMgIkVSUk9SOiBub25lIG9mIHRoZSBwZW5kaW5nIGNvbW1pdHMgY2FuIGJlIGRvbmUgeWV0OiIKCWZvcmVhY2ggcCAkdG9kbyB7CgkgICAgcHV0cyAiICAkcCAoJG5jbGVmdCgkcCkpIgoJfQogICAgfQoKICAgIGRyYXdtb3JlIDAKICAgIHNldCBwaGFzZSB7fQogICAgc2V0IGRyYXdtc2VjcyBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzfV0KICAgICNwdXRzICJvdmVyYWxsICRkcmF3bXNlY3MgbXMgZm9yICRudW1jb21taXRzIGNvbW1pdHMiCiAgICBpZiB7JHJlZGlzcGxheWluZ30gewoJaWYgeyRzdG9wcGVkID09IDAgJiYgW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCSAgICBzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAoJfQoJaWYgeyRzdG9wcGVkID09IDF9IHsKCSAgICBzZXQgc3RvcHBlZCAwCgkgICAgYWZ0ZXIgaWRsZSBkcmF3Z3JhcGgKCX0gZWxzZSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgl9CiAgICB9Cn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByIHskaiskZm91bmRzdHJsZW4tMX1dXQoJICAgIHNldCBpIFtleHByIHskaiArICRmb3VuZHN0cmxlbn1dCgl9CiAgICB9CiAgICByZXR1cm4gJG1hdGNoZXMKfQoKcHJvYyBkb2ZpbmQge30gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmRsb2MgZmluZHN0cmluZyBtYXJrZWRtYXRjaGVzIGNvbW1pdGluZm8KICAgIGdsb2JhbCBudW1jb21taXRzIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IGNhbnYgY2FudjIgY2FudjMgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgoKICAgIHN0b3BmaW5kcHJvYwogICAgdW5tYXJrbWF0Y2hlcwogICAgZm9jdXMgLgogICAgc2V0IG1hdGNoaW5nbGluZXMge30KICAgIGlmIHskZmluZGxvYyA9PSAiUGlja2F4ZSJ9IHsKCWZpbmRwYXRjaGVzCglyZXR1cm4KICAgIH0KICAgIGlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CglzZXQgZm91bmRzdHJpbmcgW3N0cmluZyB0b2xvd2VyICRmaW5kc3RyaW5nXQogICAgfSBlbHNlIHsKCXNldCBmb3VuZHN0cmluZyAkZmluZHN0cmluZwogICAgfQogICAgc2V0IGZvdW5kc3RybGVuIFtzdHJpbmcgbGVuZ3RoICRmaW5kc3RyaW5nXQogICAgaWYgeyRmb3VuZHN0cmxlbiA9PSAwfSByZXR1cm4KICAgIGlmIHskZmluZGxvYyA9PSAiRmlsZXMifSB7CglmaW5kZmlsZXMKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IG9sZHNlbCAtMQogICAgfSBlbHNlIHsKCXNldCBvbGRzZWwgJHNlbGVjdGVkbGluZQogICAgfQogICAgc2V0IGRpZHNlbCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50fQogICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJc2V0IGlkICRsaW5laWQoJGwpCglzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCglzZXQgZG9lc21hdGNoIDAKCWZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJICAgIGlmIHskZmluZGxvYyAhPSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgIT0gJHR5fSB7CgkJY29udGludWUKCSAgICB9CgkgICAgc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJICAgIGlmIHskbWF0Y2hlcyA9PSB7fX0gY29udGludWUKCSAgICBzZXQgZG9lc21hdGNoIDEKCSAgICBpZiB7JHR5ID09ICJIZWFkbGluZSJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQltYXJrbWF0Y2hlcyAkY2FudjIgJGwgJGYgJGxpbmVudGFnKCRsKSAkbWF0Y2hlcyAkbmFtZWZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJEYXRlIn0gewoJCW1hcmttYXRjaGVzICRjYW52MyAkbCAkZiAkbGluZWR0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0KCX0KCWlmIHskZG9lc21hdGNofSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgkgICAgaWYgeyEkZGlkc2VsICYmICRsID4gJG9sZHNlbH0gewoJCWZpbmRzZWxlY3RsaW5lICRsCgkJc2V0IGRpZHNlbCAxCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRtYXRjaGluZ2xpbmVzID09IHt9fSB7CgliZWxsCiAgICB9IGVsc2VpZiB7ISRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lIFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF0KICAgIH0KfQoKcHJvYyBmaW5kc2VsZWN0bGluZSB7bH0gewogICAgZ2xvYmFsIGZpbmRsb2MgY29tbWVudGVuZCBjdGV4dAogICAgc2VsZWN0bGluZSAkbCAxCiAgICBpZiB7JGZpbmRsb2MgPT0gIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jID09ICJDb21tZW50cyJ9IHsKCSMgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIGluIHRoZSBjb21tZW50cwoJc2V0IGYgWyRjdGV4dCBnZXQgMS4wICRjb21tZW50ZW5kXQoJc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CgkgICAgc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCgkgICAgc2V0IGVuZCBbZXhwciB7W2xpbmRleCAkbWF0Y2ggMV0gKyAxfV0KCSAgICAkY3RleHQgdGFnIGFkZCBmb3VuZCAiMS4wICsgJHN0YXJ0IGMiICIxLjAgKyAkZW5kIGMiCgl9CiAgICB9Cn0KCnByb2MgZmluZG5leHQge3Jlc3RhcnR9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWlmIHskcmVzdGFydH0gewoJICAgIGRvZmluZAoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPiAkc2VsZWN0ZWRsaW5lfSB7CgkgICAgZmluZHNlbGVjdGxpbmUgJGwKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGJlbGwKfQoKcHJvYyBmaW5kcHJldiB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7Cglkb2ZpbmQKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgcHJldiB7fQogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+PSAkc2VsZWN0ZWRsaW5lfSBicmVhawoJc2V0IHByZXYgJGwKICAgIH0KICAgIGlmIHskcHJldiAhPSB7fX0gewoJZmluZHNlbGVjdGxpbmUgJHByZXYKICAgIH0gZWxzZSB7CgliZWxsCiAgICB9Cn0KCnByb2MgZmluZGxvY2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGZpbmRsb2MgZmluZHR5cGUgZmluZHR5cGVtZW51CiAgICBpZiB7JGZpbmRsb2MgPT0gIlBpY2theGUifSB7CglzZXQgZmluZHR5cGUgRXhhY3QKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDEgLXN0YXRlICRzdGF0ZQogICAgJGZpbmR0eXBlbWVudSBlbnRyeWNvbmYgMiAtc3RhdGUgJHN0YXRlCn0KCnByb2Mgc3RvcGZpbmRwcm9jIHt7ZG9uZSAwfX0gewogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZSBmaW5kaWRzCiAgICBnbG9iYWwgY3RleHQgZmluZG9sZGN1cnNvciBwaGFzZSBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcwoKICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kcHJvY3BpZF19IHsKCWlmIHshJGRvbmV9IHsKCSAgICBjYXRjaCB7ZXhlYyBraWxsICRmaW5kcHJvY3BpZH0KCX0KCWNhdGNoIHtjbG9zZSAkZmluZHByb2NmaWxlfQoJdW5zZXQgZmluZHByb2NwaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZGlucHJvZ3Jlc3NdfSB7Cgl1bnNldCBmaW5kaW5wcm9ncmVzcwoJaWYgeyRwaGFzZSAhPSAiaW5jcmRyYXcifSB7CgkgICAgLiBjb25maWcgLWN1cnNvciAkbWFpbmN1cnNvcgoJICAgIHNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKCX0KICAgIH0KfQoKcHJvYyBmaW5kcGF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgZmluZHN0cmluZyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZQogICAgZ2xvYmFsIGZpbmRkaWRzZWwgY3RleHQgbGluZWlkIGZpbmRpbnByb2dyZXNzCiAgICBnbG9iYWwgZmluZGluc2VydHBvcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICAjIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgaWRzIHRvIHNlYXJjaCwgc3RhcnRpbmcgYXQgdGhlIG9uZQogICAgIyBhZnRlciB0aGUgc2VsZWN0ZWQgbGluZSAoaWYgYW55KQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCAkc2VsZWN0ZWRsaW5lCiAgICB9IGVsc2UgewoJc2V0IGwgLTEKICAgIH0KICAgIHNldCBpbnB1dGlkcyB7fQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnVtY29tbWl0c30ge2luY3IgaX0gewoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJYXBwZW5kIGlucHV0aWRzICRsaW5laWQoJGwpICJcbiIKICAgIH0KCiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1zIC1yIC1TJGZpbmRzdHJpbmcgXAoJCQkgPDwgJGlucHV0aWRzXSByXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBmaW5kcHJvY2ZpbGUgJGYKICAgIHNldCBmaW5kcHJvY3BpZCBbcGlkICRmXQogICAgZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmIHJlYWRhYmxlIHJlYWRmaW5kcHJvYwogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKfQoKcHJvYyByZWFkZmluZHByb2Mge30gewogICAgZ2xvYmFsIGZpbmRwcm9jZmlsZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgaWRsaW5lIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcwoKICAgIHNldCBuIFtnZXRzICRmaW5kcHJvY2ZpbGUgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRmaW5kcHJvY2ZpbGVdfSB7CgkgICAgc3RvcGZpbmRwcm9jIDEKCSAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgkJYmVsbAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZl17NDB9fSAkbGluZSBpZF19IHsKCWVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQtZGlmZi10cmVlIG91dHB1dDogJGxpbmUiCglzdG9wZmluZHByb2MKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglwdXRzIHN0ZGVyciAic3B1cmlvdXMgaWQ6ICRpZCIKCXJldHVybgogICAgfQogICAgc2V0IGwgJGlkbGluZSgkaWQpCiAgICBpbnNlcnRtYXRjaCAkbCAkaWQKfQoKcHJvYyBpbnNlcnRtYXRjaCB7bCBpZH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGluc2VydHBvcyBmaW5kZGlkc2VsCgogICAgaWYgeyRmaW5kaW5zZXJ0cG9zID09ICJlbmQifSB7CglpZiB7JG1hdGNoaW5nbGluZXMgIT0ge30gJiYgJGwgPCBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdfSB7CgkgICAgc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgMCAkbF0KCSAgICBzZXQgZmluZGluc2VydHBvcyAxCgl9IGVsc2UgewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJfQogICAgfSBlbHNlIHsKCXNldCBtYXRjaGluZ2xpbmVzIFtsaW5zZXJ0ICRtYXRjaGluZ2xpbmVzICRmaW5kaW5zZXJ0cG9zICRsXQoJaW5jciBmaW5kaW5zZXJ0cG9zCiAgICB9CiAgICBtYXJraGVhZGxpbmUgJGwgJGlkCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSAkbAoJc2V0IGZpbmRkaWRzZWwgMQogICAgfQp9Cgpwcm9jIGZpbmRmaWxlcyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMgbGluZWlkIGN0ZXh0CiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRkaWRzZWwgcGFyZW50cyBucGFyZW50cwogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzIGZpbmRzdGFydGxpbmUgZmluZGluc2VydHBvcwogICAgZ2xvYmFsIHRyZWVkaWZmcyBmZGlmZmlkcyBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgMX1dCiAgICB9IGVsc2UgewoJc2V0IGwgMAogICAgfQogICAgc2V0IGZmaWxlbGluZSAkbAogICAgc2V0IGZpbmRzdGFydGxpbmUgJGwKICAgIHNldCBkaWZmc25lZWRlZCB7fQogICAgc2V0IGZkaWZmc25lZWRlZCB7fQogICAgd2hpbGUgMSB7CglzZXQgaWQgJGxpbmVpZCgkbCkKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCQlpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoW2xpc3QgJGlkICRwXSldfSB7CgkJICAgIGFwcGVuZCBkaWZmc25lZWRlZCAiJGlkICRwXG4iCgkJICAgIGxhcHBlbmQgZmRpZmZzbmVlZGVkIFtsaXN0ICRpZCAkcF0KCQl9CgkgICAgfQoJfQoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawogICAgfQoKICAgICMgc3RhcnQgb2ZmIGEgZ2l0LWRpZmYtdHJlZSBwcm9jZXNzIGlmIG5lZWRlZAogICAgaWYgeyRkaWZmc25lZWRlZCBuZSB7fX0gewoJaWYge1tjYXRjaCB7CgkgICAgc2V0IGRmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtLXN0ZGluIDw8ICRkaWZmc25lZWRlZF0gcl0KCX0gZXJyIF19IHsKCSAgICBlcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCgkgICAgcmV0dXJuCgl9CgljYXRjaCB7dW5zZXQgZmRpZmZpZHN9CglzZXQgZmRpZmZwb3MgMAoJZmNvbmZpZ3VyZSAkZGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZGYgcmVhZGFibGUgW2xpc3QgcmVhZGZpbGVkaWZmcyAkZGZdCiAgICB9CgogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgc2V0IGZpbmRpbnNlcnRwb3MgZW5kCiAgICBzZXQgaWQgJGxpbmVpZCgkbCkKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAwXQogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgc2V0dGV4dGN1cnNvciB3YXRjaAogICAgc2V0IGZpbmRpbnByb2dyZXNzIDEKICAgIGZpbmRjb250IFtsaXN0ICRpZCAkcF0KICAgIHVwZGF0ZQp9Cgpwcm9jIHJlYWRmaWxlZGlmZnMge2RmfSB7CiAgICBnbG9iYWwgZmluZGlkcyBmZGlmZmlkcyBmZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRkZl19IHsKCSAgICBkb25lZmlsZWRpZmYKCSAgICBpZiB7W2NhdGNoIHtjbG9zZSAkZGZ9IGVycl19IHsKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkVycm9yIGluIGdpdC1kaWZmLXRyZWU6ICRlcnIiCgkgICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXX0gewoJCXNldCBpZHMgJGZpbmRpZHMKCQlzdG9wZmluZHByb2MKCQliZWxsCgkJZXJyb3JfcG9wdXAgIkNvdWxkbid0IGZpbmQgZGlmZnMgZm9yIHskaWRzfSIKCSAgICB9Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgXChmcm9tIChbMC05YS1mXXs0MH0pXCl9ICRsaW5lIG1hdGNoIGlkIHBdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IHN0cmluZyBvZiBkaWZmcwoJZG9uZWZpbGVkaWZmCglzZXQgZmRpZmZpZHMgW2xpc3QgJGlkICRwXQoJc2V0IGZkaWZmcyB7fQogICAgfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2ggIjoqIiAkbGluZV19IHsKCWxhcHBlbmQgZmRpZmZzIFtsaW5kZXggJGxpbmUgNV0KICAgIH0KfQoKcHJvYyBkb25lZmlsZWRpZmYge30gewogICAgZ2xvYmFsIGZkaWZmaWRzIGZkaWZmcyB0cmVlZGlmZnMgZmluZGlkcwogICAgZ2xvYmFsIGZkaWZmc25lZWRlZCBmZGlmZnBvcwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmRpZmZpZHNdfSB7Cgl3aGlsZSB7W2xpbmRleCAkZmRpZmZzbmVlZGVkICRmZGlmZnBvc10gbmUgJGZkaWZmaWRzCgkgICAgICAgJiYgJGZkaWZmcG9zIDwgW2xsZW5ndGggJGZkaWZmc25lZWRlZF19IHsKCSAgICAjIGdpdC1kaWZmLXRyZWUgZG9lc24ndCBvdXRwdXQgYW55dGhpbmcgZm9yIGEgY29tbWl0CgkgICAgIyB3aGljaCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZwoJICAgIHNldCBudWxsaWRzIFtsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdCgkgICAgc2V0IHRyZWVkaWZmcygkbnVsbGlkcykge30KCSAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpZHNdICYmICRudWxsaWRzIGVxICRmaW5kaWRzfSB7CgkJdW5zZXQgZmluZGlkcwoJCWZpbmRjb250ICRudWxsaWRzCgkgICAgfQoJICAgIGluY3IgZmRpZmZwb3MKCX0KCWluY3IgZmRpZmZwb3MKCglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGZkaWZmaWRzKV19IHsKCSAgICBzZXQgdHJlZWRpZmZzKCRmZGlmZmlkcykgJGZkaWZmcwoJfQoJaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkZmRpZmZpZHMgZXEgJGZpbmRpZHN9IHsKCSAgICB1bnNldCBmaW5kaWRzCgkgICAgZmluZGNvbnQgJGZkaWZmaWRzCgl9CiAgICB9Cn0KCnByb2MgZmluZGNvbnQge2lkc30gewogICAgZ2xvYmFsIGZpbmRpZHMgdHJlZWRpZmZzIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZHN0YXJ0bGluZSBmaW5kZGlkc2VsCiAgICBnbG9iYWwgbGluZWlkIG51bWNvbW1pdHMgbWF0Y2hpbmdsaW5lcyBmaW5kaW5wcm9ncmVzcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgc2V0IGlkIFtsaW5kZXggJGlkcyAwXQogICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCiAgICBzZXQgcGkgW2xzZWFyY2ggLWV4YWN0ICRwYXJlbnRzKCRpZCkgJHBdCiAgICBzZXQgbCAkZmZpbGVsaW5lCiAgICB3aGlsZSAxIHsKCWlmIHskZmluZG1lcmdlZmlsZXMgfHwgJG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCQlzZXQgZmluZGlkcyAkaWRzCgkJc2V0IGZmaWxlbGluZSAkbAoJCXJldHVybgoJICAgIH0KCSAgICBzZXQgZG9lc21hdGNoIDAKCSAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkJc2V0IHggW2ZpbmRtYXRjaGVzICRmXQoJCWlmIHskeCAhPSB7fX0gewoJCSAgICBzZXQgZG9lc21hdGNoIDEKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJICAgIGlmIHskZG9lc21hdGNofSB7CgkJaW5zZXJ0bWF0Y2ggJGwgJGlkCgkJc2V0IHBpICRucGFyZW50cygkaWQpCgkgICAgfQoJfSBlbHNlIHsKCSAgICBzZXQgcGkgJG5wYXJlbnRzKCRpZCkKCX0KCWlmIHtbaW5jciBwaV0gPj0gJG5wYXJlbnRzKCRpZCl9IHsKCSAgICBzZXQgcGkgMAoJICAgIGlmIHtbaW5jciBsXSA+PSAkbnVtY29tbWl0c30gewoJCXNldCBsIDAKCSAgICB9CgkgICAgaWYgeyRsID09ICRmaW5kc3RhcnRsaW5lfSBicmVhawoJICAgIHNldCBpZCAkbGluZWlkKCRsKQoJfQoJc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRwaV0KCXNldCBpZHMgW2xpc3QgJGlkICRwXQogICAgfQogICAgc3RvcGZpbmRwcm9jCiAgICBpZiB7ISRmaW5kZGlkc2VsfSB7CgliZWxsCiAgICB9Cn0KCiMgbWFyayBhIGNvbW1pdCBhcyBtYXRjaGluZyBieSBwdXR0aW5nIGEgeWVsbG93IGJhY2tncm91bmQKIyBiZWhpbmQgdGhlIGhlYWRsaW5lCnByb2MgbWFya2hlYWRsaW5lIHtsIGlkfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBsaW5laHRhZyBjb21taXRpbmZvCgogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdCAkYmJveCAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KICAgICRjYW52IGxvd2VyICR0Cn0KCiMgbWFyayB0aGUgYml0cyBvZiBhIGhlYWRsaW5lLCBhdXRob3Igb3IgZGF0ZSB0aGF0IG1hdGNoIGEgZmluZCBzdHJpbmcKcHJvYyBtYXJrbWF0Y2hlcyB7Y2FudiBsIHN0ciB0YWcgbWF0Y2hlcyBmb250fSB7CiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkdGFnXQogICAgc2V0IHgwIFtsaW5kZXggJGJib3ggMF0KICAgIHNldCB5MCBbbGluZGV4ICRiYm94IDFdCiAgICBzZXQgeTEgW2xpbmRleCAkYmJveCAzXQogICAgZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CglzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCXNldCBlbmQgW2xpbmRleCAkbWF0Y2ggMV0KCWlmIHskc3RhcnQgPiAkZW5kfSBjb250aW51ZQoJc2V0IHhvZmYgW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JHN0YXJ0LTF9XV1dCglzZXQgeGxlbiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskZW5kfV1dXQoJc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0IFtleHByIHskeDArJHhvZmZ9XSAkeTAgXAoJCSAgIFtleHByIHskeDArJHhsZW4rMn1dICR5MSBcCgkJICAgLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCgkkY2FudiBsb3dlciAkdAogICAgfQp9Cgpwcm9jIHVubWFya21hdGNoZXMge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgZmluZGlkcwogICAgYWxsY2FudnMgZGVsZXRlIG1hdGNoZXMKICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9Cn0KCnByb2Mgc2VsY2FudmxpbmUge3cgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52eTAgY3RleHQgbGluZXNwYwogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZyByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIHNldCBsICIuLi4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KICAgIH0KICAgIHJldHVybiAiJHAgKCRsKSIKfQoKIyBhcHBlbmQgc29tZSB0ZXh0IHRvIHRoZSBjdGV4dCB3aWRnZXQsIGFuZCBtYWtlIGFueSBTSEExIElECiMgdGhhdCB3ZSBrbm93IGFib3V0IGJlIGEgY2xpY2thYmxlIGxpbmsuCnByb2MgYXBwZW5kd2l0aGxpbmtzIHt0ZXh0fSB7CiAgICBnbG9iYWwgY3RleHQgaWRsaW5lIGxpbmtudW0KCiAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJHRleHQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KICAgIGZvcmVhY2ggbCAkbGlua3MgewoJc2V0IHMgW2xpbmRleCAkbCAwXQoJc2V0IGUgW2xpbmRleCAkbCAxXQoJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQoJaWYgeyFbaW5mbyBleGlzdHMgaWRsaW5lKCRsaW5raWQpXX0gY29udGludWUKCWluY3IgZQoJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGFkZCBsaW5rJGxpbmtudW0gIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gW2xpc3Qgc2VsZWN0bGluZSAkaWRsaW5lKCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyBzZWxlY3RsaW5lIHtsIGlzbmV3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4KICAgIGdsb2JhbCBjZmxpc3QgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzIGlkbGluZSBsaW5rbnVtCgogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICBub3JtYWxsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laWQoJGwpXSB8fCAhW2luZm8gZXhpc3RzIGxpbmVodGFnKCRsKV19IHJldHVybgogICAgJGNhbnYgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52IGxvd2VyICR0CiAgICAkY2FudjIgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYyIGNyZWF0ZSByZWN0IFskY2FudjIgYmJveCAkbGluZW50YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MiBsb3dlciAkdAogICAgJGNhbnYzIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MyBjcmVhdGUgcmVjdCBbJGNhbnYzIGJib3ggJGxpbmVkdGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjMgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjMgbG93ZXIgJHQKICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IHdib3QgW2V4cHIge1tsaW5kZXggJHdub3cgMV0gKiAkeW1heH1dCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzZWxlY3RsaW5lICRsIDBdCiAgICB9CgogICAgc2V0IHNlbGVjdGVkbGluZSAkbAoKICAgIHNldCBpZCAkbGluZWlkKCRsKQogICAgc2V0IGN1cnJlbnRpZCAkaWQKICAgICRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICAkc2hhMWVudHJ5IGluc2VydCAwICRpZAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gZnJvbSAwCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiB0byBlbmQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgIHNldCBsaW5rbnVtIDAKICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4wIDAuMAogICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4wIGxlZnQKICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQXV0aG9yOiBbbGluZGV4ICRpbmZvIDFdICAkZGF0ZVxuIgogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyA0XV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJDb21taXR0ZXI6IFtsaW5kZXggJGluZm8gM10gICRkYXRlXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlRhZ3M6IgoJZm9yZWFjaCB0YWcgJGlkdGFncygkaWQpIHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICR0YWciCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICB9CiAKICAgIHNldCBjb21tZW50IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGlkKV19IHsKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBhcHBlbmQgY29tbWVudCAiUGFyZW50OiBbY29tbWl0X2Rlc2NyaXB0b3IgJHBdXG4iCgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRpZCldfSB7Cglmb3JlYWNoIGMgJGNoaWxkcmVuKCRpZCkgewoJICAgIGFwcGVuZCBjb21tZW50ICJDaGlsZDogIFtjb21taXRfZGVzY3JpcHRvciAkY11cbiIKCX0KICAgIH0KICAgIGFwcGVuZCBjb21tZW50ICJcbiIKICAgIGFwcGVuZCBjb21tZW50IFtsaW5kZXggJGluZm8gNV0KCiAgICAjIG1ha2UgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgU0hBMSBJRCBiZSBhIGNsaWNrYWJsZSBsaW5rCiAgICBhcHBlbmR3aXRobGlua3MgJGNvbW1lbnQKCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgY29tbWVudGVuZCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgogICAgJGNmbGlzdCBkZWxldGUgMCBlbmQKICAgICRjZmxpc3QgaW5zZXJ0IGVuZCAiQ29tbWVudHMiCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPT0gMX0gewoJc3RhcnRkaWZmICRpZAogICAgfSBlbHNlaWYgeyRucGFyZW50cygkaWQpID4gMX0gewoJbWVyZ2VkaWZmICRpZAogICAgfQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyfV0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHVuc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCgogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGFsbGNhbnZzIGRlbGV0ZSBzZWNzZWwKfQoKcHJvYyBhZGR0b2hpc3Rvcnkge2NtZH0gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAwCgkmJiBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXSA9PSAkY21kfSB7CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGhpc3RvcnkgW2xyZXBsYWNlICRoaXN0b3J5ICRoaXN0b3J5aW5kZXggZW5kICRjbWRdCiAgICB9IGVsc2UgewoJbGFwcGVuZCBoaXN0b3J5ICRjbWQKICAgIH0KICAgIGluY3IgaGlzdG9yeWluZGV4CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0gZWxzZSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KICAgIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBnb2JhY2sge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CglpbmNyIGhpc3RvcnlpbmRleCAtMQoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXQoJZXZhbCAkY21kCgkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPD0gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgZ29mb3J3IHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgJGhpc3RvcnlpbmRleF0KCWluY3IgaGlzdG9yeWluZGV4CglldmFsICRjbWQKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4ID49IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIG1lcmdlZGlmZiB7aWR9IHsKICAgIGdsb2JhbCBwYXJlbnRzIGRpZmZtZXJnZWlkIGRpZmZtZXJnZWdjYSBtZXJnZWZpbGVsaXN0IGRpZmZwaW5kZXgKCiAgICBzZXQgZGlmZm1lcmdlaWQgJGlkCiAgICBzZXQgZGlmZnBpbmRleCAtMQogICAgc2V0IGRpZmZtZXJnZWdjYSBbZmluZGdjYSAkcGFyZW50cygkaWQpXQogICAgaWYge1tpbmZvIGV4aXN0cyBtZXJnZWZpbGVsaXN0KCRpZCldfSB7CglpZiB7JG1lcmdlZmlsZWxpc3QoJGlkKSBuZSB7fX0gewoJICAgIHNob3dtZXJnZWRpZmYKCX0KICAgIH0gZWxzZSB7Cgljb250bWVyZ2VkaWZmIHt9CiAgICB9Cn0KCnByb2MgZmluZGdjYSB7aWRzfSB7CiAgICBzZXQgZ2NhIHt9CiAgICBmb3JlYWNoIGlkICRpZHMgewoJaWYgeyRnY2EgZXEge319IHsKCSAgICBzZXQgZ2NhICRpZAoJfSBlbHNlIHsKCSAgICBpZiB7W2NhdGNoIHsKCQlzZXQgZ2NhIFtleGVjIGdpdC1tZXJnZS1iYXNlICRnY2EgJGlkXQoJICAgIH0gZXJyXX0gewoJCXJldHVybiB7fQoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkZ2NhCn0KCnByb2MgY29udG1lcmdlZGlmZiB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZnBpbmRleCBwYXJlbnRzIG5wYXJlbnRzIGRpZmZtZXJnZWdjYQogICAgZ2xvYmFsIHRyZWVkaWZmcyBtZXJnZWZpbGVsaXN0IGRpZmZpZHMgdHJlZXBlbmRpbmcKCiAgICAjIGRpZmYgdGhlIGNoaWxkIGFnYWluc3QgZWFjaCBvZiB0aGUgcGFyZW50cywgYW5kIGRpZmYKICAgICMgZWFjaCBvZiB0aGUgcGFyZW50cyBhZ2FpbnN0IHRoZSBHQ0EuCiAgICB3aGlsZSAxIHsKCWlmIHtbbGluZGV4ICRpZHMgMV0gPT0gJGRpZmZtZXJnZWlkICYmICRkaWZmbWVyZ2VnY2EgbmUge319IHsKCSAgICBzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VnY2EgW2xpbmRleCAkaWRzIDBdXQoJfSBlbHNlIHsKCSAgICBpZiB7W2luY3IgZGlmZnBpbmRleF0gPj0gJG5wYXJlbnRzKCRkaWZmbWVyZ2VpZCl9IGJyZWFrCgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpICRkaWZmcGluZGV4XQoJICAgIHNldCBpZHMgW2xpc3QgJHAgJGRpZmZtZXJnZWlkXQoJfQoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJICAgIHNldCBkaWZmaWRzICRpZHMKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCQlnZXR0cmVlZGlmZnMgJGlkcwoJICAgIH0KCSAgICByZXR1cm4KCX0KICAgIH0KCiAgICAjIElmIGEgZmlsZSBpbiBzb21lIHBhcmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY2hpbGQgYW5kIGFsc28KICAgICMgZGlmZmVyZW50IGZyb20gdGhlIEdDQSwgdGhlbiBpdCdzIGludGVyZXN0aW5nLgogICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgR0NBLCB0aGVuIGEgZmlsZSBpcyBpbnRlcmVzdGluZyBpZiBpdCBpcwogICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgY2hpbGQgaW4gYWxsIHRoZSBwYXJlbnRzLgogICAgaWYgeyRkaWZmbWVyZ2VnY2EgbmUge319IHsKCXNldCBmaWxlcyB7fQoJZm9yZWFjaCBwICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgewoJICAgIHNldCBnY2FkaWZmcyAkdHJlZWRpZmZzKFtsaXN0ICRkaWZmbWVyZ2VnY2EgJHBdKQoJICAgIGZvcmVhY2ggZiAkdHJlZWRpZmZzKFtsaXN0ICRwICRkaWZmbWVyZ2VpZF0pIHsKCQlpZiB7W2xzZWFyY2ggLWV4YWN0ICRmaWxlcyAkZl0gPCAwCgkJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkZ2NhZGlmZnMgJGZdID49IDB9IHsKCQkgICAgbGFwcGVuZCBmaWxlcyAkZgoJCX0KCSAgICB9Cgl9CglzZXQgZmlsZXMgW2xzb3J0ICRmaWxlc10KICAgIH0gZWxzZSB7CglzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgMF0KCXNldCBmaWxlcyAkdHJlZWRpZmZzKFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0pCglmb3Ige3NldCBpIDF9IHskaSA8ICRucGFyZW50cygkZGlmZm1lcmdlaWQpICYmICRmaWxlcyBuZSB7fX0ge2luY3IgaX0gewoJICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAkaV0KCSAgICBzZXQgZGYgJHRyZWVkaWZmcyhbbGlzdCAkcCAkZGlmZm1lcmdlaWRdKQoJICAgIHNldCBuZiB7fQoJICAgIGZvcmVhY2ggZiAkZmlsZXMgewoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGRmICRmXSA+PSAwfSB7CgkJICAgIGxhcHBlbmQgbmYgJGYKCQl9CgkgICAgfQoJICAgIHNldCBmaWxlcyAkbmYKCX0KICAgIH0KCiAgICBzZXQgbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpICRmaWxlcwogICAgaWYgeyRmaWxlcyBuZSB7fX0gewoJc2hvd21lcmdlZGlmZgogICAgfQp9Cgpwcm9jIHNob3dtZXJnZWRpZmYge30gewogICAgZ2xvYmFsIGNmbGlzdCBkaWZmbWVyZ2VpZCBtZXJnZWZpbGVsaXN0IHBhcmVudHMKICAgIGdsb2JhbCBkaWZmb3B0cyBkaWZmaW5odW5rIGN1cnJlbnRmaWxlIGN1cnJlbnRodW5rIGZpbGVsaW5lcwogICAgZ2xvYmFsIGRpZmZibG9ja2VkIGdyb3VwZmlsZWxhc3QgbWVyZ2VmZHMgZ3JvdXBmaWxlbnVtIGdyb3VwaHVua3MKCiAgICBzZXQgZmlsZXMgJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKQogICAgZm9yZWFjaCBmICRmaWxlcyB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGYKICAgIH0KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgZmxpc3Qge30KICAgIGNhdGNoIHt1bnNldCBjdXJyZW50ZmlsZX0KICAgIGNhdGNoIHt1bnNldCBjdXJyZW50aHVua30KICAgIGNhdGNoIHt1bnNldCBmaWxlbGluZXN9CiAgICBjYXRjaCB7dW5zZXQgZ3JvdXBmaWxlbnVtfQogICAgY2F0Y2gge3Vuc2V0IGdyb3VwaHVua3N9CiAgICBzZXQgZ3JvdXBmaWxlbGFzdCAtMQogICAgZm9yZWFjaCBwICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgewoJc2V0IGNtZCBbbGlzdCB8IGdpdC1kaWZmLXRyZWUgLXAgJHAgJGRpZmZtZXJnZWlkXQoJc2V0IGNtZCBbY29uY2F0ICRjbWQgJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KCWlmIHtbY2F0Y2gge3NldCBmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCSAgICBlcnJvcl9wb3B1cCAiRXJyb3IgZ2V0dGluZyBkaWZmczogJGVyciIKCSAgICBmb3JlYWNoIGYgJGZsaXN0IHsKCQljYXRjaCB7Y2xvc2UgJGZ9CgkgICAgfQoJICAgIHJldHVybgoJfQoJbGFwcGVuZCBmbGlzdCAkZgoJc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCglzZXQgbWVyZ2VmZHMoJGlkcykgJGYKCXNldCBkaWZmaW5odW5rKCRpZHMpIDAKCXNldCBkaWZmYmxvY2tlZCgkaWRzKSAwCglmY29uZmlndXJlICRmIC1ibG9ja2luZyAwCglmaWxlZXZlbnQgJGYgcmVhZGFibGUgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkZiAkaWRzICRkaWZmbWVyZ2VpZF0KICAgIH0KfQoKcHJvYyBnZXRtZXJnZWRpZmZsaW5lIHtmIGlkcyBpZH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZpbmh1bmsgZGlmZm9sZGxpbmVzIGRpZmZuZXdsaW5lcwogICAgZ2xvYmFsIGN1cnJlbnRmaWxlIGN1cnJlbnRodW5rCiAgICBnbG9iYWwgZGlmZm9sZHN0YXJ0IGRpZmZuZXdzdGFydCBkaWZmb2xkbG5vIGRpZmZuZXdsbm8KICAgIGdsb2JhbCBkaWZmYmxvY2tlZCBtZXJnZWZpbGVsaXN0CiAgICBnbG9iYWwgbm9sZGxpbmVzIG5uZXdsaW5lcyBkaWZmbGNvdW50cyBmaWxlbGluZXMKCiAgICBzZXQgbiBbZ2V0cyAkZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRmXX0gcmV0dXJuCiAgICB9CgogICAgaWYgeyEoW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXSAmJiAkZGlmZm1lcmdlaWQgPT0gJGlkKX0gewoJaWYgeyRuIDwgMH0gewoJICAgIGNsb3NlICRmCgl9CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGRpZmZpbmh1bmsoJGlkcykgIT0gMH0gewoJc2V0IGZpICRjdXJyZW50ZmlsZSgkaWRzKQoJaWYgeyRuID4gMCAmJiBbcmVnZXhwIHteWy0rIFxcXX0gJGxpbmUgbWF0Y2hdfSB7CgkgICAgIyBjb250aW51aW5nIGFuIGV4aXN0aW5nIGh1bmsKCSAgICBzZXQgbGluZSBbc3RyaW5nIHJhbmdlICRsaW5lIDEgZW5kXQoJICAgIHNldCBwIFtsaW5kZXggJGlkcyAxXQoJICAgIGlmIHskbWF0Y2ggZXEgIi0iIHx8ICRtYXRjaCBlcSAiICJ9IHsKCQlzZXQgZmlsZWxpbmVzKCRwLCRmaSwkZGlmZm9sZGxubygkaWRzKSkgJGxpbmUKCQlpbmNyIGRpZmZvbGRsbm8oJGlkcykKCSAgICB9CgkgICAgaWYgeyRtYXRjaCBlcSAiKyIgfHwgJG1hdGNoIGVxICIgIn0gewoJCXNldCBmaWxlbGluZXMoJGlkLCRmaSwkZGlmZm5ld2xubygkaWRzKSkgJGxpbmUKCQlpbmNyIGRpZmZuZXdsbm8oJGlkcykKCSAgICB9CgkgICAgaWYgeyRtYXRjaCBlcSAiICJ9IHsKCQlpZiB7JGRpZmZpbmh1bmsoJGlkcykgPT0gMn0gewoJCSAgICBsYXBwZW5kIGRpZmZsY291bnRzKCRpZHMpIFwKCQkJW2xpc3QgJG5vbGRsaW5lcygkaWRzKSAkbm5ld2xpbmVzKCRpZHMpXQoJCSAgICBzZXQgbm9sZGxpbmVzKCRpZHMpIDAKCQkgICAgc2V0IGRpZmZpbmh1bmsoJGlkcykgMQoJCX0KCQlpbmNyIG5vbGRsaW5lcygkaWRzKQoJICAgIH0gZWxzZWlmIHskbWF0Y2ggZXEgIi0iIHx8ICRtYXRjaCBlcSAiKyJ9IHsKCQlpZiB7JGRpZmZpbmh1bmsoJGlkcykgPT0gMX0gewoJCSAgICBsYXBwZW5kIGRpZmZsY291bnRzKCRpZHMpIFtsaXN0ICRub2xkbGluZXMoJGlkcyldCgkJICAgIHNldCBub2xkbGluZXMoJGlkcykgMAoJCSAgICBzZXQgbm5ld2xpbmVzKCRpZHMpIDAKCQkgICAgc2V0IGRpZmZpbmh1bmsoJGlkcykgMgoJCX0KCQlpZiB7JG1hdGNoIGVxICItIn0gewoJCSAgICBpbmNyIG5vbGRsaW5lcygkaWRzKQoJCX0gZWxzZSB7CgkJICAgIGluY3Igbm5ld2xpbmVzKCRpZHMpCgkJfQoJICAgIH0KCSAgICAjIGFuZCBpZiBpdCdzIFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgbGluZSwgdGhlbiB3aGF0PwoJICAgIHJldHVybgoJfQoJIyBlbmQgb2YgYSBodW5rCglpZiB7JGRpZmZpbmh1bmsoJGlkcykgPT0gMSAmJiAkbm9sZGxpbmVzKCRpZHMpICE9IDB9IHsKCSAgICBsYXBwZW5kIGRpZmZsY291bnRzKCRpZHMpIFtsaXN0ICRub2xkbGluZXMoJGlkcyldCgl9IGVsc2VpZiB7JGRpZmZpbmh1bmsoJGlkcykgPT0gMgoJCSAgJiYgKCRub2xkbGluZXMoJGlkcykgIT0gMCB8fCAkbm5ld2xpbmVzKCRpZHMpICE9IDApfSB7CgkgICAgbGFwcGVuZCBkaWZmbGNvdW50cygkaWRzKSBbbGlzdCAkbm9sZGxpbmVzKCRpZHMpICRubmV3bGluZXMoJGlkcyldCgl9CglzZXQgY3VycmVudGh1bmsoJGlkcykgW2xpc3QgJGN1cnJlbnRmaWxlKCRpZHMpIFwKCQkJCSAgICRkaWZmb2xkc3RhcnQoJGlkcykgJGRpZmZuZXdzdGFydCgkaWRzKSBcCgkJCQkgICAkZGlmZm9sZGxubygkaWRzKSAkZGlmZm5ld2xubygkaWRzKSBcCgkJCQkgICAkZGlmZmxjb3VudHMoJGlkcyldCglzZXQgZGlmZmluaHVuaygkaWRzKSAwCgkjIC0xID0gbmVlZCB0byBibG9jaywgMCA9IHVuYmxvY2tlZCwgMSA9IGlzIGJsb2NrZWQKCXNldCBkaWZmYmxvY2tlZCgkaWRzKSAtMQoJcHJvY2Vzc2h1bmtzCglpZiB7JGRpZmZibG9ja2VkKCRpZHMpID09IC0xfSB7CgkgICAgZmlsZWV2ZW50ICRmIHJlYWRhYmxlIHt9CgkgICAgc2V0IGRpZmZibG9ja2VkKCRpZHMpIDEKCX0KICAgIH0KCiAgICBpZiB7JG4gPCAwfSB7CgkjIGVvZgoJaWYgeyEkZGlmZmJsb2NrZWQoJGlkcyl9IHsKCSAgICBjbG9zZSAkZgoJICAgIHNldCBjdXJyZW50ZmlsZSgkaWRzKSBbbGxlbmd0aCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQoJICAgIHNldCBjdXJyZW50aHVuaygkaWRzKSBbbGlzdCAkY3VycmVudGZpbGUoJGlkcykgMCAwIDAgMCB7fV0KCSAgICBwcm9jZXNzaHVua3MKCX0KICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi99ICRsaW5lIG1hdGNoIGZuYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCglzZXQgY3VycmVudGZpbGUoJGlkcykgXAoJICAgIFtsc2VhcmNoIC1leGFjdCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpICRmbmFtZV0KICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteQEAgLShbMC05XSspLChbMC05XSspIFwrKFswLTldKyksKFswLTldKykgQEAoLiopfSBcCgkJICAgJGxpbmUgbWF0Y2ggZjFsIGYxYyBmMmwgZjJjIHJlc3RdfSB7CglpZiB7W2luZm8gZXhpc3RzIGN1cnJlbnRmaWxlKCRpZHMpXSAmJiAkY3VycmVudGZpbGUoJGlkcykgPj0gMH0gewoJICAgICMgc3RhcnQgb2YgYSBuZXcgaHVuawoJICAgIGlmIHskZjFsID09IDAgJiYgJGYxYyA9PSAwfSB7CgkJc2V0IGYxbCAxCgkgICAgfQoJICAgIGlmIHskZjJsID09IDAgJiYgJGYyYyA9PSAwfSB7CgkJc2V0IGYybCAxCgkgICAgfQoJICAgIHNldCBkaWZmaW5odW5rKCRpZHMpIDEKCSAgICBzZXQgZGlmZm9sZHN0YXJ0KCRpZHMpICRmMWwKCSAgICBzZXQgZGlmZm5ld3N0YXJ0KCRpZHMpICRmMmwKCSAgICBzZXQgZGlmZm9sZGxubygkaWRzKSAkZjFsCgkgICAgc2V0IGRpZmZuZXdsbm8oJGlkcykgJGYybAoJICAgIHNldCBkaWZmbGNvdW50cygkaWRzKSB7fQoJICAgIHNldCBub2xkbGluZXMoJGlkcykgMAoJICAgIHNldCBubmV3bGluZXMoJGlkcykgMAoJfQogICAgfQp9Cgpwcm9jIHByb2Nlc3NodW5rcyB7fSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgcGFyZW50cyBucGFyZW50cyBjdXJyZW50aHVuawogICAgZ2xvYmFsIG1lcmdlZmlsZWxpc3QgZGlmZmJsb2NrZWQgbWVyZ2VmZHMKICAgIGdsb2JhbCBncm91cGh1bmtzIGdyb3VwbGluZXN0YXJ0IGdyb3VwbGluZWVuZCBncm91cGZpbGVudW0KCiAgICBzZXQgbmZpbGVzIFtsbGVuZ3RoICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCiAgICB3aGlsZSAxIHsKCXNldCBmaSAkbmZpbGVzCglzZXQgbG5vIDAKCSMgbG9vayBmb3IgdGhlIGVhcmxpZXN0IGh1bmsKCWZvcmVhY2ggcCAkcGFyZW50cygkZGlmZm1lcmdlaWQpIHsKCSAgICBzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aHVuaygkaWRzKV19IHJldHVybgoJICAgIHNldCBpIFtsaW5kZXggJGN1cnJlbnRodW5rKCRpZHMpIDBdCgkgICAgc2V0IGwgW2xpbmRleCAkY3VycmVudGh1bmsoJGlkcykgMl0KCSAgICBpZiB7JGkgPCAkZmkgfHwgKCRpID09ICRmaSAmJiAkbCA8ICRsbm8pfSB7CgkJc2V0IGZpICRpCgkJc2V0IGxubyAkbAoJCXNldCBwaSAkcAoJICAgIH0KCX0KCglpZiB7JGZpIDwgJG5maWxlc30gewoJICAgIHNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwaV0KCSAgICBzZXQgaHVuayAkY3VycmVudGh1bmsoJGlkcykKCSAgICB1bnNldCBjdXJyZW50aHVuaygkaWRzKQoJICAgIGlmIHskZGlmZmJsb2NrZWQoJGlkcykgPiAwfSB7CgkJZmlsZWV2ZW50ICRtZXJnZWZkcygkaWRzKSByZWFkYWJsZSBcCgkJICAgIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1lcmdlZmRzKCRpZHMpICRpZHMgJGRpZmZtZXJnZWlkXQoJICAgIH0KCSAgICBzZXQgZGlmZmJsb2NrZWQoJGlkcykgMAoKCSAgICBpZiB7W2luZm8gZXhpc3RzIGdyb3VwZmlsZW51bV0gJiYgJGdyb3VwZmlsZW51bSA9PSAkZmkKCQkmJiAkbG5vIDw9ICRncm91cGxpbmVlbmR9IHsKCQkjIGFkZCB0aGlzIGh1bmsgdG8gdGhlIHBlbmRpbmcgZ3JvdXAKCQlsYXBwZW5kIGdyb3VwaHVua3MoJHBpKSAkaHVuawoJCXNldCBlbmRsbiBbbGluZGV4ICRodW5rIDRdCgkJaWYgeyRlbmRsbiA+ICRncm91cGxpbmVlbmR9IHsKCQkgICAgc2V0IGdyb3VwbGluZWVuZCAkZW5kbG4KCQl9CgkJY29udGludWUKCSAgICB9Cgl9CgoJIyBzdWNjZWVkaW5nIHN0dWZmIGRvZXNuJ3QgYmVsb25nIGluIHRoaXMgZ3JvdXAsIHNvCgkjIHByb2Nlc3MgdGhlIGdyb3VwIG5vdwoJaWYge1tpbmZvIGV4aXN0cyBncm91cGZpbGVudW1dfSB7CgkgICAgcHJvY2Vzc2dyb3VwCgkgICAgdW5zZXQgZ3JvdXBmaWxlbnVtCgkgICAgdW5zZXQgZ3JvdXBodW5rcwoJfQoKCWlmIHskZmkgPj0gJG5maWxlc30gYnJlYWsKCgkjIHN0YXJ0IGEgbmV3IGdyb3VwCglzZXQgZ3JvdXBmaWxlbnVtICRmaQoJc2V0IGdyb3VwaHVua3MoJHBpKSBbbGlzdCAkaHVua10KCXNldCBncm91cGxpbmVzdGFydCAkbG5vCglzZXQgZ3JvdXBsaW5lZW5kIFtsaW5kZXggJGh1bmsgNF0KICAgIH0KfQoKcHJvYyBwcm9jZXNzZ3JvdXAge30gewogICAgZ2xvYmFsIGdyb3VwZmlsZWxhc3QgZ3JvdXBmaWxlbnVtIGRpZmZmaWxlc3RhcnQKICAgIGdsb2JhbCBtZXJnZWZpbGVsaXN0IGRpZmZtZXJnZWlkIGN0ZXh0IGZpbGVsaW5lcwogICAgZ2xvYmFsIHBhcmVudHMgZGlmZm1lcmdlaWQgZGlmZm9mZnNldAogICAgZ2xvYmFsIGdyb3VwaHVua3MgZ3JvdXBsaW5lc3RhcnQgZ3JvdXBsaW5lZW5kIG5wYXJlbnRzCiAgICBnbG9iYWwgbWVyZ2VtYXgKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBzZXQgaWQgJGRpZmZtZXJnZWlkCiAgICBzZXQgZiAkZ3JvdXBmaWxlbnVtCiAgICBpZiB7JGdyb3VwZmlsZWxhc3QgIT0gJGZ9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCXNldCBkaWZmZmlsZXN0YXJ0KCRmKSAkaGVyZQoJc2V0IG1hcmsgZm1hcmsuW2V4cHIgeyRmICsgMX1dCgkkY3RleHQgbWFyayBzZXQgJG1hcmsgJGhlcmUKCSRjdGV4dCBtYXJrIGdyYXZpdHkgJG1hcmsgbGVmdAoJc2V0IGhlYWRlciBbbGluZGV4ICRtZXJnZWZpbGVsaXN0KCRpZCkgJGZdCglzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGhlYWRlcl0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkaGVhZGVyICRwYWRcbiIgZmlsZXNlcAoJc2V0IGdyb3VwZmlsZWxhc3QgJGYKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBzZXQgZGlmZm9mZnNldCgkcCkgMAoJfQogICAgfQoKICAgICRjdGV4dCBpbnNlcnQgZW5kICJAQCIgbXNlcAogICAgc2V0IG5saW5lcyBbZXhwciB7JGdyb3VwbGluZWVuZCAtICRncm91cGxpbmVzdGFydH1dCiAgICBzZXQgZXZlbnRzIHt9CiAgICBzZXQgcG51bSAwCiAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CglzZXQgc3RhcnRsaW5lIFtleHByIHskZ3JvdXBsaW5lc3RhcnQgKyAkZGlmZm9mZnNldCgkcCl9XQoJc2V0IG9sICRzdGFydGxpbmUKCXNldCBubCAkZ3JvdXBsaW5lc3RhcnQKCWlmIHtbaW5mbyBleGlzdHMgZ3JvdXBodW5rcygkcCldfSB7CgkgICAgZm9yZWFjaCBoICRncm91cGh1bmtzKCRwKSB7CgkJc2V0IGwgW2xpbmRleCAkaCAyXQoJCWlmIHskbmwgPCAkbH0gewoJCSAgICBmb3Ige30geyRubCA8ICRsfSB7aW5jciBubH0gewoJCQlzZXQgZmlsZWxpbmVzKCRwLCRmLCRvbCkgJGZpbGVsaW5lcygkaWQsJGYsJG5sKQoJCQlpbmNyIG9sCgkJICAgIH0KCQl9CgkJZm9yZWFjaCBjaHVuayBbbGluZGV4ICRoIDVdIHsKCQkgICAgaWYge1tsbGVuZ3RoICRjaHVua10gPT0gMn0gewoJCQlzZXQgb2xjIFtsaW5kZXggJGNodW5rIDBdCgkJCXNldCBubGMgW2xpbmRleCAkY2h1bmsgMV0KCQkJc2V0IG5ubCBbZXhwciB7JG5sICsgJG5sY31dCgkJCWxhcHBlbmQgZXZlbnRzIFtsaXN0ICRubCAkbm5sICRwbnVtICRvbGMgJG5sY10KCQkJaW5jciBvbCAkb2xjCgkJCXNldCBubCAkbm5sCgkJICAgIH0gZWxzZSB7CgkJCWluY3Igb2wgW2xpbmRleCAkY2h1bmsgMF0KCQkJaW5jciBubCBbbGluZGV4ICRjaHVuayAwXQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHskbmwgPCAkZ3JvdXBsaW5lZW5kfSB7CgkgICAgZm9yIHt9IHskbmwgPCAkZ3JvdXBsaW5lZW5kfSB7aW5jciBubH0gewoJCXNldCBmaWxlbGluZXMoJHAsJGYsJG9sKSAkZmlsZWxpbmVzKCRpZCwkZiwkbmwpCgkJaW5jciBvbAoJICAgIH0KCX0KCXNldCBubGluZXMgW2V4cHIgeyRvbCAtICRzdGFydGxpbmV9XQoJJGN0ZXh0IGluc2VydCBlbmQgIiAtJHN0YXJ0bGluZSwkbmxpbmVzIiBtc2VwCglpbmNyIHBudW0KICAgIH0KCiAgICBzZXQgbmxpbmVzIFtleHByIHskZ3JvdXBsaW5lZW5kIC0gJGdyb3VwbGluZXN0YXJ0fV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICIgKyRncm91cGxpbmVzdGFydCwkbmxpbmVzIEBAXG4iIG1zZXAKCiAgICBzZXQgZXZlbnRzIFtsc29ydCAtaW50ZWdlciAtaW5kZXggMCAkZXZlbnRzXQogICAgc2V0IG5ldmVudHMgW2xsZW5ndGggJGV2ZW50c10KICAgIHNldCBubWVyZ2UgJG5wYXJlbnRzKCRkaWZmbWVyZ2VpZCkKICAgIHNldCBsICRncm91cGxpbmVzdGFydAogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbmV2ZW50c30ge3NldCBpICRqfSB7CglzZXQgbmwgW2xpbmRleCAkZXZlbnRzICRpIDBdCgl3aGlsZSB7JGwgPCAkbmx9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIgoJICAgIGluY3IgbAoJfQoJc2V0IGUgW2xpbmRleCAkZXZlbnRzICRpXQoJc2V0IGVubCBbbGluZGV4ICRlIDFdCglzZXQgaiAkaQoJc2V0IGFjdGl2ZSB7fQoJd2hpbGUgMSB7CgkgICAgc2V0IHBudW0gW2xpbmRleCAkZSAyXQoJICAgIHNldCBvbGMgW2xpbmRleCAkZSAzXQoJICAgIHNldCBubGMgW2xpbmRleCAkZSA0XQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV19IHsKCQlzZXQgZGVsdGEoJHBudW0pIFtleHByIHskb2xjIC0gJG5sY31dCgkJbGFwcGVuZCBhY3RpdmUgJHBudW0KCSAgICB9IGVsc2UgewoJCWluY3IgZGVsdGEoJHBudW0pIFtleHByIHskb2xjIC0gJG5sY31dCgkgICAgfQoJICAgIGlmIHtbaW5jciBqXSA+PSAkbmV2ZW50c30gYnJlYWsKCSAgICBzZXQgZSBbbGluZGV4ICRldmVudHMgJGpdCgkgICAgaWYge1tsaW5kZXggJGUgMF0gPj0gJGVubH0gYnJlYWsKCSAgICBpZiB7W2xpbmRleCAkZSAxXSA+ICRlbmx9IHsKCQlzZXQgZW5sIFtsaW5kZXggJGUgMV0KCSAgICB9Cgl9CglzZXQgbmxjIFtleHByIHskZW5sIC0gJGx9XQoJc2V0IG5jb2wgbXJlc3VsdAoJc2V0IGJlc3RwbiAtMQoJaWYge1tsbGVuZ3RoICRhY3RpdmVdID09ICRubWVyZ2UgLSAxfSB7CgkgICAgIyBubyBkaWZmIGZvciBvbmUgb2YgdGhlIHBhcmVudHMsIGkuZS4gaXQncyBpZGVudGljYWwKCSAgICBmb3Ige3NldCBwbnVtIDB9IHskcG51bSA8ICRubWVyZ2V9IHtpbmNyIHBudW19IHsKCQlpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldfSB7CgkJICAgIGlmIHskcG51bSA8ICRtZXJnZW1heH0gewoJCQlsYXBwZW5kIG5jb2wgbSRwbnVtCgkJICAgIH0gZWxzZSB7CgkJCWxhcHBlbmQgbmNvbCBtbWF4CgkJICAgIH0KCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfSBlbHNlaWYge1tsbGVuZ3RoICRhY3RpdmVdID09ICRubWVyZ2V9IHsKCSAgICAjIGFsbCBwYXJlbnRzIGFyZSBkaWZmZXJlbnQsIHNlZSBpZiBvbmUgaXMgdmVyeSBzaW1pbGFyCgkgICAgc2V0IGJlc3RzaW0gMzAKCSAgICBmb3Ige3NldCBwbnVtIDB9IHskcG51bSA8ICRubWVyZ2V9IHtpbmNyIHBudW19IHsKCQlzZXQgc2ltIFtzaW1pbGFyaXR5ICRwbnVtICRsICRubGMgJGYgXAoJCQkgICAgIFtscmFuZ2UgJGV2ZW50cyAkaSBbZXhwciB7JGotMX1dXV0KCQlpZiB7JHNpbSA+ICRiZXN0c2ltfSB7CgkJICAgIHNldCBiZXN0c2ltICRzaW0KCQkgICAgc2V0IGJlc3RwbiAkcG51bQoJCX0KCSAgICB9CgkgICAgaWYgeyRiZXN0cG4gPj0gMH0gewoJCWxhcHBlbmQgbmNvbCBtJGJlc3RwbgoJICAgIH0KCX0KCXNldCBwbnVtIC0xCglmb3JlYWNoIHAgJHBhcmVudHMoJGlkKSB7CgkgICAgaW5jciBwbnVtCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXSB8fCAkcG51bSA9PSAkYmVzdHBufSBjb250aW51ZQoJICAgIHNldCBvbGMgW2V4cHIgeyRubGMgKyAkZGVsdGEoJHBudW0pfV0KCSAgICBzZXQgb2wgW2V4cHIgeyRsICsgJGRpZmZvZmZzZXQoJHApfV0KCSAgICBpbmNyIGRpZmZvZmZzZXQoJHApICRkZWx0YSgkcG51bSkKCSAgICB1bnNldCBkZWx0YSgkcG51bSkKCSAgICBmb3Ige30geyRvbGMgPiAwfSB7aW5jciBvbGMgLTF9IHsKCQkkY3RleHQgaW5zZXJ0IGVuZCAiLSRmaWxlbGluZXMoJHAsJGYsJG9sKVxuIiBtJHBudW0KCQlpbmNyIG9sCgkgICAgfQoJfQoJc2V0IGVuZGwgW2V4cHIgeyRsICsgJG5sY31dCglpZiB7JGJlc3RwbiA+PSAwfSB7CgkgICAgIyBzaG93IHRoaXMgcHJldHR5IG11Y2ggYXMgYSBub3JtYWwgZGlmZgoJICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkYmVzdHBuXQoJICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQoJICAgIGluY3IgZGlmZm9mZnNldCgkcCkgJGRlbHRhKCRiZXN0cG4pCgkgICAgdW5zZXQgZGVsdGEoJGJlc3RwbikKCSAgICBmb3Ige3NldCBrICRpfSB7JGsgPCAkan0ge2luY3Iga30gewoJCXNldCBlIFtsaW5kZXggJGV2ZW50cyAka10KCQlpZiB7W2xpbmRleCAkZSAyXSAhPSAkYmVzdHBufSBjb250aW51ZQoJCXNldCBubCBbbGluZGV4ICRlIDBdCgkJc2V0IG9sIFtleHByIHskb2wgKyAkbmwgLSAkbH1dCgkJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiKyRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIiAkbmNvbAoJCX0KCQlzZXQgYyBbbGluZGV4ICRlIDNdCgkJZm9yIHt9IHskYyA+IDB9IHtpbmNyIGMgLTF9IHsKCQkgICAgJGN0ZXh0IGluc2VydCBlbmQgIi0kZmlsZWxpbmVzKCRwLCRmLCRvbClcbiIgbSRiZXN0cG4KCQkgICAgaW5jciBvbAoJCX0KCQlzZXQgbmwgW2xpbmRleCAkZSAxXQoJCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCQkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiskZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIgbXJlc3VsdAoJCX0KCSAgICB9Cgl9Cglmb3Ige30geyRsIDwgJGVuZGx9IHtpbmNyIGx9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiKyRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIiAkbmNvbAoJfQogICAgfQogICAgd2hpbGUgeyRsIDwgJGdyb3VwbGluZWVuZH0gewoJJGN0ZXh0IGluc2VydCBlbmQgIiAkZmlsZWxpbmVzKCRpZCwkZiwkbClcbiIKCWluY3IgbAogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2Mgc2ltaWxhcml0eSB7cG51bSBsIG5sYyBmIGV2ZW50c30gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIHBhcmVudHMgZGlmZm9mZnNldCBmaWxlbGluZXMKCiAgICBzZXQgaWQgJGRpZmZtZXJnZWlkCiAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRpZCkgJHBudW1dCiAgICBzZXQgb2wgW2V4cHIgeyRsICsgJGRpZmZvZmZzZXQoJHApfV0KICAgIHNldCBlbmRsIFtleHByIHskbCArICRubGN9XQogICAgc2V0IHNhbWUgMAogICAgc2V0IGRpZmYgMAogICAgZm9yZWFjaCBlICRldmVudHMgewoJaWYge1tsaW5kZXggJGUgMl0gIT0gJHBudW19IGNvbnRpbnVlCglzZXQgbmwgW2xpbmRleCAkZSAwXQoJc2V0IG9sIFtleHByIHskb2wgKyAkbmwgLSAkbH1dCglmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkgICAgaW5jciBzYW1lIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCSAgICBpbmNyIHNhbWUKCX0KCXNldCBvYyBbbGluZGV4ICRlIDNdCglmb3Ige30geyRvYyA+IDB9IHtpbmNyIG9jIC0xfSB7CgkgICAgaW5jciBkaWZmIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJHAsJGYsJG9sKV0KCSAgICBpbmNyIGRpZmYKCSAgICBpbmNyIG9sCgl9CglzZXQgbmwgW2xpbmRleCAkZSAxXQoJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJICAgIGluY3IgZGlmZiBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRpZCwkZiwkbCldCgkgICAgaW5jciBkaWZmCgl9CiAgICB9CiAgICBmb3Ige30geyRsIDwgJGVuZGx9IHtpbmNyIGx9IHsKCWluY3Igc2FtZSBbc3RyaW5nIGxlbmd0aCAkZmlsZWxpbmVzKCRpZCwkZiwkbCldCglpbmNyIHNhbWUKICAgIH0KICAgIGlmIHskc2FtZSA9PSAwfSB7CglyZXR1cm4gMAogICAgfQogICAgcmV0dXJuIFtleHByIHsyMDAgKiAkc2FtZSAvICgyICogJHNhbWUgKyAkZGlmZil9XQp9Cgpwcm9jIHN0YXJ0ZGlmZiB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGRpZmZpZHMgdHJlZXBlbmRpbmcgZGlmZm1lcmdlaWQKCiAgICBzZXQgZGlmZmlkcyAkaWRzCiAgICBjYXRjaCB7dW5zZXQgZGlmZm1lcmdlaWR9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCSAgICBnZXR0cmVlZGlmZnMgJGlkcwoJfQogICAgfSBlbHNlIHsKCWFkZHRvY2ZsaXN0ICRpZHMKICAgIH0KfQoKcHJvYyBhZGR0b2NmbGlzdCB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGNmbGlzdAogICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoJGlkcykgewoJJGNmbGlzdCBpbnNlcnQgZW5kICRmCiAgICB9CiAgICBnZXRibG9iZGlmZnMgJGlkcwp9Cgpwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgcGFyZW50cyB0cmVlcGVuZGluZwogICAgc2V0IHRyZWVwZW5kaW5nICRpZHMKICAgIHNldCB0cmVlZGlmZiB7fQogICAgaWYgW2NhdGNoIHtzZXQgZ2R0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0LWRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtciAkaWRzXSByXX1dIHJldHVybgogICAgZmNvbmZpZ3VyZSAkZ2R0ZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRnZHRmIHJlYWRhYmxlIFtsaXN0IGdldHRyZWVkaWZmbGluZSAkZ2R0ZiAkaWRzXQp9Cgpwcm9jIGdldHRyZWVkaWZmbGluZSB7Z2R0ZiBpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiB0cmVlZGlmZnMgdHJlZXBlbmRpbmcgZGlmZmlkcyBkaWZmbWVyZ2VpZAoKICAgIHNldCBuIFtnZXRzICRnZHRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGdkdGZdfSByZXR1cm4KCWNsb3NlICRnZHRmCglzZXQgdHJlZWRpZmZzKCRpZHMpICR0cmVlZGlmZgoJdW5zZXQgdHJlZXBlbmRpbmcKCWlmIHskaWRzICE9ICRkaWZmaWRzfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgl9IGVsc2UgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CgkJY29udG1lcmdlZGlmZiAkaWRzCgkgICAgfSBlbHNlIHsKCQlhZGR0b2NmbGlzdCAkaWRzCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBzZXQgZmlsZSBbbGluZGV4ICRsaW5lIDVdCiAgICBsYXBwZW5kIHRyZWVkaWZmICRmaWxlCn0KCnByb2MgZ2V0YmxvYmRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmb3B0cyBibG9iZGlmZmZkIGRpZmZpZHMgZW52IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQtZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yIC1wIC1DICRpZHNdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZuZXh0aGVhZCBkaWZmbmV4dG5vdGUgZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBuIFtnZXRzICRiZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRiZGZdfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCglzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGhlYWRlciAkbmV3bmFtZQoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRmbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkgICAgaW5jciBpCgkgICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkgICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0Cgl9CglpZiB7JG5ld25hbWUgIT0gJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRuZXduYW1lXQoJICAgIGlmIHskaSA+PSAwfSB7CgkJc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkJaW5jciBpCgkJJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0CgkgICAgfQoJfQoJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgoJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZGlmZmluaGRyIDEKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteKC0tLXxcK1wrXCspfSAkbGluZV19IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZCR0YWcKCX0gZWxzZWlmIHskeCA9PSAiICJ9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKCX0gZWxzZWlmIHskZGlmZmluaGRyIHx8ICR4ID09ICJcXCJ9IHsKCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfSBlbHNlIHsKCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJCXNldCBjdXJkaWZmdGFnIENvbW1lbnRzCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgfQp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3Ige3NldCBpIDB9IHtbaW5mbyBleGlzdHMgZGlmZmZpbGVzdGFydCgkaSldfSB7aW5jciBpfSB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA+ICRoZXJlXX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHBvc10KCQl8fCBbJGN0ZXh0IGNvbXBhcmUgJGRpZmZmaWxlc3RhcnQoJGkpIDwgJHBvc119IHsKCQlzZXQgcG9zICRkaWZmZmlsZXN0YXJ0KCRpKQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgcG9zXX0gewoJJGN0ZXh0IHl2aWV3ICRwb3MKICAgIH0KfQoKcHJvYyBsaXN0Ym94c2VsIHt9IHsKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QgY3VycmVudGlkCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBzZWwgW2xzb3J0IFskY2ZsaXN0IGN1cnNlbGVjdGlvbl1dCiAgICBpZiB7JHNlbCBlcSB7fX0gcmV0dXJuCiAgICBzZXQgZmlyc3QgW2xpbmRleCAkc2VsIDBdCiAgICBjYXRjaCB7JGN0ZXh0IHl2aWV3IGZtYXJrLiRmaXJzdH0KfQoKcHJvYyBzZXRjb29yZHMge30gewogICAgZ2xvYmFsIGxpbmVzcGMgY2hhcnNwYyBjYW52eDAgY2FudnkwIG1haW5mb250CiAgICBnbG9iYWwgeHNwYzEgeHNwYzIgbHRoaWNrbmVzcwoKICAgIHNldCBsaW5lc3BjIFtmb250IG1ldHJpY3MgJG1haW5mb250IC1saW5lc3BhY2VdCiAgICBzZXQgY2hhcnNwYyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAibSJdCiAgICBzZXQgY2FudnkwIFtleHByIHszICsgMC41ICogJGxpbmVzcGN9XQogICAgc2V0IGNhbnZ4MCBbZXhwciB7MyArIDAuNSAqICRsaW5lc3BjfV0KICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgc2V0IHhzcGMxKDApICRsaW5lc3BjCiAgICBzZXQgeHNwYzIgJGxpbmVzcGMKfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIHBoYXNlCiAgICBpZiB7JHN0b3BwZWQgPiAxfSByZXR1cm4KICAgIGlmIHskcGhhc2UgPT0gImdldGNvbW1pdHMifSByZXR1cm4KICAgIHNldCByZWRpc3BsYXlpbmcgMQogICAgaWYgeyRwaGFzZSA9PSAiZHJhd2dyYXBoIiB8fCAkcGhhc2UgPT0gImluY3JkcmF3In0gewoJc2V0IHN0b3BwZWQgMQogICAgfSBlbHNlIHsKCWRyYXdncmFwaAogICAgfQp9Cgpwcm9jIGluY3Jmb250IHtpbmN9IHsKICAgIGdsb2JhbCBtYWluZm9udCBuYW1lZm9udCB0ZXh0Zm9udCBjdGV4dCBjYW52IHBoYXNlCiAgICBnbG9iYWwgc3RvcHBlZCBlbnRyaWVzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbWFpbmZvbnQgW2xyZXBsYWNlICRtYWluZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG1haW5mb250IDFdICsgJGluY31dXQogICAgc2V0IG5hbWVmb250IFtscmVwbGFjZSAkbmFtZWZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRuYW1lZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgkkZSBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHsKCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIHJlZGlzcGxheQp9Cgpwcm9jIGNsZWFyc2hhMSB7fSB7CiAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hhMXN0cmluZ10gPT0gNDB9IHsKCSRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICB9Cn0KCnByb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBzaGExYnV0CiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1skc2hhMWJ1dCBjZ2V0IC1zdGF0ZV0gPT0gJHN0YXRlfSByZXR1cm4KICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIG5vcm1hbCAtcmVsaWVmIHJhaXNlZCAtdGV4dCAiR290bzogIgogICAgfSBlbHNlIHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgogICAgfQp9Cgpwcm9jIGdvdG9jb21taXQge30gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIGlkbGluZSB0YWdpZHMKICAgIGdsb2JhbCBsaW5laWQgbnVtY29tbWl0cwoKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGxpbmVpZCgkbCldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkbGluZWlkKCRsKQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpIDEKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWciCiAgICB9CiAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgp9Cgpwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjb21taXRpbmZvIGNhbnYKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSByZXR1cm4KICAgIHNldCBob3ZlcnggJHgKICAgIHNldCBob3ZlcnkgJHkKICAgIHNldCBob3ZlcmlkICRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCiAgICB9CiAgICBzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgICRjYW52IGRlbGV0ZSBob3Zlcgp9Cgpwcm9jIGxpbmVtb3Rpb24ge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCXNldCBob3ZlcnggJHgKCXNldCBob3ZlcnkgJHkKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCX0KCXNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgfQp9Cgpwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKICAgIGdsb2JhbCBob3ZlcmlkIGhvdmVydGltZXIgY2FudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CgkkY2FudiBkZWxldGUgaG92ZXIKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCSAgICB1bnNldCBob3ZlcnRpbWVyCgl9Cgl1bnNldCBob3ZlcmlkCiAgICB9Cn0KCnByb2MgbGluZWhvdmVyIHt9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBtYWluZm9udAoKICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHggW2V4cHIgeyRob3ZlcnggKyAyICogJGxpbmVzcGN9XQogICAgc2V0IHkgW2V4cHIgeyRob3ZlcnkgKyAkeWZyYWMgKiAkeW1heCAtICRsaW5lc3BjIC8gMn1dCiAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MCBbZXhwciB7JHkgLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHgxIFtleHByIHskeCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XSArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0YW5nbGUgJHgwICR5MCAkeDEgJHkxIFwKCSAgICAgICAtZmlsbCBcI2ZmZmY4MCAtb3V0bGluZSBibGFjayAtd2lkdGggMSAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHggJHkgLWFuY2hvciBudyAtdGV4dCAkdGV4dCAtdGFncyBob3ZlciAtZm9udCAkbWFpbmZvbnRdCiAgICAkY2FudiByYWlzZSAkdAp9Cgpwcm9jIGNsaWNraXNvbmFycm93IHtpZCB5fSB7CiAgICBnbG9iYWwgbWFpbmxpbmUgbWFpbmxpbmVhcnJvdyBzaWRlbGluZXMgbHRoaWNrbmVzcwoKICAgIHNldCB0aHJlc2ggW2V4cHIgezIgKiAkbHRoaWNrbmVzcyArIDZ9XQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJaWYgeyRtYWlubGluZWFycm93KCRpZCkgbmUgIm5vbmUifSB7CgkgICAgaWYge2FicyhbbGluZGV4ICRtYWlubGluZSgkaWQpIDFdIC0gJHkpIDwgJHRocmVzaH0gewoJCXJldHVybiAidXAiCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCWZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCSAgICBzZXQgY29vcmRzIFtsaW5kZXggJGxzIDBdCgkgICAgc2V0IGFycm93IFtsaW5kZXggJGxzIDJdCgkgICAgaWYgeyRhcnJvdyBlcSAiZmlyc3QiIHx8ICRhcnJvdyBlcSAiYm90aCJ9IHsKCQlpZiB7YWJzKFtsaW5kZXggJGNvb3JkcyAxXSAtICR5KSA8ICR0aHJlc2h9IHsKCQkgICAgcmV0dXJuICJ1cCIKCQl9CgkgICAgfQoJICAgIGlmIHskYXJyb3cgZXEgImxhc3QiIHx8ICRhcnJvdyBlcSAiYm90aCJ9IHsKCQlpZiB7YWJzKFtsaW5kZXggJGNvb3JkcyBlbmRdIC0gJHkpIDwgJHRocmVzaH0gewoJCSAgICByZXR1cm4gImRvd24iCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiB7fQp9Cgpwcm9jIGFycm93anVtcCB7aWQgZGlybiB5fSB7CiAgICBnbG9iYWwgbWFpbmxpbmUgc2lkZWxpbmVzIGNhbnYgY2FudjIgY2FudjMKCiAgICBzZXQgeXQge30KICAgIGlmIHskZGlybiBlcSAiZG93biJ9IHsKCWlmIHtbaW5mbyBleGlzdHMgbWFpbmxpbmUoJGlkKV19IHsKCSAgICBzZXQgeTEgW2xpbmRleCAkbWFpbmxpbmUoJGlkKSAxXQoJICAgIGlmIHskeTEgPiAkeX0gewoJCXNldCB5dCAkeTEKCSAgICB9Cgl9CglpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJICAgIGZvcmVhY2ggbHMgJHNpZGVsaW5lcygkaWQpIHsKCQlzZXQgeTEgW2xpbmRleCAkbHMgMCAxXQoJCWlmIHskeTEgPiAkeSAmJiAoJHl0IGVxIHt9IHx8ICR5MSA8ICR5dCl9IHsKCQkgICAgc2V0IHl0ICR5MQoJCX0KCSAgICB9Cgl9CiAgICB9IGVsc2UgewoJaWYge1tpbmZvIGV4aXN0cyBzaWRlbGluZXMoJGlkKV19IHsKCSAgICBmb3JlYWNoIGxzICRzaWRlbGluZXMoJGlkKSB7CgkJc2V0IHkxIFtsaW5kZXggJGxzIDAgZW5kXQoJCWlmIHskeTEgPCAkeSAmJiAoJHl0IGVxIHt9IHx8ICR5MSA+ICR5dCl9IHsKCQkgICAgc2V0IHl0ICR5MQoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JHl0IGVxIHt9fSByZXR1cm4KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA8PSAwfSByZXR1cm4KICAgIHNldCB2aWV3IFskY2FudiB5dmlld10KICAgIHNldCB5c3BhbiBbZXhwciB7W2xpbmRleCAkdmlldyAxXSAtIFtsaW5kZXggJHZpZXcgMF19XQogICAgc2V0IHlmcmFjIFtleHByIHskeXQgLyAkeW1heCAtICR5c3BhbiAvIDJ9XQogICAgaWYgeyR5ZnJhYyA8IDB9IHsKCXNldCB5ZnJhYyAwCiAgICB9CiAgICAkY2FudiB5dmlldyBtb3ZldG8gJHlmcmFjCiAgICAkY2FudjIgeXZpZXcgbW92ZXRvICR5ZnJhYwogICAgJGNhbnYzIHl2aWV3IG1vdmV0byAkeWZyYWMKfQoKcHJvYyBsaW5lY2xpY2sge3ggeSBpZCBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdGluZm8gY2hpbGRyZW4gY2ZsaXN0IGNhbnYgdGhpY2tlcmxpbmUKCiAgICB1bm1hcmttYXRjaGVzCiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgIyBkcmF3IHRoaXMgbGluZSB0aGlja2VyIHRoYW4gbm9ybWFsCiAgICBkcmF3bGluZXMgJGlkIDEgMQogICAgc2V0IHRoaWNrZXJsaW5lICRpZAogICAgaWYgeyRpc25ld30gewoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJaWYgeyR5bWF4IGVxIHt9fSByZXR1cm4KCXNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KCXNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIH0KICAgIHNldCBkaXJuIFtjbGlja2lzb25hcnJvdyAkaWQgJHldCiAgICBpZiB7JGRpcm4gbmUge319IHsKCWFycm93anVtcCAkaWQgJGRpcm4gJHkKCXJldHVybgogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBsaW5lY2xpY2sgJHggJHkgJGlkIDBdCiAgICB9CiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkaWRdCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0JGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJcbkNoaWxkcmVuOiIKCXNldCBpIDAKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgIGluY3IgaQoJICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRjaGlsZCkKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdCIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAkY2hpbGQgW2xpc3QgbGluayBsaW5rJGldCgkgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmskaSA8MT4gW2xpc3Qgc2VsYnlpZCAkY2hpbGRdCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXSIKCSAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0RGF0ZTpcdCRkYXRlXG4iCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAp9Cgpwcm9jIG5vcm1hbGxpbmUge30gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXX0gewoJZHJhd2xpbmVzICR0aGlja2VybGluZSAwIDEKCXVuc2V0IHRoaWNrZXJsaW5lCiAgICB9Cn0KCnByb2Mgc2VsYnlpZCB7aWR9IHsKICAgIGdsb2JhbCBpZGxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglzZWxlY3RsaW5lICRpZGxpbmUoJGlkKSAxCiAgICB9Cn0KCnByb2MgbXN0aW1lIHt9IHsKICAgIGdsb2JhbCBzdGFydG1zdGltZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc3RhcnRtc3RpbWVdfSB7CglzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiUuM2YiIFtleHByIHsoW2Nsb2NrIGNsaWNrIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXN0aW1lKSAvIDEwMDAuMH1dXQp9Cgpwcm9jIHJvd21lbnUge3ggeSBpZH0gewogICAgZ2xvYmFsIHJvd2N0eG1lbnUgaWRsaW5lIHNlbGVjdGVkbGluZSByb3dtZW51aWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICRpZGxpbmUoJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAwIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMiAtc3RhdGUgJHN0YXRlCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKfQoKcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKICAgIGdsb2JhbCByb3dtZW51aWQgc2VsZWN0ZWRsaW5lIGxpbmVpZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyRkaXJufSB7CglzZXQgb2xkaWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQoJc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIH0gZWxzZSB7CglzZXQgb2xkaWQgJHJvd21lbnVpZAoJc2V0IG5ld2lkICRsaW5laWQoJHNlbGVjdGVkbGluZSkKICAgIH0KICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KICAgIGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkCn0KCnByb2MgZG9zZWxkaWZmIHtvbGRpZCBuZXdpZH0gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdAogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY3RleHQgZGVsZXRlIDAuMCBlbmQKICAgICRjdGV4dCBtYXJrIHNldCBmbWFyay4wIDAuMAogICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4wIGxlZnQKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIlRvcCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJGcm9tICIKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkb2xkaWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkb2xkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cblRvICAgIgogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsxIDwxPiBbbGlzdCBzZWxieWlkICRuZXdpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRuZXdpZCBbbGlzdCBsaW5rIGxpbmsxXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgIHN0YXJ0ZGlmZiBbbGlzdCAkb2xkaWQgJG5ld2lkXQp9Cgpwcm9jIG1rcGF0Y2gge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJyZW50aWQgY29tbWl0aW5mbyBwYXRjaHRvcCBwYXRjaG51bQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRpZF19IHJldHVybgogICAgc2V0IG9sZGlkICRjdXJyZW50aWQKICAgIHNldCBvbGRoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgc2V0IG5ld2lkICRyb3dtZW51aWQKICAgIHNldCBuZXdoZWFkIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgc2V0IHRvcCAucGF0Y2gKICAgIHNldCBwYXRjaHRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiR2VuZXJhdGUgcGF0Y2giCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mcm9tIC10ZXh0ICJGcm9tOiIKICAgIGVudHJ5ICR0b3AuZnJvbXNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9tc2hhMSBpbnNlcnQgMCAkb2xkaWQKICAgICR0b3AuZnJvbXNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5mcm9tICR0b3AuZnJvbXNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmZyb21oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbWhlYWQgaW5zZXJ0IDAgJG9sZGhlYWQKICAgICR0b3AuZnJvbWhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmZyb21oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50byAtdGV4dCAiVG86IgogICAgZW50cnkgJHRvcC50b3NoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b3NoYTEgaW5zZXJ0IDAgJG5ld2lkCiAgICAkdG9wLnRvc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLnRvICR0b3AudG9zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC50b2hlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC50b2hlYWQgaW5zZXJ0IDAgJG5ld2hlYWQKICAgICR0b3AudG9oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC50b2hlYWQgLXN0aWNreSB3CiAgICBidXR0b24gJHRvcC5yZXYgLXRleHQgIlJldmVyc2UiIC1jb21tYW5kIG1rcGF0Y2hyZXYgLXBhZHggNQogICAgZ3JpZCAkdG9wLnJldiB4IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAicGF0Y2gkcGF0Y2hudW0ucGF0Y2giXQogICAgaW5jciBwYXRjaG51bQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkdlbmVyYXRlIiAtY29tbWFuZCBta3BhdGNoZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rcGF0Y2hjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIG1rcGF0Y2hyZXYge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG9sZGhlYWQgWyRwYXRjaHRvcC5mcm9taGVhZCBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IG5ld2hlYWQgWyRwYXRjaHRvcC50b2hlYWQgZ2V0XQogICAgZm9yZWFjaCBlIFtsaXN0IGZyb21zaGExIGZyb21oZWFkIHRvc2hhMSB0b2hlYWRdIFwKCSAgICB2IFtsaXN0ICRuZXdpZCAkbmV3aGVhZCAkb2xkaWQgJG9sZGhlYWRdIHsKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSBub3JtYWwKCSRwYXRjaHRvcC4kZSBkZWxldGUgMCBlbmQKCSRwYXRjaHRvcC4kZSBpbnNlcnQgMCAkdgoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICB9Cn0KCnByb2MgbWtwYXRjaGdvIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgZm5hbWUgWyRwYXRjaHRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIGdpdC1kaWZmLXRyZWUgLXAgJG9sZGlkICRuZXdpZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyBwYXRjaDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWtwYXRjaGNhbiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rdGFnIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgbWt0YWd0b3AgY29tbWl0aW5mbwoKICAgIHNldCB0b3AgLm1ha2V0YWcKICAgIHNldCBta3RhZ3RvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiQ3JlYXRlIHRhZyIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC50bGFiIC10ZXh0ICJUYWcgbmFtZToiCiAgICBlbnRyeSAkdG9wLnRhZyAtd2lkdGggNjAKICAgIGdyaWQgJHRvcC50bGFiICR0b3AudGFnIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBta3RhZ2dvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3RhZ2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnRhZwp9Cgpwcm9jIGRvbWt0YWcge30gewogICAgZ2xvYmFsIG1rdGFndG9wIGVudiB0YWdpZHMgaWR0YWdzCgogICAgc2V0IGlkIFskbWt0YWd0b3Auc2hhMSBnZXRdCiAgICBzZXQgdGFnIFskbWt0YWd0b3AudGFnIGdldF0KICAgIGlmIHskdGFnID09IHt9fSB7CgllcnJvcl9wb3B1cCAiTm8gdGFnIG5hbWUgc3BlY2lmaWVkIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkdGFnKV19IHsKCWVycm9yX3BvcHVwICJUYWcgXCIkdGFnXCIgYWxyZWFkeSBleGlzdHMiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbY2F0Y2ggewoJc2V0IGRpciBbZ2l0ZGlyXQoJc2V0IGZuYW1lIFtmaWxlIGpvaW4gJGRpciAicmVmcy90YWdzIiAkdGFnXQoJc2V0IGYgW29wZW4gJGZuYW1lIHddCglwdXRzICRmICRpZAoJY2xvc2UgJGYKICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHRhZzogJGVyciIKCXJldHVybgogICAgfQoKICAgIHNldCB0YWdpZHMoJHRhZykgJGlkCiAgICBsYXBwZW5kIGlkdGFncygkaWQpICR0YWcKICAgIHJlZHJhd3RhZ3MgJGlkCn0KCnByb2MgcmVkcmF3dGFncyB7aWR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIGlkbGluZSBpZHBvcyBzZWxlY3RlZGxpbmUKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHJldHVybgogICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKICAgIHNldCB4dCBbZXZhbCBkcmF3dGFncyAkaWQgJGlkcG9zKCRpZCldCiAgICAkY2FudiBjb29yZHMgJGxpbmVodGFnKCRpZGxpbmUoJGlkKSkgJHh0IFtsaW5kZXggJGlkcG9zKCRpZCkgMl0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID09ICRpZGxpbmUoJGlkKX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBta3RhZ2NhbiB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkbWt0YWd0b3B9CiAgICB1bnNldCBta3RhZ3RvcAp9Cgpwcm9jIG1rdGFnZ28ge30gewogICAgZG9ta3RhZwogICAgbWt0YWdjYW4KfQoKcHJvYyB3cml0ZWNvbW1pdCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHdyY29tdG9wIGNvbW1pdGluZm8gd3Jjb21jbWQKCiAgICBzZXQgdG9wIC53cml0ZWNvbW1pdAogICAgc2V0IHdyY29tdG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJXcml0ZSBjb21taXQgdG8gZmlsZSIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmhlYWQgaW5zZXJ0IDAgW2xpbmRleCAkY29tbWl0aW5mbygkcm93bWVudWlkKSAwXQogICAgJHRvcC5oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5oZWFkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5jbGFiIC10ZXh0ICJDb21tYW5kOiIKICAgIGVudHJ5ICR0b3AuY21kIC13aWR0aCA2MCAtdGV4dHZhcmlhYmxlIHdyY29tY21kCiAgICBncmlkICR0b3AuY2xhYiAkdG9wLmNtZCAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJjb21taXQtW3N0cmluZyByYW5nZSAkcm93bWVudWlkIDAgNl0iXQogICAgZ3JpZCAkdG9wLmZsYWIgJHRvcC5mbmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIldyaXRlIiAtY29tbWFuZCB3cmNvbWdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCB3cmNvbWNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2Mgd3Jjb21nbyB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBzZXQgaWQgWyR3cmNvbXRvcC5zaGExIGdldF0KICAgIHNldCBjbWQgImVjaG8gJGlkIHwgWyR3cmNvbXRvcC5jbWQgZ2V0XSIKICAgIHNldCBmbmFtZSBbJHdyY29tdG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgJGNtZCA+JGZuYW1lICZ9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciB3cml0aW5nIGNvbW1pdDogJGVyciIKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2Mgd3Jjb21jYW4ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyBsaXN0cmVmcyB7aWR9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCB4IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IHggJGlkdGFncygkaWQpCiAgICB9CiAgICBzZXQgeSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeSAkaWRoZWFkcygkaWQpCiAgICB9CiAgICBzZXQgeiB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHogJGlkb3RoZXJyZWZzKCRpZCkKICAgIH0KICAgIHJldHVybiBbbGlzdCAkeCAkeSAkel0KfQoKcHJvYyByZXJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIHRhZ2lkcyBoZWFkaWRzIG90aGVycmVmaWRzCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICByZWFkcmVmcwogICAgc2V0IHJlZmlkcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRyZWZpZHMgW2FycmF5IG5hbWVzIGlkdGFnc10gXAoJCQlbYXJyYXkgbmFtZXMgaWRoZWFkc10gW2FycmF5IG5hbWVzIGlkb3RoZXJyZWZzXV1dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJc2V0IHYgW2xpc3RyZWZzICRpZF0KCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXSB8fCAkcmVmKCRpZCkgIT0gJHZ9IHsKCSAgICByZWRyYXd0YWdzICRpZAoJfQogICAgfQp9Cgpwcm9jIHNob3d0YWcge3RhZyBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNmbGlzdCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgc2V0IGxpbmtudW0gMAogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCXNldCB0ZXh0ICR0YWdjb250ZW50cygkdGFnKQogICAgfSBlbHNlIHsKCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAp9Cgpwcm9jIGRvcXVpdCB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZAogICAgc2V0IHN0b3BwZWQgMTAwCiAgICBkZXN0cm95IC4KfQoKcHJvYyBkb3ByZWZzIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBmaW5kbWVyZ2VmaWxlcwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wCgogICAgc2V0IHRvcCAuZ2l0a3ByZWZzCiAgICBzZXQgcHJlZnN0b3AgJHRvcAogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgZm9yZWFjaCB2IHttYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBmaW5kbWVyZ2VmaWxlc30gewoJc2V0IG9sZHByZWZzKCR2KSBbc2V0ICR2XQogICAgfQogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAiR2l0ayBwcmVmZXJlbmNlcyIKICAgIGxhYmVsICR0b3AubGRpc3AgLXRleHQgIkNvbW1pdCBsaXN0IGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5sZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5zcGFjZXIgLXRleHQgIiAiCiAgICBsYWJlbCAkdG9wLm1heHdpZHRobCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAobGluZXMpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4d2lkdGggLWZyb20gMCAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4d2lkdGgKICAgIGdyaWQgJHRvcC5zcGFjZXIgJHRvcC5tYXh3aWR0aGwgJHRvcC5tYXh3aWR0aCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AubWF4cGN0bCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAoJSBvZiBwYW5lKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHBjdCAtZnJvbSAxIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXhncmFwaHBjdAogICAgZ3JpZCB4ICR0b3AubWF4cGN0bCAkdG9wLm1heHBjdCAtc3RpY2t5IHcKICAgIGNoZWNrYnV0dG9uICR0b3AuZmluZG0gLXZhcmlhYmxlIGZpbmRtZXJnZWZpbGVzCiAgICBsYWJlbCAkdG9wLmZpbmRtbCAtdGV4dCAiSW5jbHVkZSBtZXJnZXMgZm9yIFwiRmluZFwiIGluIFwiRmlsZXNcIiIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgZ3JpZCAkdG9wLmZpbmRtICR0b3AuZmluZG1sIC0gLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmRkaXNwIC10ZXh0ICJEaWZmIGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5kZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5kaWZmb3B0bCAtdGV4dCAiT3B0aW9ucyBmb3IgZGlmZiBwcm9ncmFtIiBcCgktZm9udCBvcHRpb25mb250CiAgICBlbnRyeSAkdG9wLmRpZmZvcHQgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgZGlmZm9wdHMKICAgIGdyaWQgeCAkdG9wLmRpZmZvcHRsICR0b3AuZGlmZm9wdCAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5vayAtdGV4dCAiT0siIC1jb21tYW5kIHByZWZzb2sKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHByZWZzY2FuCiAgICBncmlkICR0b3AuYnV0cy5vayAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLSAtcGFkeSAxMCAtc3RpY2t5IGV3Cn0KCnByb2MgcHJlZnNjYW4ge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIGZpbmRtZXJnZWZpbGVzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3AKCiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIGZpbmRtZXJnZWZpbGVzfSB7CglzZXQgJHYgJG9sZHByZWZzKCR2KQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKfQoKcHJvYyBwcmVmc29rIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKICAgIGlmIHskbWF4d2lkdGggIT0gJG9sZHByZWZzKG1heHdpZHRoKQoJfHwgJG1heGdyYXBocGN0ICE9ICRvbGRwcmVmcyhtYXhncmFwaHBjdCl9IHsKCXJlZGlzcGxheQogICAgfQp9Cgpwcm9jIGZvcm1hdGRhdGUge2R9IHsKICAgIHJldHVybiBbY2xvY2sgZm9ybWF0ICRkIC1mb3JtYXQgIiVZLSVtLSVkICVIOiVNOiVTIl0KfQoKIyBUaGlzIGxpc3Qgb2YgZW5jb2RpbmcgbmFtZXMgYW5kIGFsaWFzZXMgaXMgZGlzdGlsbGVkIGZyb20KIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzLgojIE5vdCBhbGwgb2YgdGhlbSBhcmUgc3VwcG9ydGVkIGJ5IFRjbC4Kc2V0IGVuY29kaW5nX2FsaWFzZXMgewogICAgeyBBTlNJX1gzLjQtMTk2OCBpc28taXItNiBBTlNJX1gzLjQtMTk4NiBJU09fNjQ2LmlydjoxOTkxIEFTQ0lJCiAgICAgIElTTzY0Ni1VUyBVUy1BU0NJSSB1cyBJQk0zNjcgY3AzNjcgY3NBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1VVEYtMSBjc0lTTzEwNjQ2VVRGMSB9CiAgICB7IElTT182NDYuYmFzaWM6MTk4MyByZWYgY3NJU082NDZiYXNpYzE5ODMgfQogICAgeyBJTlZBUklBTlQgY3NJTlZBUklBTlQgfQogICAgeyBJU09fNjQ2LmlydjoxOTgzIGlzby1pci0yIGlydiBjc0lTTzJJbnRsUmVmVmVyc2lvbiB9CiAgICB7IEJTXzQ3MzAgaXNvLWlyLTQgSVNPNjQ2LUdCIGdiIHVrIGNzSVNPNFVuaXRlZEtpbmdkb20gfQogICAgeyBOQVRTLVNFRkkgaXNvLWlyLTgtMSBjc05BVFNTRUZJIH0KICAgIHsgTkFUUy1TRUZJLUFERCBpc28taXItOC0yIGNzTkFUU1NFRklBREQgfQogICAgeyBOQVRTLURBTk8gaXNvLWlyLTktMSBjc05BVFNEQU5PIH0KICAgIHsgTkFUUy1EQU5PLUFERCBpc28taXItOS0yIGNzTkFUU0RBTk9BREQgfQogICAgeyBTRU5fODUwMjAwX0IgaXNvLWlyLTEwIEZJIElTTzY0Ni1GSSBJU082NDYtU0Ugc2UgY3NJU08xMFN3ZWRpc2ggfQogICAgeyBTRU5fODUwMjAwX0MgaXNvLWlyLTExIElTTzY0Ni1TRTIgc2UyIGNzSVNPMTFTd2VkaXNoRm9yTmFtZXMgfQogICAgeyBLU19DXzU2MDEtMTk4NyBpc28taXItMTQ5IEtTX0NfNTYwMS0xOTg5IEtTQ181NjAxIGtvcmVhbiBjc0tTQzU2MDExOTg3IH0KICAgIHsgSVNPLTIwMjItS1IgY3NJU08yMDIyS1IgfQogICAgeyBFVUMtS1IgY3NFVUNLUiB9CiAgICB7IElTTy0yMDIyLUpQIGNzSVNPMjAyMkpQIH0KICAgIHsgSVNPLTIwMjItSlAtMiBjc0lTTzIwMjJKUDIgfQogICAgeyBKSVNfQzYyMjAtMTk2OS1qcCBKSVNfQzYyMjAtMTk2OSBpc28taXItMTMga2F0YWthbmEgeDAyMDEtNwogICAgICBjc0lTTzEzSklTQzYyMjBqcCB9CiAgICB7IEpJU19DNjIyMC0xOTY5LXJvIGlzby1pci0xNCBqcCBJU082NDYtSlAgY3NJU08xNEpJU0M2MjIwcm8gfQogICAgeyBJVCBpc28taXItMTUgSVNPNjQ2LUlUIGNzSVNPMTVJdGFsaWFuIH0KICAgIHsgUFQgaXNvLWlyLTE2IElTTzY0Ni1QVCBjc0lTTzE2UG9ydHVndWVzZSB9CiAgICB7IEVTIGlzby1pci0xNyBJU082NDYtRVMgY3NJU08xN1NwYW5pc2ggfQogICAgeyBncmVlazctb2xkIGlzby1pci0xOCBjc0lTTzE4R3JlZWs3T2xkIH0KICAgIHsgbGF0aW4tZ3JlZWsgaXNvLWlyLTE5IGNzSVNPMTlMYXRpbkdyZWVrIH0KICAgIHsgRElOXzY2MDAzIGlzby1pci0yMSBkZSBJU082NDYtREUgY3NJU08yMUdlcm1hbiB9CiAgICB7IE5GX1pfNjItMDEwXygxOTczKSBpc28taXItMjUgSVNPNjQ2LUZSMSBjc0lTTzI1RnJlbmNoIH0KICAgIHsgTGF0aW4tZ3JlZWstMSBpc28taXItMjcgY3NJU08yN0xhdGluR3JlZWsxIH0KICAgIHsgSVNPXzU0MjcgaXNvLWlyLTM3IGNzSVNPNTQyN0N5cmlsbGljIH0KICAgIHsgSklTX0M2MjI2LTE5NzggaXNvLWlyLTQyIGNzSVNPNDJKSVNDNjIyNjE5NzggfQogICAgeyBCU192aWV3ZGF0YSBpc28taXItNDcgY3NJU080N0JTVmlld2RhdGEgfQogICAgeyBJTklTIGlzby1pci00OSBjc0lTTzQ5SU5JUyB9CiAgICB7IElOSVMtOCBpc28taXItNTAgY3NJU081MElOSVM4IH0KICAgIHsgSU5JUy1jeXJpbGxpYyBpc28taXItNTEgY3NJU081MUlOSVNDeXJpbGxpYyB9CiAgICB7IElTT181NDI3OjE5ODEgaXNvLWlyLTU0IElTTzU0MjdDeXJpbGxpYzE5ODEgfQogICAgeyBJU09fNTQyODoxOTgwIGlzby1pci01NSBjc0lTTzU0MjhHcmVlayB9CiAgICB7IEdCXzE5ODgtODAgaXNvLWlyLTU3IGNuIElTTzY0Ni1DTiBjc0lTTzU3R0IxOTg4IH0KICAgIHsgR0JfMjMxMi04MCBpc28taXItNTggY2hpbmVzZSBjc0lTTzU4R0IyMzEyODAgfQogICAgeyBOU180NTUxLTEgaXNvLWlyLTYwIElTTzY0Ni1OTyBubyBjc0lTTzYwRGFuaXNoTm9yd2VnaWFuCiAgICAgIGNzSVNPNjBOb3J3ZWdpYW4xIH0KICAgIHsgTlNfNDU1MS0yIElTTzY0Ni1OTzIgaXNvLWlyLTYxIG5vMiBjc0lTTzYxTm9yd2VnaWFuMiB9CiAgICB7IE5GX1pfNjItMDEwIGlzby1pci02OSBJU082NDYtRlIgZnIgY3NJU082OUZyZW5jaCB9CiAgICB7IHZpZGVvdGV4LXN1cHBsIGlzby1pci03MCBjc0lTTzcwVmlkZW90ZXhTdXBwMSB9CiAgICB7IFBUMiBpc28taXItODQgSVNPNjQ2LVBUMiBjc0lTTzg0UG9ydHVndWVzZTIgfQogICAgeyBFUzIgaXNvLWlyLTg1IElTTzY0Ni1FUzIgY3NJU084NVNwYW5pc2gyIH0KICAgIHsgTVNaXzc3OTUuMyBpc28taXItODYgSVNPNjQ2LUhVIGh1IGNzSVNPODZIdW5nYXJpYW4gfQogICAgeyBKSVNfQzYyMjYtMTk4MyBpc28taXItODcgeDAyMDggSklTX1gwMjA4LTE5ODMgY3NJU084N0pJU1gwMjA4IH0KICAgIHsgZ3JlZWs3IGlzby1pci04OCBjc0lTTzg4R3JlZWs3IH0KICAgIHsgQVNNT180NDkgSVNPXzkwMzYgYXJhYmljNyBpc28taXItODkgY3NJU084OUFTTU80NDkgfQogICAgeyBpc28taXItOTAgY3NJU085MCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWEgaXNvLWlyLTkxIGpwLW9jci1hIGNzSVNPOTFKSVNDNjIyOTE5ODRhIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYiBpc28taXItOTIgSVNPNjQ2LUpQLU9DUi1CIGpwLW9jci1iCiAgICAgIGNzSVNPOTJKSVNDNjI5OTE5ODRiIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYi1hZGQgaXNvLWlyLTkzIGpwLW9jci1iLWFkZCBjc0lTTzkzSklTNjIyOTE5ODRiYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZCBpc28taXItOTQganAtb2NyLWhhbmQgY3NJU085NEpJUzYyMjkxOTg0aGFuZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQtYWRkIGlzby1pci05NSBqcC1vY3ItaGFuZC1hZGQKICAgICAgY3NJU085NUpJUzYyMjkxOTg0aGFuZGFkZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWthbmEgaXNvLWlyLTk2IGNzSVNPOTZKSVNDNjIyOTE5ODRrYW5hIH0KICAgIHsgSVNPXzIwMzMtMTk4MyBpc28taXItOTggZTEzYiBjc0lTTzIwMzMgfQogICAgeyBBTlNJX1gzLjExMC0xOTgzIGlzby1pci05OSBDU0FfVDUwMC0xOTgzIE5BUExQUyBjc0lTTzk5TkFQTFBTIH0KICAgIHsgSVNPXzg4NTktMToxOTg3IGlzby1pci0xMDAgSVNPXzg4NTktMSBJU08tODg1OS0xIGxhdGluMSBsMSBJQk04MTkKICAgICAgQ1A4MTkgY3NJU09MYXRpbjEgfQogICAgeyBJU09fODg1OS0yOjE5ODcgaXNvLWlyLTEwMSBJU09fODg1OS0yIElTTy04ODU5LTIgbGF0aW4yIGwyIGNzSVNPTGF0aW4yIH0KICAgIHsgVC42MS03Yml0IGlzby1pci0xMDIgY3NJU08xMDJUNjE3Yml0IH0KICAgIHsgVC42MS04Yml0IFQuNjEgaXNvLWlyLTEwMyBjc0lTTzEwM1Q2MThiaXQgfQogICAgeyBJU09fODg1OS0zOjE5ODggaXNvLWlyLTEwOSBJU09fODg1OS0zIElTTy04ODU5LTMgbGF0aW4zIGwzIGNzSVNPTGF0aW4zIH0KICAgIHsgSVNPXzg4NTktNDoxOTg4IGlzby1pci0xMTAgSVNPXzg4NTktNCBJU08tODg1OS00IGxhdGluNCBsNCBjc0lTT0xhdGluNCB9CiAgICB7IEVDTUEtY3lyaWxsaWMgaXNvLWlyLTExMSBLT0k4LUUgY3NJU08xMTFFQ01BQ3lyaWxsaWMgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMSBpc28taXItMTIxIElTTzY0Ni1DQSBjc2E3LTEgY2EgY3NJU08xMjFDYW5hZGlhbjEgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMiBpc28taXItMTIyIElTTzY0Ni1DQTIgY3NhNy0yIGNzSVNPMTIyQ2FuYWRpYW4yIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LWdyIGlzby1pci0xMjMgY3NJU08xMjNDU0FaMjQzNDE5ODVnciB9CiAgICB7IElTT184ODU5LTY6MTk4NyBpc28taXItMTI3IElTT184ODU5LTYgSVNPLTg4NTktNiBFQ01BLTExNCBBU01PLTcwOAogICAgICBhcmFiaWMgY3NJU09MYXRpbkFyYWJpYyB9CiAgICB7IElTT184ODU5LTYtRSBjc0lTTzg4NTk2RSBJU08tODg1OS02LUUgfQogICAgeyBJU09fODg1OS02LUkgY3NJU084ODU5NkkgSVNPLTg4NTktNi1JIH0KICAgIHsgSVNPXzg4NTktNzoxOTg3IGlzby1pci0xMjYgSVNPXzg4NTktNyBJU08tODg1OS03IEVMT1RfOTI4IEVDTUEtMTE4CiAgICAgIGdyZWVrIGdyZWVrOCBjc0lTT0xhdGluR3JlZWsgfQogICAgeyBULjEwMS1HMiBpc28taXItMTI4IGNzSVNPMTI4VDEwMUcyIH0KICAgIHsgSVNPXzg4NTktODoxOTg4IGlzby1pci0xMzggSVNPXzg4NTktOCBJU08tODg1OS04IGhlYnJldwogICAgICBjc0lTT0xhdGluSGVicmV3IH0KICAgIHsgSVNPXzg4NTktOC1FIGNzSVNPODg1OThFIElTTy04ODU5LTgtRSB9CiAgICB7IElTT184ODU5LTgtSSBjc0lTTzg4NTk4SSBJU08tODg1OS04LUkgfQogICAgeyBDU05fMzY5MTAzIGlzby1pci0xMzkgY3NJU08xMzlDU04zNjkxMDMgfQogICAgeyBKVVNfSS5CMS4wMDIgaXNvLWlyLTE0MSBJU082NDYtWVUganMgeXUgY3NJU08xNDFKVVNJQjEwMDIgfQogICAgeyBJU09fNjkzNy0yLWFkZCBpc28taXItMTQyIGNzSVNPVGV4dENvbW0gfQogICAgeyBJRUNfUDI3LTEgaXNvLWlyLTE0MyBjc0lTTzE0M0lFQ1AyNzEgfQogICAgeyBJU09fODg1OS01OjE5ODggaXNvLWlyLTE0NCBJU09fODg1OS01IElTTy04ODU5LTUgY3lyaWxsaWMKICAgICAgY3NJU09MYXRpbkN5cmlsbGljIH0KICAgIHsgSlVTX0kuQjEuMDAzLXNlcmIgaXNvLWlyLTE0NiBzZXJiaWFuIGNzSVNPMTQ2U2VyYmlhbiB9CiAgICB7IEpVU19JLkIxLjAwMy1tYWMgbWFjZWRvbmlhbiBpc28taXItMTQ3IGNzSVNPMTQ3TWFjZWRvbmlhbiB9CiAgICB7IElTT184ODU5LTk6MTk4OSBpc28taXItMTQ4IElTT184ODU5LTkgSVNPLTg4NTktOSBsYXRpbjUgbDUgY3NJU09MYXRpbjUgfQogICAgeyBncmVlay1jY2l0dCBpc28taXItMTUwIGNzSVNPMTUwIGNzSVNPMTUwR3JlZWtDQ0lUVCB9CiAgICB7IE5DX05DMDAtMTA6ODEgY3ViYSBpc28taXItMTUxIElTTzY0Ni1DVSBjc0lTTzE1MUN1YmEgfQogICAgeyBJU09fNjkzNy0yLTI1IGlzby1pci0xNTIgY3NJU082OTM3QWRkIH0KICAgIHsgR09TVF8xOTc2OC03NCBTVF9TRVZfMzU4LTg4IGlzby1pci0xNTMgY3NJU08xNTNHT1NUMTk3Njg3NCB9CiAgICB7IElTT184ODU5LXN1cHAgaXNvLWlyLTE1NCBsYXRpbjEtMi01IGNzSVNPODg1OVN1cHAgfQogICAgeyBJU09fMTAzNjctYm94IGlzby1pci0xNTUgY3NJU08xMDM2N0JveCB9CiAgICB7IElTTy04ODU5LTEwIGlzby1pci0xNTcgbDYgSVNPXzg4NTktMTA6MTk5MiBjc0lTT0xhdGluNiBsYXRpbjYgfQogICAgeyBsYXRpbi1sYXAgbGFwIGlzby1pci0xNTggY3NJU08xNThMYXAgfQogICAgeyBKSVNfWDAyMTItMTk5MCB4MDIxMiBpc28taXItMTU5IGNzSVNPMTU5SklTWDAyMTIxOTkwIH0KICAgIHsgRFNfMjA4OSBEUzIwODkgSVNPNjQ2LURLIGRrIGNzSVNPNjQ2RGFuaXNoIH0KICAgIHsgdXMtZGsgY3NVU0RLIH0KICAgIHsgZGstdXMgY3NES1VTIH0KICAgIHsgSklTX1gwMjAxIFgwMjAxIGNzSGFsZldpZHRoS2F0YWthbmEgfQogICAgeyBLU0M1NjM2IElTTzY0Ni1LUiBjc0tTQzU2MzYgfQogICAgeyBJU08tMTA2NDYtVUNTLTIgY3NVbmljb2RlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy00IGNzVUNTNCB9CiAgICB7IERFQy1NQ1MgZGVjIGNzREVDTUNTIH0KICAgIHsgaHAtcm9tYW44IHJvbWFuOCByOCBjc0hQUm9tYW44IH0KICAgIHsgbWFjaW50b3NoIG1hYyBjc01hY2ludG9zaCB9CiAgICB7IElCTTAzNyBjcDAzNyBlYmNkaWMtY3AtdXMgZWJjZGljLWNwLWNhIGViY2RpYy1jcC13dCBlYmNkaWMtY3AtbmwKICAgICAgY3NJQk0wMzcgfQogICAgeyBJQk0wMzggRUJDRElDLUlOVCBjcDAzOCBjc0lCTTAzOCB9CiAgICB7IElCTTI3MyBDUDI3MyBjc0lCTTI3MyB9CiAgICB7IElCTTI3NCBFQkNESUMtQkUgQ1AyNzQgY3NJQk0yNzQgfQogICAgeyBJQk0yNzUgRUJDRElDLUJSIGNwMjc1IGNzSUJNMjc1IH0KICAgIHsgSUJNMjc3IEVCQ0RJQy1DUC1ESyBFQkNESUMtQ1AtTk8gY3NJQk0yNzcgfQogICAgeyBJQk0yNzggQ1AyNzggZWJjZGljLWNwLWZpIGViY2RpYy1jcC1zZSBjc0lCTTI3OCB9CiAgICB7IElCTTI4MCBDUDI4MCBlYmNkaWMtY3AtaXQgY3NJQk0yODAgfQogICAgeyBJQk0yODEgRUJDRElDLUpQLUUgY3AyODEgY3NJQk0yODEgfQogICAgeyBJQk0yODQgQ1AyODQgZWJjZGljLWNwLWVzIGNzSUJNMjg0IH0KICAgIHsgSUJNMjg1IENQMjg1IGViY2RpYy1jcC1nYiBjc0lCTTI4NSB9CiAgICB7IElCTTI5MCBjcDI5MCBFQkNESUMtSlAta2FuYSBjc0lCTTI5MCB9CiAgICB7IElCTTI5NyBjcDI5NyBlYmNkaWMtY3AtZnIgY3NJQk0yOTcgfQogICAgeyBJQk00MjAgY3A0MjAgZWJjZGljLWNwLWFyMSBjc0lCTTQyMCB9CiAgICB7IElCTTQyMyBjcDQyMyBlYmNkaWMtY3AtZ3IgY3NJQk00MjMgfQogICAgeyBJQk00MjQgY3A0MjQgZWJjZGljLWNwLWhlIGNzSUJNNDI0IH0KICAgIHsgSUJNNDM3IGNwNDM3IDQzNyBjc1BDOENvZGVQYWdlNDM3IH0KICAgIHsgSUJNNTAwIENQNTAwIGViY2RpYy1jcC1iZSBlYmNkaWMtY3AtY2ggY3NJQk01MDAgfQogICAgeyBJQk03NzUgY3A3NzUgY3NQQzc3NUJhbHRpYyB9CiAgICB7IElCTTg1MCBjcDg1MCA4NTAgY3NQQzg1ME11bHRpbGluZ3VhbCB9CiAgICB7IElCTTg1MSBjcDg1MSA4NTEgY3NJQk04NTEgfQogICAgeyBJQk04NTIgY3A4NTIgODUyIGNzUENwODUyIH0KICAgIHsgSUJNODU1IGNwODU1IDg1NSBjc0lCTTg1NSB9CiAgICB7IElCTTg1NyBjcDg1NyA4NTcgY3NJQk04NTcgfQogICAgeyBJQk04NjAgY3A4NjAgODYwIGNzSUJNODYwIH0KICAgIHsgSUJNODYxIGNwODYxIDg2MSBjcC1pcyBjc0lCTTg2MSB9CiAgICB7IElCTTg2MiBjcDg2MiA4NjIgY3NQQzg2MkxhdGluSGVicmV3IH0KICAgIHsgSUJNODYzIGNwODYzIDg2MyBjc0lCTTg2MyB9CiAgICB7IElCTTg2NCBjcDg2NCBjc0lCTTg2NCB9CiAgICB7IElCTTg2NSBjcDg2NSA4NjUgY3NJQk04NjUgfQogICAgeyBJQk04NjYgY3A4NjYgODY2IGNzSUJNODY2IH0KICAgIHsgSUJNODY4IENQODY4IGNwLWFyIGNzSUJNODY4IH0KICAgIHsgSUJNODY5IGNwODY5IDg2OSBjcC1nciBjc0lCTTg2OSB9CiAgICB7IElCTTg3MCBDUDg3MCBlYmNkaWMtY3Atcm9lY2UgZWJjZGljLWNwLXl1IGNzSUJNODcwIH0KICAgIHsgSUJNODcxIENQODcxIGViY2RpYy1jcC1pcyBjc0lCTTg3MSB9CiAgICB7IElCTTg4MCBjcDg4MCBFQkNESUMtQ3lyaWxsaWMgY3NJQk04ODAgfQogICAgeyBJQk04OTEgY3A4OTEgY3NJQk04OTEgfQogICAgeyBJQk05MDMgY3A5MDMgY3NJQk05MDMgfQogICAgeyBJQk05MDQgY3A5MDQgOTA0IGNzSUJCTTkwNCB9CiAgICB7IElCTTkwNSBDUDkwNSBlYmNkaWMtY3AtdHIgY3NJQk05MDUgfQogICAgeyBJQk05MTggQ1A5MTggZWJjZGljLWNwLWFyMiBjc0lCTTkxOCB9CiAgICB7IElCTTEwMjYgQ1AxMDI2IGNzSUJNMTAyNiB9CiAgICB7IEVCQ0RJQy1BVC1ERSBjc0lCTUVCQ0RJQ0FUREUgfQogICAgeyBFQkNESUMtQVQtREUtQSBjc0VCQ0RJQ0FUREVBIH0KICAgIHsgRUJDRElDLUNBLUZSIGNzRUJDRElDQ0FGUiB9CiAgICB7IEVCQ0RJQy1ESy1OTyBjc0VCQ0RJQ0RLTk8gfQogICAgeyBFQkNESUMtREstTk8tQSBjc0VCQ0RJQ0RLTk9BIH0KICAgIHsgRUJDRElDLUZJLVNFIGNzRUJDRElDRklTRSB9CiAgICB7IEVCQ0RJQy1GSS1TRS1BIGNzRUJDRElDRklTRUEgfQogICAgeyBFQkNESUMtRlIgY3NFQkNESUNGUiB9CiAgICB7IEVCQ0RJQy1JVCBjc0VCQ0RJQ0lUIH0KICAgIHsgRUJDRElDLVBUIGNzRUJDRElDUFQgfQogICAgeyBFQkNESUMtRVMgY3NFQkNESUNFUyB9CiAgICB7IEVCQ0RJQy1FUy1BIGNzRUJDRElDRVNBIH0KICAgIHsgRUJDRElDLUVTLVMgY3NFQkNESUNFU1MgfQogICAgeyBFQkNESUMtVUsgY3NFQkNESUNVSyB9CiAgICB7IEVCQ0RJQy1VUyBjc0VCQ0RJQ1VTIH0KICAgIHsgVU5LTk9XTi04QklUIGNzVW5rbm93bjhCaVQgfQogICAgeyBNTkVNT05JQyBjc01uZW1vbmljIH0KICAgIHsgTU5FTSBjc01uZW0gfQogICAgeyBWSVNDSUkgY3NWSVNDSUkgfQogICAgeyBWSVFSIGNzVklRUiB9CiAgICB7IEtPSTgtUiBjc0tPSThSIH0KICAgIHsgSUJNMDA4NTggQ0NTSUQwMDg1OCBDUDAwODU4IFBDLU11bHRpbGluZ3VhbC04NTArZXVybyB9CiAgICB7IElCTTAwOTI0IENDU0lEMDA5MjQgQ1AwMDkyNCBlYmNkaWMtTGF0aW45LS1ldXJvIH0KICAgIHsgSUJNMDExNDAgQ0NTSUQwMTE0MCBDUDAxMTQwIGViY2RpYy11cy0zNytldXJvIH0KICAgIHsgSUJNMDExNDEgQ0NTSUQwMTE0MSBDUDAxMTQxIGViY2RpYy1kZS0yNzMrZXVybyB9CiAgICB7IElCTTAxMTQyIENDU0lEMDExNDIgQ1AwMTE0MiBlYmNkaWMtZGstMjc3K2V1cm8gZWJjZGljLW5vLTI3NytldXJvIH0KICAgIHsgSUJNMDExNDMgQ0NTSUQwMTE0MyBDUDAxMTQzIGViY2RpYy1maS0yNzgrZXVybyBlYmNkaWMtc2UtMjc4K2V1cm8gfQogICAgeyBJQk0wMTE0NCBDQ1NJRDAxMTQ0IENQMDExNDQgZWJjZGljLWl0LTI4MCtldXJvIH0KICAgIHsgSUJNMDExNDUgQ0NTSUQwMTE0NSBDUDAxMTQ1IGViY2RpYy1lcy0yODQrZXVybyB9CiAgICB7IElCTTAxMTQ2IENDU0lEMDExNDYgQ1AwMTE0NiBlYmNkaWMtZ2ItMjg1K2V1cm8gfQogICAgeyBJQk0wMTE0NyBDQ1NJRDAxMTQ3IENQMDExNDcgZWJjZGljLWZyLTI5NytldXJvIH0KICAgIHsgSUJNMDExNDggQ0NTSUQwMTE0OCBDUDAxMTQ4IGViY2RpYy1pbnRlcm5hdGlvbmFsLTUwMCtldXJvIH0KICAgIHsgSUJNMDExNDkgQ0NTSUQwMTE0OSBDUDAxMTQ5IGViY2RpYy1pcy04NzErZXVybyB9CiAgICB7IElCTTEwNDcgSUJNLTEwNDcgfQogICAgeyBQVENQMTU0IGNzUFRDUDE1NCBQVDE1NCBDUDE1NCBDeXJpbGxpYy1Bc2lhbiB9CiAgICB7IEFtaWdhLTEyNTEgQW1pMTI1MSBBbWlnYTEyNTEgQW1pLTEyNTEgfQogICAgeyBVTklDT0RFLTEtMSBjc1VuaWNvZGUxMSB9CiAgICB7IENFU1UtOCBjc0NFU1UtOCB9CiAgICB7IEJPQ1UtMSBjc0JPQ1UtMSB9CiAgICB7IFVOSUNPREUtMS0xLVVURi03IGNzVW5pY29kZTExVVRGNyB9CiAgICB7IElTTy04ODU5LTE0IGlzby1pci0xOTkgSVNPXzg4NTktMTQ6MTk5OCBJU09fODg1OS0xNCBsYXRpbjggaXNvLWNlbHRpYwogICAgICBsOCB9CiAgICB7IElTTy04ODU5LTE1IElTT184ODU5LTE1IExhdGluLTkgfQogICAgeyBJU08tODg1OS0xNiBpc28taXItMjI2IElTT184ODU5LTE2OjIwMDEgSVNPXzg4NTktMTYgbGF0aW4xMCBsMTAgfQogICAgeyBHQksgQ1A5MzYgTVM5MzYgd2luZG93cy05MzYgfQogICAgeyBKSVNfRW5jb2RpbmcgY3NKSVNFbmNvZGluZyB9CiAgICB7IFNoaWZ0X0pJUyBNU19LYW5qaSBjc1NoaWZ0SklTIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlIGNzRVVDUGtkRm10SmFwYW5lc2UKICAgICAgRVVDLUpQIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX0ZpeGVkX1dpZHRoX2Zvcl9KYXBhbmVzZSBjc0VVQ0ZpeFdpZEphcGFuZXNlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy1CYXNpYyBjc1VuaWNvZGVBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1Vbmljb2RlLUxhdGluMSBjc1VuaWNvZGVMYXRpbjEgSVNPLTEwNjQ2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjEgY3NVbmljb2RlSUJNMTI2MSB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY4IGNzVW5pY29kZUlCTTEyNjggfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI3NiBjc1VuaWNvZGVJQk0xMjc2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjQgY3NVbmljb2RlSUJNMTI2NCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY1IGNzVW5pY29kZUlCTTEyNjUgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4wLUxhdGluLTEgY3NXaW5kb3dzMzBMYXRpbjEgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4xLUxhdGluLTEgY3NXaW5kb3dzMzFMYXRpbjEgfQogICAgeyBJU08tODg1OS0yLVdpbmRvd3MtTGF0aW4tMiBjc1dpbmRvd3MzMUxhdGluMiB9CiAgICB7IElTTy04ODU5LTktV2luZG93cy1MYXRpbi01IGNzV2luZG93czMxTGF0aW41IH0KICAgIHsgQWRvYmUtU3RhbmRhcmQtRW5jb2RpbmcgY3NBZG9iZVN0YW5kYXJkRW5jb2RpbmcgfQogICAgeyBWZW50dXJhLVVTIGNzVmVudHVyYVVTIH0KICAgIHsgVmVudHVyYS1JbnRlcm5hdGlvbmFsIGNzVmVudHVyYUludGVybmF0aW9uYWwgfQogICAgeyBQQzgtRGFuaXNoLU5vcndlZ2lhbiBjc1BDOERhbmlzaE5vcndlZ2lhbiB9CiAgICB7IFBDOC1UdXJraXNoIGNzUEM4VHVya2lzaCB9CiAgICB7IElCTS1TeW1ib2xzIGNzSUJNU3ltYm9scyB9CiAgICB7IElCTS1UaGFpIGNzSUJNVGhhaSB9CiAgICB7IEhQLUxlZ2FsIGNzSFBMZWdhbCB9CiAgICB7IEhQLVBpLWZvbnQgY3NIUFBpRm9udCB9CiAgICB7IEhQLU1hdGg4IGNzSFBNYXRoOCB9CiAgICB7IEFkb2JlLVN5bWJvbC1FbmNvZGluZyBjc0hQUFNNYXRoIH0KICAgIHsgSFAtRGVza1RvcCBjc0hQRGVza3RvcCB9CiAgICB7IFZlbnR1cmEtTWF0aCBjc1ZlbnR1cmFNYXRoIH0KICAgIHsgTWljcm9zb2Z0LVB1Ymxpc2hpbmcgY3NNaWNyb3NvZnRQdWJsaXNoaW5nIH0KICAgIHsgV2luZG93cy0zMUogY3NXaW5kb3dzMzFKIH0KICAgIHsgR0IyMzEyIGNzR0IyMzEyIH0KICAgIHsgQmlnNSBjc0JpZzUgfQp9Cgpwcm9jIHRjbF9lbmNvZGluZyB7ZW5jfSB7CiAgICBnbG9iYWwgZW5jb2RpbmdfYWxpYXNlcwogICAgc2V0IG5hbWVzIFtlbmNvZGluZyBuYW1lc10KICAgIHNldCBsY25hbWVzIFtzdHJpbmcgdG9sb3dlciAkbmFtZXNdCiAgICBzZXQgZW5jIFtzdHJpbmcgdG9sb3dlciAkZW5jXQogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmNdCiAgICBpZiB7JGkgPCAwfSB7CgkjIGxvb2sgZm9yICJpc29ubm4iIGluc3RlYWQgb2YgImlzby1ubm4iIG9yICJpc29fbm5uIgoJaWYge1tyZWdzdWIge15pc29bLV9dfSAkZW5jIGlzbyBlbmN4XX0gewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jeF0KCX0KICAgIH0KICAgIGlmIHskaSA8IDB9IHsKCWZvcmVhY2ggbCAkZW5jb2RpbmdfYWxpYXNlcyB7CgkgICAgc2V0IGxsIFtzdHJpbmcgdG9sb3dlciAkbF0KCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRsbCAkZW5jXSA8IDB9IGNvbnRpbnVlCgkgICAgIyBsb29rIHRocm91Z2ggdGhlIGFsaWFzZXMgZm9yIG9uZSB0aGF0IHRjbCBrbm93cyBhYm91dAoJICAgIGZvcmVhY2ggZSAkbGwgewoJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZV0KCQlpZiB7JGkgPCAwfSB7CgkJICAgIGlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGUgaXNvIGV4XX0gewoJCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGV4XQoJCSAgICB9CgkJfQoJCWlmIHskaSA+PSAwfSBicmVhawoJICAgIH0KCSAgICBicmVhawoJfQogICAgfQogICAgaWYgeyRpID49IDB9IHsKCXJldHVybiBbbGluZGV4ICRuYW1lcyAkaV0KICAgIH0KICAgIHJldHVybiB7fQp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBkaWZmb3B0cyAiLVUgNSAtcCIKc2V0IHdyY29tY21kICJnaXQtZGlmZi10cmVlIC0tc3RkaW4gLXAgLS1wcmV0dHkiCgpzZXQgZ2l0ZW5jb2Rpbmcge30KY2F0Y2ggewogICAgc2V0IGdpdGVuY29kaW5nIFtleGVjIGdpdC1yZXBvLWNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nXQp9CmlmIHskZ2l0ZW5jb2RpbmcgPT0gIiJ9IHsKICAgIHNldCBnaXRlbmNvZGluZyAidXRmLTgiCn0Kc2V0IHRjbGVuY29kaW5nIFt0Y2xfZW5jb2RpbmcgJGdpdGVuY29kaW5nXQppZiB7JHRjbGVuY29kaW5nID09IHt9fSB7CiAgICBwdXRzIHN0ZGVyciAiV2FybmluZzogZW5jb2RpbmcgJGdpdGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgVGNsL1RrIgp9CgpzZXQgbWFpbmZvbnQge0hlbHZldGljYSA5fQpzZXQgdGV4dGZvbnQge0NvdXJpZXIgOX0Kc2V0IGZpbmRtZXJnZWZpbGVzIDAKc2V0IG1heGdyYXBocGN0IDUwCnNldCBtYXh3aWR0aCAxNgpzZXQgcmV2bGlzdG9yZGVyIDAKc2V0IGZhc3RkYXRlIDAKCnNldCBjb2xvcnMge2dyZWVuIHJlZCBibHVlIG1hZ2VudGEgZGFya2dyZXkgYnJvd24gb3JhbmdlfQoKY2F0Y2gge3NvdXJjZSB+Ly5naXRrfQoKc2V0IG5hbWVmb250ICRtYWluZm9udAoKZm9udCBjcmVhdGUgb3B0aW9uZm9udCAtZmFtaWx5IHNhbnMtc2VyaWYgLXNpemUgLTEyCgpzZXQgcmV2dHJlZWFyZ3Mge30KZm9yZWFjaCBhcmcgJGFyZ3YgewogICAgc3dpdGNoIC1yZWdleHAgLS0gJGFyZyB7CgkiXiQiIHsgfQoJIl4tZCIgeyBzZXQgZGF0ZW1vZGUgMSB9CgkiXi1yIiB7IHNldCByZXZsaXN0b3JkZXIgMSB9CglkZWZhdWx0IHsKCSAgICBsYXBwZW5kIHJldnRyZWVhcmdzICRhcmcKCX0KICAgIH0KfQoKc2V0IGhpc3Rvcnkge30Kc2V0IGhpc3RvcnlpbmRleCAwCgpzZXQgc3RvcHBlZCAwCnNldCByZWRpc3BsYXlpbmcgMApzZXQgc3R1ZmZzYXZlZCAwCnNldCBwYXRjaG51bSAwCnNldGNvb3JkcwptYWtld2luZG93ICRyZXZ0cmVlYXJncwpyZWFkcmVmcwpnZXRjb21taXRzICRyZXZ0cmVlYXJncwo=