IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXQogICAgfQp9Cgpwcm9jIHN0YXJ0X3Jldl9saXN0IHt2aWV3fSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlCiAgICBnbG9iYWwgY29tbWZkIGxlZnRvdmVyIHRjbGVuY29kaW5nIGRhdGVtb2RlCiAgICBnbG9iYWwgdmlld2FyZ3Mgdmlld2ZpbGVzIGNvbW1pdGlkeAoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgY29tbWl0aWR4KCR2aWV3KSAwCiAgICBzZXQgYXJncyAkdmlld2FyZ3MoJHZpZXcpCiAgICBpZiB7JHZpZXdmaWxlcygkdmlldykgbmUge319IHsKCXNldCBhcmdzIFtjb25jYXQgJGFyZ3MgIi0tIiAkdmlld2ZpbGVzKCR2aWV3KV0KICAgIH0KICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0taGVhZGVyICRvcmRlciBcCgkJCSAgLS1wYXJlbnRzIC0tYm91bmRhcnkgLS1kZWZhdWx0IEhFQUQgJGFyZ3NdIHJdCiAgICB9IGVycl19IHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0IHJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgY29tbWZkKCR2aWV3KSAkZmQKICAgIHNldCBsZWZ0b3Zlcigkdmlldykge30KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZgogICAgaWYgeyR0Y2xlbmNvZGluZyAhPSB7fX0gewoJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nICR0Y2xlbmNvZGluZwogICAgfQogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZpZXddCiAgICBub3didXN5ICR2aWV3Cn0KCnByb2Mgc3RvcF9yZXZfbGlzdCB7fSB7CiAgICBnbG9iYWwgY29tbWZkIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21tZmQoJGN1cnZpZXcpXX0gcmV0dXJuCiAgICBzZXQgZmQgJGNvbW1mZCgkY3VydmlldykKICAgIGNhdGNoIHsKCXNldCBwaWQgW3BpZCAkZmRdCglleGVjIGtpbGwgJHBpZAogICAgfQogICAgY2F0Y2gge2Nsb3NlICRmZH0KICAgIHVuc2V0IGNvbW1mZCgkY3VydmlldykKfQoKcHJvYyBnZXRjb21taXRzIHt9IHsKICAgIGdsb2JhbCBwaGFzZSBjYW52IG1haW5mb250IGN1cnZpZXcKCiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgaW5pdGxheW91dAogICAgc3RhcnRfcmV2X2xpc3QgJGN1cnZpZXcKICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2ZkIHZpZXd9ICB7CiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIG5leHR1cGRhdGUKICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldyBobHZpZXcKICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCWdsb2JhbCB2aWV3bmFtZQoJdW5zZXQgY29tbWZkKCR2aWV3KQoJbm90YnVzeSAkdmlldwoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgc2V0IGZ2IHt9CgkgICAgaWYgeyR2aWV3ICE9ICRjdXJ2aWV3fSB7CgkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgoJICAgIH0KCSAgICBpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCgkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKCQlpZiB7JHZpZXduYW1lKCR2aWV3KSBlcSAiQ29tbWFuZCBsaW5lIn0gewoJCSAgICBhcHBlbmQgZXJyIFwKCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAoJCQkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OiAkZXJyIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAkZXJyCgl9CglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIGJyZWFrCgl9CglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAkbGVmdG92ZXIoJHZpZXcpCgkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCgkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCXNldCBsaXN0ZWQgMQoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGlkcyAwIDBdID09ICItIn0gewoJCXNldCBsaXN0ZWQgMAoJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQoJICAgIH0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYge1tzdHJpbmcgbGVuZ3RoICRpZF0gIT0gNDB9IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglpZiB7JGxpc3RlZH0gewoJICAgIHNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCSAgICBzZXQgaSAwCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlpZiB7JGkgPT0gMCB8fCBbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdID49ICRpfSB7CgkJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHZpZXcsJHApICRpZAoJCX0KCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBvbGRzIHt9Cgl9CglpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkdmlldywkaWQpXX0gewoJICAgIHNldCBjaGlsZHJlbigkdmlldywkaWQpIHt9Cgl9CglzZXQgY29tbWl0ZGF0YSgkaWQpIFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCXNldCBjb21taXRyb3coJHZpZXcsJGlkKSAkY29tbWl0aWR4KCR2aWV3KQoJaW5jciBjb21taXRpZHgoJHZpZXcpCglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBsYXBwZW5kIHBhcmVudGxpc3QgJG9sZHMKCSAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJHZpZXcsJGlkKQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCB2cGFyZW50bGlzdCgkdmlldykgJG9sZHMKCSAgICBsYXBwZW5kIHZjaGlsZGxpc3QoJHZpZXcpICRjaGlsZHJlbigkdmlldywkaWQpCgkgICAgbGFwcGVuZCB2ZGlzcG9yZGVyKCR2aWV3KSAkaWQKCSAgICBsYXBwZW5kIHZjbWl0bGlzdGVkKCR2aWV3KSAkbGlzdGVkCgl9CglzZXQgZ290c29tZSAxCiAgICB9CiAgICBpZiB7JGdvdHNvbWV9IHsKCWlmIHskdmlldyA9PSAkY3Vydmlld30gewoJICAgIHdoaWxlIHtbbGF5b3V0bW9yZSAkbmV4dHVwZGF0ZV19IGRvdXBkYXRlCgl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJHZpZXcgPT0gJGhsdmlld30gewoJICAgIHZoaWdobGlnaHRtb3JlCgl9CiAgICB9CiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJZG91cGRhdGUKICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7fSB7CiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cwoKICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CglmaWxlZXZlbnQgJGNvbW1mZCgkdikgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgZm9yZWFjaCB2IFthcnJheSBuYW1lcyBjb21tZmRdIHsKCXNldCBmZCAkY29tbWZkKCR2KQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZdCiAgICB9Cn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIHtbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQgY2F0LWZpbGUgY29tbWl0ICRpZF19XX0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKfQoKcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKICAgIGdsb2JhbCB2aWV3ZGF0YSBjdXJ2aWV3IHBoYXNlIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgdGhpY2tlcmxpbmUKCiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglzdG9wX3Jldl9saXN0CglzZXQgcGhhc2Uge30KICAgIH0KICAgIHNldCBuICRjdXJ2aWV3CiAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgewoJY2F0Y2gge3Vuc2V0IGNoaWxkcmVuKCRuLCRpZCl9CgljYXRjaCB7dW5zZXQgY29tbWl0cm93KCRuLCRpZCl9CiAgICB9CiAgICBzZXQgY3VydmlldyAtMQogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCB0aGlja2VybGluZX0KICAgIGNhdGNoIHt1bnNldCB2aWV3ZGF0YSgkbil9CiAgICBkaXNjYXJkYWxsY29tbWl0cwogICAgcmVhZHJlZnMKICAgIHNob3d2aWV3ICRuCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2RhdGUKCiAgICBzZXQgaW5oZHIgMQogICAgc2V0IGNvbW1lbnQge30KICAgIHNldCBoZWFkbGluZSB7fQogICAgc2V0IGF1bmFtZSB7fQogICAgc2V0IGF1ZGF0ZSB7fQogICAgc2V0IGNvbW5hbWUge30KICAgIHNldCBjb21kYXRlIHt9CiAgICBzZXQgaGRyZW5kIFtzdHJpbmcgZmlyc3QgIlxuXG4iICRjb250ZW50c10KICAgIGlmIHskaGRyZW5kIDwgMH0gewoJIyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCglzZXQgaGRyZW5kIFtzdHJpbmcgbGVuZ3RoICRjb250ZW50c10KICAgIH0KICAgIHNldCBoZWFkZXIgW3N0cmluZyByYW5nZSAkY29udGVudHMgMCBbZXhwciB7JGhkcmVuZCAtIDF9XV0KICAgIHNldCBjb21tZW50IFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIFtleHByIHskaGRyZW5kICsgMn1dIGVuZF0KICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CglzZXQgdGFnIFtsaW5kZXggJGxpbmUgMF0KCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBhdW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBjb21uYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0KICAgIH0KICAgIHNldCBoZWFkbGluZSB7fQogICAgIyB0YWtlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tZW50IGFzIHRoZSBoZWFkbGluZQogICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRjb21tZW50XQogICAgaWYgeyRpID49IDB9IHsKCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gW3N0cmluZyByYW5nZSAkY29tbWVudCAwICRpXV0KICAgIH0gZWxzZSB7CglzZXQgaGVhZGxpbmUgJGNvbW1lbnQKICAgIH0KICAgIGlmIHshJGxpc3RlZH0gewoJIyBnaXQgcmV2LWxpc3QgaW5kZW50cyB0aGUgY29tbWVudCBieSA0IHNwYWNlczsKCSMgaWYgd2UgZ290IHRoaXMgdmlhIGdpdCBjYXQtZmlsZSwgYWRkIHRoZSBpbmRlbnRhdGlvbgoJc2V0IG5ld2NvbW1lbnQge30KCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNvbW1lbnQgIlxuIl0gewoJICAgIGFwcGVuZCBuZXdjb21tZW50ICIgICAgIgoJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIlxuIgoJfQoJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKICAgIH0KICAgIGlmIHskY29tZGF0ZSAhPSB7fX0gewoJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKICAgIH0KICAgIHNldCBjb21taXRpbmZvKCRpZCkgW2xpc3QgJGhlYWRsaW5lICRhdW5hbWUgJGF1ZGF0ZSBcCgkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCn0KCnByb2MgZ2V0Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdGRhdGEgY29tbWl0aW5mbwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0gewoJcGFyc2Vjb21taXQgJGlkICRjb21taXRkYXRhKCRpZCkgMQogICAgfSBlbHNlIHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcyBtYWluaGVhZAoKICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0IHNob3ctcmVmXSByXQogICAgd2hpbGUgezAgPD0gW3NldCBuIFtnZXRzICRyZWZkIGxpbmVdXX0gewoJaWYgeyFbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgcmVmcy8oW15eXSopJH0gJGxpbmUgXAoJICAgIG1hdGNoIGlkIHBhdGhdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHtbcmVnZXhwIHtecmVtb3Rlcy8uKi9IRUFEJH0gJHBhdGggbWF0Y2hdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHshW3JlZ2V4cCB7Xih0YWdzfGhlYWRzKS8oLiopJH0gJHBhdGggbWF0Y2ggdHlwZSBuYW1lXX0gewoJICAgIHNldCB0eXBlIG90aGVycwoJICAgIHNldCBuYW1lICRwYXRoCgl9CglpZiB7W3JlZ2V4cCB7XnJlbW90ZXMvfSAkcGF0aCBtYXRjaF19IHsKCSAgICBzZXQgdHlwZSBoZWFkcwoJfQoJaWYgeyR0eXBlID09ICJ0YWdzIn0gewoJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKCSAgICBzZXQgb2JqIHt9CgkgICAgc2V0IHR5cGUge30KCSAgICBzZXQgdGFnIHt9CgkgICAgY2F0Y2ggewoJCXNldCBjb21taXQgW2V4ZWMgZ2l0IHJldi1wYXJzZSAiJGlkXjAiXQoJCWlmIHskY29tbWl0ICE9ICRpZH0gewoJCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkY29tbWl0CgkJICAgIGxhcHBlbmQgaWR0YWdzKCRjb21taXQpICRuYW1lCgkJfQoJICAgIH0JCQoJICAgIGNhdGNoIHsKCSAgICAgICAgc2V0IHRhZ2NvbnRlbnRzKCRuYW1lKSBbZXhlYyBnaXQgY2F0LWZpbGUgdGFnICRpZF0KCSAgICB9Cgl9IGVsc2VpZiB7ICR0eXBlID09ICJoZWFkcyIgfSB7CgkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgl9IGVsc2UgewoJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZG90aGVycmVmcygkaWQpICRuYW1lCgl9CiAgICB9CiAgICBjbG9zZSAkcmVmZAogICAgc2V0IG1haW5oZWFkIHt9CiAgICBjYXRjaCB7CglzZXQgdGhlaGVhZCBbZXhlYyBnaXQgc3ltYm9saWMtcmVmIEhFQURdCglpZiB7W3N0cmluZyBtYXRjaCAicmVmcy9oZWFkcy8qIiAkdGhlaGVhZF19IHsKCSAgICBzZXQgbWFpbmhlYWQgW3N0cmluZyByYW5nZSAkdGhlaGVhZCAxMSBlbmRdCgl9CiAgICB9Cn0KCnByb2Mgc2hvd19lcnJvciB7dyB0b3AgbXNnfSB7CiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJkZXN0cm95ICR0b3AiCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBiaW5kICR0b3AgPFZpc2liaWxpdHk+ICJncmFiICR0b3A7IGZvY3VzICR0b3AiCiAgICBiaW5kICR0b3AgPEtleS1SZXR1cm4+ICJkZXN0cm95ICR0b3AiCiAgICB0a3dhaXQgd2luZG93ICR0b3AKfQoKcHJvYyBlcnJvcl9wb3B1cCBtc2cgewogICAgc2V0IHcgLmVycm9yCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIHNob3dfZXJyb3IgJHcgJHcgJG1zZwp9Cgpwcm9jIGNvbmZpcm1fcG9wdXAgbXNnIHsKICAgIGdsb2JhbCBjb25maXJtX29rCiAgICBzZXQgY29uZmlybV9vayAwCiAgICBzZXQgdyAuY29uZmlybQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRyYW5zaWVudCAkdyAuCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJzZXQgY29uZmlybV9vayAxOyBkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBsZWZ0IC1maWxsIHgKICAgIGJ1dHRvbiAkdy5jYW5jZWwgLXRleHQgQ2FuY2VsIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5jYW5jZWwgLXNpZGUgcmlnaHQgLWZpbGwgeAogICAgYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgogICAgdGt3YWl0IHdpbmRvdyAkdwogICAgcmV0dXJuICRjb25maXJtX29rCn0KCnByb2MgbWFrZXdpbmRvdyB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgdGV4dGZvbnQgbWFpbmZvbnQgdWlmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4IHdyYXBjb21tZW50CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGdkdHR5cGUKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcgc3N0cmluZwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBiZ2xpc3QgZmdsaXN0IGRpZmZjb2xvcnMKICAgIGdsb2JhbCBoZWFkY3R4bWVudQoKICAgIG1lbnUgLmJhcgogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkZpbGUiIC1tZW51IC5iYXIuZmlsZQogICAgLmJhciBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgbWVudSAuYmFyLmZpbGUKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlVwZGF0ZSIgLWNvbW1hbmQgdXBkYXRlY29tbWl0cwogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgLmJhci5maWxlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBtZW51IC5iYXIuZWRpdAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkVkaXQiIC1tZW51IC5iYXIuZWRpdAogICAgLmJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiUHJlZmVyZW5jZXMiIC1jb21tYW5kIGRvcHJlZnMKICAgIC5iYXIuZWRpdCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAoKICAgIG1lbnUgLmJhci52aWV3IC1mb250ICR1aWZvbnQKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJWaWV3IiAtbWVudSAuYmFyLnZpZXcKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIk5ldyB2aWV3Li4uIiAtY29tbWFuZCB7bmV3dmlldyAwfQogICAgLmJhci52aWV3IGFkZCBjb21tYW5kIC1sYWJlbCAiRWRpdCB2aWV3Li4uIiAtY29tbWFuZCBlZGl0dmlldyBcCgktc3RhdGUgZGlzYWJsZWQKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkRlbGV0ZSB2aWV3IiAtY29tbWFuZCBkZWx2aWV3IC1zdGF0ZSBkaXNhYmxlZAogICAgLmJhci52aWV3IGFkZCBzZXBhcmF0b3IKICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICJBbGwgZmlsZXMiIC1jb21tYW5kIHtzaG93dmlldyAwfSBcCgktdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAwCgogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJLZXkgYmluZGluZ3MiIC1jb21tYW5kIGtleXMKICAgIC5iYXIuaGVscCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgoKICAgICMgdGhlIGd1aSBoYXMgdXBwZXIgYW5kIGxvd2VyIGhhbGYsIHBhcnRzIG9mIGEgcGFuZWQgd2luZG93LgogICAgcGFuZWR3aW5kb3cgLmN0b3AgLW9yaWVudCB2ZXJ0aWNhbAoKICAgICMgcG9zc2libHkgdXNlIGFzc3VtZWQgZ2VvbWV0cnkKICAgIGlmIHshW2luZm8gZXhpc3RzIGdlb21ldHJ5KHRvcGhlaWdodCldfSB7CiAgICAgICAgc2V0IGdlb21ldHJ5KHRvcGhlaWdodCkgW2V4cHIgezE1ICogJGxpbmVzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeSh0b3B3aWR0aCkgW2V4cHIgezgwICogJGNoYXJzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeShib3RoZWlnaHQpIFtleHByIHsxNSAqICRsaW5lc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkoYm90d2lkdGgpIFtleHByIHs1MCAqICRjaGFyc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkoY2FudikgW2V4cHIgezQwICogJGNoYXJzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeShjYW52MikgW2V4cHIgezIwICogJGNoYXJzcGN9XQogICAgICAgIHNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezIwICogJGNoYXJzcGN9XQogICAgfQoKICAgICMgdGhlIHVwcGVyIGhhbGYgd2lsbCBoYXZlIGEgcGFuZWQgd2luZG93LCBhIHNjcm9sbCBiYXIgdG8gdGhlIHJpZ2h0LCBhbmQgc29tZSBzdHVmZiBiZWxvdwogICAgZnJhbWUgLnRmIC1oZWlnaHQgJGdlb21ldHJ5KHRvcGhlaWdodCkgLXdpZHRoICRnZW9tZXRyeSh0b3B3aWR0aCkKICAgIGZyYW1lIC50Zi5oaXN0ZnJhbWUKICAgIHBhbmVkd2luZG93IC50Zi5oaXN0ZnJhbWUucHdjbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CgogICAgIyBjcmVhdGUgdGhyZWUgY2FudmFzZXMKICAgIHNldCBjc2Nyb2xsIC50Zi5oaXN0ZnJhbWUuY3NiCiAgICBzZXQgY2FudiAudGYuaGlzdGZyYW1lLnB3Y2xpc3QuY2FudgogICAgY2FudmFzICRjYW52IC13aWR0aCAkZ2VvbWV0cnkoY2FudikgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgXAoJLXlzY3JvbGxpbmNyICRsaW5lc3BjIC15c2Nyb2xsY29tbWFuZCAic2Nyb2xsY2FudiAkY3Njcm9sbCIKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYKICAgIHNldCBjYW52MiAudGYuaGlzdGZyYW1lLnB3Y2xpc3QuY2FudjIKICAgIGNhbnZhcyAkY2FudjIgLXdpZHRoICRnZW9tZXRyeShjYW52MikgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC50Zi5oaXN0ZnJhbWUucHdjbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYzCgogICAgIyBhIHNjcm9sbCBiYXIgdG8gcnVsZSB0aGVtCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgYmluZCAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CiAgICBsYXBwZW5kIGJnbGlzdCAkY2FudiAkY2FudjIgJGNhbnYzCiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtc2lkZSBsZWZ0CgogICAgIyB3ZSBoYXZlIHR3byBidXR0b24gYmFycyBhdCBib3R0b20gb2YgdG9wIGZyYW1lLiBCYXIgMQogICAgZnJhbWUgLnRmLmJhcgogICAgZnJhbWUgLnRmLmxiYXIgLWhlaWdodCAxNQoKICAgIHNldCBzaGExZW50cnkgLnRmLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAudGYuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOCAtZm9udCAkdWlmb250CiAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCiAgICBwYWNrIC50Zi5iYXIuc2hhMWxhYmVsIC1zaWRlIGxlZnQKICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKICAgIHBhY2sgJHNoYTFlbnRyeSAtc2lkZSBsZWZ0IC1wYWR5IDIKCiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLWxlZnQgLWRhdGEgewoJI2RlZmluZSBsZWZ0X3dpZHRoIDE2CgkjZGVmaW5lIGxlZnRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciBsZWZ0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDBlLCAweDAwLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDBlLCAweDAwLCAweDFjLCAweDAwLAoJMHgzOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhjMCwgMHgwMX07CiAgICB9CiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLXJpZ2h0IC1kYXRhIHsKCSNkZWZpbmUgcmlnaHRfd2lkdGggMTYKCSNkZWZpbmUgcmlnaHRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciByaWdodF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweDgwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDBlLCAweDAwLCAweDFjLAoJMHgwMCwgMHgzOCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MGUsIDB4MDAsIDB4MDcsIDB4ODAsIDB4MDMsIDB4YzAsIDB4MDF9OwogICAgfQogICAgYnV0dG9uIC50Zi5iYXIubGVmdGJ1dCAtaW1hZ2UgYm0tbGVmdCAtY29tbWFuZCBnb2JhY2sgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAudGYuYmFyLmxlZnRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBidXR0b24gLnRmLmJhci5yaWdodGJ1dCAtaW1hZ2UgYm0tcmlnaHQgLWNvbW1hbmQgZ29mb3J3IFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLnRmLmJhci5yaWdodGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBidXR0b24gLnRmLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYuYmFyLmZpbmRidXQgLXNpZGUgbGVmdAogICAgc2V0IGZpbmRzdHJpbmcge30KICAgIHNldCBmc3RyaW5nIC50Zi5iYXIuZmluZHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRmc3RyaW5nCiAgICBlbnRyeSAkZnN0cmluZyAtd2lkdGggMzAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgZmluZHN0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRzdHJpbmcgd3JpdGUgZmluZF9jaGFuZ2UKICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeCAtaW4gLnRmLmJhcgogICAgc2V0IGZpbmR0eXBlIEV4YWN0CiAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC50Zi5iYXIuZmluZHR5cGUgXAoJCSAgICAgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmR0eXBlIHdyaXRlIGZpbmRfY2hhbmdlCiAgICAudGYuYmFyLmZpbmR0eXBlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAudGYuYmFyLmZpbmR0eXBlLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAudGYuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlcgogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRsb2Mgd3JpdGUgZmluZF9jaGFuZ2UKICAgIC50Zi5iYXIuZmluZGxvYyBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLnRmLmJhci5maW5kbG9jLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmJhci5maW5kbG9jIC1zaWRlIHJpZ2h0CiAgICBwYWNrIC50Zi5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKCiAgICAjIGJ1aWxkIHVwIHRoZSBib3R0b20gYmFyIG9mIHVwcGVyIHdpbmRvdwogICAgbGFiZWwgLnRmLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAogICAgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5mbGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgogICAgc2V0IGdtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLmdkdHR5cGUgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IiBcCgkiYWRkaW5nL3JlbW92aW5nIHN0cmluZzoiXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGdkdHR5cGUgd3JpdGUgaGZpbGVzX2NoYW5nZQogICAgJGdtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgLnRmLmxiYXIuZ2R0dHlwZSBjb25mIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIuZ2R0dHlwZSAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGVudHJ5IC50Zi5sYmFyLmZlbnQgLXdpZHRoIDI1IC1mb250ICR0ZXh0Zm9udCBcCgktdGV4dHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcyB3cml0ZSBoZmlsZXNfY2hhbmdlCiAgICBsYXBwZW5kIGVudHJpZXMgLnRmLmxiYXIuZmVudAogICAgcGFjayAudGYubGJhci5mZW50IC1zaWRlIGxlZnQgLWZpbGwgeCAtZXhwYW5kIDEKICAgIGxhYmVsIC50Zi5sYmFyLnZsYWJlbCAtdGV4dCAiIE9SIGluIHZpZXciIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIudmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZ2xvYmFsIHZpZXdobG1lbnUgc2VsZWN0ZWRobHZpZXcKICAgIHNldCB2aWV3aGxtZW51IFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnZobCBzZWxlY3RlZGhsdmlldyBOb25lXQogICAgJHZpZXdobG1lbnUgZW50cnljb25mIE5vbmUgLWNvbW1hbmQgZGVsdmhpZ2hsaWdodAogICAgJHZpZXdobG1lbnUgY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci52aGwgY29uZiAtZm9udCAkdWlmb250CiAgICBwYWNrIC50Zi5sYmFyLnZobCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGxhYmVsIC50Zi5sYmFyLnJsYWJlbCAtdGV4dCAiIE9SICIgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5ybGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQKICAgIHNldCBtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnJlbG0gaGlnaGxpZ2h0X3JlbGF0ZWQgTm9uZSBcCgkiRGVzY2VuZGVudCIgIk5vdCBkZXNjZW5kZW50IiAiQW5jZXN0b3IiICJOb3QgYW5jZXN0b3IiXQogICAgJG0gY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci5yZWxtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9yZWxhdGVkIHdyaXRlIHZyZWxfY2hhbmdlCiAgICBwYWNrIC50Zi5sYmFyLnJlbG0gLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgIyBGaW5pc2ggcHV0dGluZyB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdmlld2VyIHRvZ2V0aGVyCiAgICBwYWNrIC50Zi5sYmFyIC1pbiAudGYgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLnRmLmJhciAtaW4gLnRmIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUgLWZpbGwgYm90aCAtc2lkZSB0b3AgLWV4cGFuZCAxCiAgICAuY3RvcCBhZGQgLnRmCgogICAgIyBub3cgYnVpbGQgdXAgdGhlIGJvdHRvbQogICAgcGFuZWR3aW5kb3cgLnB3Ym90dG9tIC1vcmllbnQgaG9yaXpvbnRhbAoKICAgICMgbG93ZXIgbGVmdCwgYSB0ZXh0IGJveCBvdmVyIHNlYXJjaCBiYXIsIHNjcm9sbCBiYXIgdG8gdGhlIHJpZ2h0CiAgICAjIGlmIHdlIGtub3cgd2luZG93IGhlaWdodCwgdGhlbiB0aGF0IHdpbGwgc2V0IHRoZSBsb3dlciB0ZXh0IGhlaWdodCwgb3RoZXJ3aXNlCiAgICAjIHdlIHNldCBsb3dlciB0ZXh0IGhlaWdodCB3aGljaCB3aWxsIGRyaXZlIHdpbmRvdyBoZWlnaHQKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkobWFpbildfSB7CiAgICAgICAgZnJhbWUgLmJsZWZ0IC13aWR0aCAkZ2VvbWV0cnkoYm90d2lkdGgpCiAgICB9IGVsc2UgewogICAgICAgIGZyYW1lIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShib3RoZWlnaHQpCiAgICB9CiAgICBmcmFtZSAuYmxlZnQudG9wCgogICAgYnV0dG9uIC5ibGVmdC50b3Auc2VhcmNoIC10ZXh0ICJTZWFyY2giIC1jb21tYW5kIGRvc2VhcmNoIFwKCS1mb250ICR1aWZvbnQKICAgIHBhY2sgLmJsZWZ0LnRvcC5zZWFyY2ggLXNpZGUgbGVmdCAtcGFkeCA1CiAgICBzZXQgc3N0cmluZyAuYmxlZnQudG9wLnNzdHJpbmcKICAgIGVudHJ5ICRzc3RyaW5nIC13aWR0aCAyMCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzZWFyY2hzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkc3N0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIHNlYXJjaHN0cmluZyB3cml0ZSBpbmNyc2VhcmNoCiAgICBwYWNrICRzc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBjdGV4dCAuYmxlZnQuY3RleHQKICAgIHRleHQgJGN0ZXh0IC1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1mb3JlZ3JvdW5kICRmZ2NvbG9yIFwKCS1zdGF0ZSBkaXNhYmxlZCAtZm9udCAkdGV4dGZvbnQgXAoJLXlzY3JvbGxjb21tYW5kIHNjcm9sbHRleHQgLXdyYXAgbm9uZQogICAgc2Nyb2xsYmFyIC5ibGVmdC5zYiAtY29tbWFuZCAiJGN0ZXh0IHl2aWV3IgogICAgcGFjayAuYmxlZnQudG9wIC1zaWRlIHRvcCAtZmlsbCB4CiAgICBwYWNrIC5ibGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICBsYXBwZW5kIGJnbGlzdCAkY3RleHQKICAgIGxhcHBlbmQgZmdsaXN0ICRjdGV4dAoKICAgICRjdGV4dCB0YWcgY29uZiBjb21tZW50IC13cmFwICR3cmFwY29tbWVudAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0gLWJhY2sgIiNhYWFhYWEiCiAgICAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDJdCiAgICAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAwXQogICAgJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMV0KICAgICRjdGV4dCB0YWcgY29uZiBtMCAtZm9yZSByZWQKICAgICRjdGV4dCB0YWcgY29uZiBtMSAtZm9yZSBibHVlCiAgICAkY3RleHQgdGFnIGNvbmYgbTIgLWZvcmUgZ3JlZW4KICAgICRjdGV4dCB0YWcgY29uZiBtMyAtZm9yZSBwdXJwbGUKICAgICRjdGV4dCB0YWcgY29uZiBtNCAtZm9yZSBicm93bgogICAgJGN0ZXh0IHRhZyBjb25mIG01IC1mb3JlICIjMDA5MDkwIgogICAgJGN0ZXh0IHRhZyBjb25mIG02IC1mb3JlIG1hZ2VudGEKICAgICRjdGV4dCB0YWcgY29uZiBtNyAtZm9yZSAiIzgwODAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtOCAtZm9yZSAiIzAwOTAwMCIKICAgICRjdGV4dCB0YWcgY29uZiBtOSAtZm9yZSAiI2ZmMDA4MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTAgLWZvcmUgY3lhbgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMSAtZm9yZSAiI2IwNzA3MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTIgLWZvcmUgIiM3MGIwZjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEzIC1mb3JlICIjNzBmMGIwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xNCAtZm9yZSAiI2YwYjA3MCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTUgLWZvcmUgIiNmZjcwYjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbW1heCAtZm9yZSBkYXJrZ3JleQogICAgc2V0IG1lcmdlbWF4IDE2CiAgICAkY3RleHQgdGFnIGNvbmYgbXJlc3VsdCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIG1zZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgICRjdGV4dCB0YWcgY29uZiBmb3VuZCAtYmFjayB5ZWxsb3cKCiAgICAucHdib3R0b20gYWRkIC5ibGVmdAoKICAgICMgbG93ZXIgcmlnaHQKICAgIGZyYW1lIC5icmlnaHQKICAgIGZyYW1lIC5icmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnRyZWUgLXRleHQgIlRyZWUiIFwKCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJ0cmVlIgogICAgZ3JpZCAuYnJpZ2h0Lm1vZGUucGF0Y2ggLmJyaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuYnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmJyaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktZm9udCAkbWFpbmZvbnQgXAoJLXRhYnMgW2xpc3QgJGluZGVudCBbZXhwciB7MiAqICRpbmRlbnR9XV0gXAoJLXlzY3JvbGxjb21tYW5kICIuYnJpZ2h0LnNiIHNldCIgXAoJLWN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdIFwKCS1zcGFjaW5nMSAxIC1zcGFjaW5nMyAxCiAgICBsYXBwZW5kIGJnbGlzdCAkY2ZsaXN0CiAgICBsYXBwZW5kIGZnbGlzdCAkY2ZsaXN0CiAgICBzY3JvbGxiYXIgLmJyaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmJyaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGhpZ2hsaWdodCBcCgktYmFja2dyb3VuZCBbJGNmbGlzdCBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGJvbGQgLWZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCiAgICAucHdib3R0b20gYWRkIC5icmlnaHQKICAgIC5jdG9wIGFkZCAucHdib3R0b20KCiAgICAjIHJlc3RvcmUgd2luZG93IHBvc2l0aW9uIGlmIGtub3duCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0gewogICAgICAgIHdtIGdlb21ldHJ5IC4gIiRnZW9tZXRyeShtYWluKSIKICAgIH0KCiAgICBiaW5kIC5wd2JvdHRvbSA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQogICAgcGFjayAuY3RvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiY2FudnNjYW4gbWFyayAlVyAleCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImNhbnZzY2FuIGRyYWd0byAlVyAleCAleSIKICAgIGJpbmRrZXkgPEhvbWU+IHNlbGZpcnN0bGluZQogICAgYmluZGtleSA8RW5kPiBzZWxsYXN0bGluZQogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxTaGlmdC1LZXktVXA+ICJuZXh0X2hpZ2hsaWdodCAtMSIKICAgIGJpbmQgLiA8U2hpZnQtS2V5LURvd24+ICJuZXh0X2hpZ2hsaWdodCAxIgogICAgYmluZGtleSA8S2V5LVJpZ2h0PiAiZ29mb3J3IgogICAgYmluZGtleSA8S2V5LUxlZnQ+ICJnb2JhY2siCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gInNlbG5leHRwYWdlIC0xIgogICAgYmluZCAuIDxLZXktTmV4dD4gInNlbG5leHRwYWdlIDEiCiAgICBiaW5kIC4gPENvbnRyb2wtSG9tZT4gImFsbGNhbnZzIHl2aWV3IG1vdmV0byAwLjAiCiAgICBiaW5kIC4gPENvbnRyb2wtRW5kPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDEuMCIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktVXA+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgdW5pdHMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LURvd24+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSB1bml0cyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSB6ICJnb2JhY2siCiAgICBiaW5ka2V5IHggImdvZm9ydyIKICAgIGJpbmRrZXkgaSAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IGogImdvYmFjayIKICAgIGJpbmRrZXkgbCAiZ29mb3J3IgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKICAgIGJpbmQgLiA8Q29udHJvbC1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8Q29udHJvbC1yPiBkb3NlYXJjaGJhY2sKICAgIGJpbmQgLiA8Q29udHJvbC1zPiBkb3NlYXJjaAogICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgLiA8RGVzdHJveT4ge3NhdmVzdHVmZiAlV30KICAgIGJpbmQgLiA8QnV0dG9uLTE+ICJjbGljayAlVyIKICAgIGJpbmQgJGZzdHJpbmcgPEtleS1SZXR1cm4+IGRvZmluZAogICAgYmluZCAkc2hhMWVudHJ5IDxLZXktUmV0dXJuPiBnb3RvY29tbWl0CiAgICBiaW5kICRzaGExZW50cnkgPDxQYXN0ZVNlbGVjdGlvbj4+IGNsZWFyc2hhMQogICAgYmluZCAkY2ZsaXN0IDwxPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KICAgIGJpbmQgJGNmbGlzdCA8QjEtTW90aW9uPiB7c2VsX2ZsaXN0ICVXICV4ICV5OyBicmVha30KICAgIGJpbmQgJGNmbGlzdCA8QnV0dG9uUmVsZWFzZS0xPiB7dHJlZWNsaWNrICVXICV4ICV5fQoKICAgIHNldCBtYWluY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0KICAgIHNldCB0ZXh0Y3Vyc29yIFskY3RleHQgY2dldCAtY3Vyc29yXQogICAgc2V0IGN1cnRleHRjdXJzb3IgJHRleHRjdXJzb3IKCiAgICBzZXQgcm93Y3R4bWVudSAucm93Y3R4bWVudQogICAgbWVudSAkcm93Y3R4bWVudSAtdGVhcm9mZiAwCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAwfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHNlbGVjdGVkIC0+IHRoaXMiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMX0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiTWFrZSBwYXRjaCIgLWNvbW1hbmQgbWtwYXRjaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgdGFnIiAtY29tbWFuZCBta3RhZwogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJXcml0ZSBjb21taXQgdG8gZmlsZSIgLWNvbW1hbmQgd3JpdGVjb21taXQKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIG5ldyBicmFuY2giIC1jb21tYW5kIG1rYnJhbmNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNoZXJyeS1waWNrIHRoaXMgY29tbWl0IiBcCgktY29tbWFuZCBjaGVycnlwaWNrCgogICAgc2V0IGhlYWRjdHhtZW51IC5oZWFkY3R4bWVudQogICAgbWVudSAkaGVhZGN0eG1lbnUgLXRlYXJvZmYgMAogICAgJGhlYWRjdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ2hlY2sgb3V0IHRoaXMgYnJhbmNoIiBcCgktY29tbWFuZCBjb2JyYW5jaAogICAgJGhlYWRjdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiUmVtb3ZlIHRoaXMgYnJhbmNoIiBcCgktY29tbWFuZCBybWJyYW5jaAp9CgojIG1vdXNlLTIgbWFrZXMgYWxsIHdpbmRvd3Mgc2NhbiB2ZXJ0aWNhbGx5LCBidXQgb25seSB0aGUgb25lCiMgdGhlIGN1cnNvciBpcyBpbiBzY2FucyBob3Jpem9udGFsbHkKcHJvYyBjYW52c2NhbiB7b3AgdyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBmb3JlYWNoIGMgW2xpc3QgJGNhbnYgJGNhbnYyICRjYW52M10gewoJaWYgeyRjID09ICR3fSB7CgkgICAgJGMgc2NhbiAkb3AgJHggJHkKCX0gZWxzZSB7CgkgICAgJGMgc2NhbiAkb3AgMCAkeQoJfQogICAgfQp9Cgpwcm9jIHNjcm9sbGNhbnYge2NzY3JvbGwgZjAgZjF9IHsKICAgICRjc2Nyb2xsIHNldCAkZjAgJGYxCiAgICBkcmF3ZnJhYyAkZjAgJGYxCiAgICBmbHVzaGhpZ2hsaWdodHMKfQoKIyB3aGVuIHdlIG1ha2UgYSBrZXkgYmluZGluZyBmb3IgdGhlIHRvcGxldmVsLCBtYWtlIHN1cmUKIyBpdCBkb2Vzbid0IGdldCB0cmlnZ2VyZWQgd2hlbiB0aGF0IGtleSBpcyBwcmVzc2VkIGluIHRoZQojIGZpbmQgc3RyaW5nIGVudHJ5IHdpZGdldC4KcHJvYyBiaW5ka2V5IHtldiBzY3JpcHR9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBiaW5kIC4gJGV2ICRzY3JpcHQKICAgIHNldCBlc2NyaXB0IFtiaW5kIEVudHJ5ICRldl0KICAgIGlmIHskZXNjcmlwdCA9PSB7fX0gewoJc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgPEtleT5dCiAgICB9CiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJYmluZCAkZSAkZXYgIiRlc2NyaXB0OyBicmVhayIKICAgIH0KfQoKIyBzZXQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRvcGxldmVsIGZvciBhbnkgY2xpY2sgb3V0c2lkZQojIHRoZSBlbnRyeSB3aWRnZXRzCnByb2MgY2xpY2sge3d9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJaWYgeyR3ID09ICRlfSByZXR1cm4KICAgIH0KICAgIGZvY3VzIC4KfQoKcHJvYyBzYXZlc3R1ZmYge3d9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNmbGlzdCBtYWluZm9udCB0ZXh0Zm9udCB1aWZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIG1heGdyYXBocGN0CiAgICBnbG9iYWwgbWF4d2lkdGggc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgdmlld25hbWUgdmlld2ZpbGVzIHZpZXdhcmdzIHZpZXdwZXJtIG5leHR2aWV3bnVtCiAgICBnbG9iYWwgY21pdG1vZGUgd3JhcGNvbW1lbnQKICAgIGdsb2JhbCBjb2xvcnMgYmdjb2xvciBmZ2NvbG9yIGRpZmZjb2xvcnMKCiAgICBpZiB7JHN0dWZmc2F2ZWR9IHJldHVybgogICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgogICAgY2F0Y2ggewoJc2V0IGYgW29wZW4gIn4vLmdpdGstbmV3IiB3XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWFpbmZvbnQgJG1haW5mb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdGV4dGZvbnQgJHRleHRmb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdWlmb250ICR1aWZvbnRdCglwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCglwdXRzICRmIFtsaXN0IHNldCBtYXhncmFwaHBjdCAkbWF4Z3JhcGhwY3RdCglwdXRzICRmIFtsaXN0IHNldCBtYXh3aWR0aCAkbWF4d2lkdGhdCglwdXRzICRmIFtsaXN0IHNldCBjbWl0bW9kZSAkY21pdG1vZGVdCglwdXRzICRmIFtsaXN0IHNldCB3cmFwY29tbWVudCAkd3JhcGNvbW1lbnRdCglwdXRzICRmIFtsaXN0IHNldCBzaG93bmVhcnRhZ3MgJHNob3duZWFydGFnc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGJnY29sb3IgJGJnY29sb3JdCglwdXRzICRmIFtsaXN0IHNldCBmZ2NvbG9yICRmZ2NvbG9yXQoJcHV0cyAkZiBbbGlzdCBzZXQgY29sb3JzICRjb2xvcnNdCglwdXRzICRmIFtsaXN0IHNldCBkaWZmY29sb3JzICRkaWZmY29sb3JzXQoKICAgICAgICBwdXRzICRmICJzZXQgZ2VvbWV0cnkobWFpbikgW3dpbmZvIGdlb21ldHJ5IC5dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHRvcHdpZHRoKSBbd2luZm8gd2lkdGggLnRmXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeSh0b3BoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLnRmXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52KSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52XS0wfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYyXS0wfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjMpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnYzXS0wfV0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoYm90d2lkdGgpIFt3aW5mbyB3aWR0aCAuYmxlZnRdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGJvdGhlaWdodCkgW3dpbmZvIGhlaWdodCAuYmxlZnRdIgoKCXB1dHMgLW5vbmV3bGluZSAkZiAic2V0IHBlcm12aWV3cyB7IgoJZm9yIHtzZXQgdiAwfSB7JHYgPCAkbmV4dHZpZXdudW19IHtpbmNyIHZ9IHsKCSAgICBpZiB7JHZpZXdwZXJtKCR2KX0gewoJCXB1dHMgJGYgIntbbGlzdCAkdmlld25hbWUoJHYpICR2aWV3ZmlsZXMoJHYpICR2aWV3YXJncygkdildfSIKCSAgICB9Cgl9CglwdXRzICRmICJ9IgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJc2V0IHMxIFskd2luIHNhc2ggY29vcmQgMV0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkdyo1LzYgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczEgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKCQlzZXQgc2FzaDAgMzAKCSAgICB9CgkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskc2FzaDAgKyAyMH1dCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskdyAtIDEwfV0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCgkJfQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQoJJHdpbiBzYXNoIHBsYWNlIDEgJHNhc2gxIFtsaW5kZXggJHMxIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyByZXNpemVjZGV0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgeyR3IC0gMTV9XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgLSBhIGNvbW1pdCB2aWV3ZXIgZm9yIGdpdAoKQ29weXJpZ2h0IKkgMjAwNS0yMDA2IFBhdWwgTWFja2VycmFzCgpVc2UgYW5kIHJlZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlfSBcCgkgICAgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCnByb2Mga2V5cyB7fSB7CiAgICBzZXQgdyAua2V5cwogICAgaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CglyYWlzZSAkdwoJcmV0dXJuCiAgICB9CiAgICB0b3BsZXZlbCAkdwogICAgd20gdGl0bGUgJHcgIkdpdGsga2V5IGJpbmRpbmdzIgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKR2l0ayBrZXkgYmluZGluZ3M6Cgo8Q3RybC1RPgkJUXVpdAo8SG9tZT4JCU1vdmUgdG8gZmlyc3QgY29tbWl0CjxFbmQ+CQlNb3ZlIHRvIGxhc3QgY29tbWl0CjxVcD4sIHAsIGkJTW92ZSB1cCBvbmUgY29tbWl0CjxEb3duPiwgbiwgawlNb3ZlIGRvd24gb25lIGNvbW1pdAo8TGVmdD4sIHosIGoJR28gYmFjayBpbiBoaXN0b3J5IGxpc3QKPFJpZ2h0PiwgeCwgbAlHbyBmb3J3YXJkIGluIGhpc3RvcnkgbGlzdAo8UGFnZVVwPglNb3ZlIHVwIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0CjxQYWdlRG93bj4JTW92ZSBkb3duIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0CjxDdHJsLUhvbWU+CVNjcm9sbCB0byB0b3Agb2YgY29tbWl0IGxpc3QKPEN0cmwtRW5kPglTY3JvbGwgdG8gYm90dG9tIG9mIGNvbW1pdCBsaXN0CjxDdHJsLVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIGxpbmUKPEN0cmwtRG93bj4JU2Nyb2xsIGNvbW1pdCBsaXN0IGRvd24gb25lIGxpbmUKPEN0cmwtUGFnZVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIHBhZ2UKPEN0cmwtUGFnZURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBwYWdlCjxTaGlmdC1VcD4JTW92ZSB0byBwcmV2aW91cyBoaWdobGlnaHRlZCBsaW5lCjxTaGlmdC1Eb3duPglNb3ZlIHRvIG5leHQgaGlnaGxpZ2h0ZWQgbGluZQo8RGVsZXRlPiwgYglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCjxCYWNrc3BhY2U+CVNjcm9sbCBkaWZmIHZpZXcgdXAgb25lIHBhZ2UKPFNwYWNlPgkJU2Nyb2xsIGRpZmYgdmlldyBkb3duIG9uZSBwYWdlCnUJCVNjcm9sbCBkaWZmIHZpZXcgdXAgMTggbGluZXMKZAkJU2Nyb2xsIGRpZmYgdmlldyBkb3duIDE4IGxpbmVzCjxDdHJsLUY+CQlGaW5kCjxDdHJsLUc+CQlNb3ZlIHRvIG5leHQgZmluZCBoaXQKPFJldHVybj4JTW92ZSB0byBuZXh0IGZpbmQgaGl0Ci8JCU1vdmUgdG8gbmV4dCBmaW5kIGhpdCwgb3IgcmVkbyBmaW5kCj8JCU1vdmUgdG8gcHJldmlvdXMgZmluZCBoaXQKZgkJU2Nyb2xsIGRpZmYgdmlldyB0byBuZXh0IGZpbGUKPEN0cmwtUz4JCVNlYXJjaCBmb3IgbmV4dCBoaXQgaW4gZGlmZiB2aWV3CjxDdHJsLVI+CQlTZWFyY2ggZm9yIHByZXZpb3VzIGhpdCBpbiBkaWZmIHZpZXcKPEN0cmwtS1ArPglJbmNyZWFzZSBmb250IHNpemUKPEN0cmwtcGx1cz4JSW5jcmVhc2UgZm9udCBzaXplCjxDdHJsLUtQLT4JRGVjcmVhc2UgZm9udCBzaXplCjxDdHJsLW1pbnVzPglEZWNyZWFzZSBmb250IHNpemUKfSBcCgkgICAgLWp1c3RpZnkgbGVmdCAtYmcgd2hpdGUgLWJvcmRlciAyIC1yZWxpZWYgc3Vua2VuCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIGJvdGgKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCiMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQojIGJvdHRvbSByaWdodCBvZiB0aGUgb3ZlcmFsbCB3aW5kb3cuCgpwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKICAgIGdsb2JhbCB0cmVlY29udGVudHMgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVpbmRleAoKICAgIHNldCBpeCAwCiAgICBzZXQgdHJlZWluZGV4KCkgMAogICAgc2V0IGxldiAwCiAgICBzZXQgcHJlZml4IHt9CiAgICBzZXQgcHJlZml4ZW5kIC0xCiAgICBzZXQgcHJlZmVuZHN0YWNrIHt9CiAgICBzZXQgaHRzdGFjayB7fQogICAgc2V0IGh0IDAKICAgIHNldCB0cmVlY29udGVudHMoKSB7fQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGwgewoJd2hpbGUge1tzdHJpbmcgcmFuZ2UgJGYgMCAkcHJlZml4ZW5kXSBuZSAkcHJlZml4fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJJHcgbWFyayBzZXQgZTokdHJlZWluZGV4KCRwcmVmaXgpICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBlOiR0cmVlaW5kZXgoJHByZWZpeCkgbGVmdAoJICAgIH0KCSAgICBzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCSAgICBpbmNyIGh0IFtsaW5kZXggJGh0c3RhY2sgZW5kXQoJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQoJICAgIHNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCSAgICBzZXQgcHJlZmVuZHN0YWNrIFtscmVwbGFjZSAkcHJlZmVuZHN0YWNrIGVuZCBlbmRdCgkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQoJICAgIGluY3IgbGV2IC0xCgl9CglzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCgl3aGlsZSB7W3NldCBzbGFzaCBbc3RyaW5nIGZpcnN0ICIvIiAkdGFpbF1dID49IDB9IHsKCSAgICBsYXBwZW5kIGh0c3RhY2sgJGh0CgkgICAgc2V0IGh0IDAKCSAgICBsYXBwZW5kIHByZWZlbmRzdGFjayAkcHJlZml4ZW5kCgkgICAgaW5jciBwcmVmaXhlbmQgW2V4cHIgeyRzbGFzaCArIDF9XQoJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCgkgICAgbGFwcGVuZCB0cmVlY29udGVudHMoJHByZWZpeCkgJGQKCSAgICBzZXQgb2xkcHJlZml4ICRwcmVmaXgKCSAgICBhcHBlbmQgcHJlZml4ICRkCgkgICAgc2V0IHRyZWVjb250ZW50cygkcHJlZml4KSB7fQoJICAgIHNldCB0cmVlaW5kZXgoJHByZWZpeCkgW2luY3IgaXhdCgkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAoJICAgIHNldCB0YWlsIFtzdHJpbmcgcmFuZ2UgJHRhaWwgW2V4cHIgeyRzbGFzaCsxfV0gZW5kXQoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCXNldCBodCAxCgkJc2V0IHRyZWVkaXJvcGVuKCRwcmVmaXgpIFtleHByIHskbGV2IDwgJG9wZW5sZXZzfV0KCQlzZXQgYm0gW2V4cHIgeyRsZXYgPT0gJG9wZW5sZXZzPyAidHJpLXJ0IjogInRyaS1kbiJ9XQoJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBkOiRpeCBsZWZ0CgkJc2V0IHN0ciAiXG4iCgkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQoJCSR3IGluc2VydCBlbmQgJHN0cgoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgLWFsaWduIGNlbnRlciAtaW1hZ2UgJGJtIC1wYWR4IDEgXAoJCSAgICAtbmFtZSBhOiRpeAoJCSR3IGluc2VydCBlbmQgJGQgW2hpZ2hsaWdodF90YWcgJHByZWZpeF0KCQkkdyBtYXJrIHNldCBzOiRpeCAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAoJICAgIH0KCSAgICBpbmNyIGxldgoJfQoJaWYgeyR0YWlsIG5lIHt9fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJaW5jciBodAoJCXNldCBzdHIgIlxuIgoJCWZvciB7c2V0IGkgMH0geyRpIDwgJGxldn0ge2luY3IgaX0ge2FwcGVuZCBzdHIgIlx0In0KCQkkdyBpbnNlcnQgZW5kICRzdHIKCQkkdyBpbnNlcnQgZW5kICR0YWlsIFtoaWdobGlnaHRfdGFnICRmXQoJICAgIH0KCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAoJfQogICAgfQogICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CglzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCWluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCglzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KICAgIH0KICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbGluZXRvZWx0IHtsfSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKCiAgICBzZXQgeSAyCiAgICBzZXQgcHJlZml4IHt9CiAgICB3aGlsZSB7MX0gewoJZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJICAgIGlmIHskeSA9PSAkbH0gewoJCXJldHVybiAiJHByZWZpeCRlIgoJICAgIH0KCSAgICBzZXQgbiAxCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyJ9IHsKCQlzZXQgbiAkdHJlZWhlaWdodCgkcHJlZml4JGUpCgkJaWYgeyR5ICsgJG4gPiAkbH0gewoJCSAgICBhcHBlbmQgcHJlZml4ICRlCgkJICAgIGluY3IgeQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaW5jciB5ICRuCgl9CiAgICB9Cn0KCnByb2MgaGlnaGxpZ2h0X3RyZWUge3kgcHJlZml4fSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CgogICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJc2V0IHBhdGggJHByZWZpeCRlCglpZiB7W2hpZ2hsaWdodF90YWcgJHBhdGhdIG5lIHt9fSB7CgkgICAgJGNmbGlzdCB0YWcgYWRkIGJvbGQgJHkuMCAiJHkuMCBsaW5lZW5kIgoJfQoJaW5jciB5CglpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIiAmJiAkdHJlZWhlaWdodCgkcGF0aCkgPiAxfSB7CgkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQoJfQogICAgfQogICAgcmV0dXJuICR5Cn0KCnByb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKCiAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkdyBkZWxldGUgczokaXggZTokaXgKICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCiAgICAkdyBpbWFnZSBjb25maWd1cmUgYTokaXggLWltYWdlIHRyaS1ydAogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQogICAgd2hpbGUgeyRkaXIgbmUge319IHsKCWluY3IgdHJlZWhlaWdodCgkZGlyKSAkbgoJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQogICAgfQp9Cgpwcm9jIHRyZWVvcGVuZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlY29udGVudHMgdHJlZWluZGV4CgogICAgc2V0IGl4ICR0cmVlaW5kZXgoJGRpcikKICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KICAgICR3IG1hcmsgc2V0IGU6JGl4IHM6JGl4CiAgICAkdyBtYXJrIGdyYXZpdHkgZTokaXggcmlnaHQKICAgIHNldCBsZXYgMAogICAgc2V0IHN0ciAiXG4iCiAgICBzZXQgbiBbbGxlbmd0aCAkdHJlZWNvbnRlbnRzKCRkaXIpXQogICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKCWluY3IgbGV2CglhcHBlbmQgc3RyICJcdCIKCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KICAgIH0KICAgIGZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRkaXIpIHsKCXNldCBkZSAkZGlyJGUKCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CgkgICAgc2V0IGl5ICR0cmVlaW5kZXgoJGRlKQoJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CgkgICAgJHcgbWFyayBncmF2aXR5IGQ6JGl5IGxlZnQKCSAgICAkdyBpbnNlcnQgZTokaXggJHN0cgoJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKCSAgICAkdyBpbWFnZSBjcmVhdGUgZTokaXggLWFsaWduIGNlbnRlciAtaW1hZ2UgdHJpLXJ0IC1wYWR4IDEgXAoJCS1uYW1lIGE6JGl5CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCSAgICAkdyBtYXJrIHNldCBzOiRpeSBlOiRpeAoJICAgICR3IG1hcmsgZ3Jhdml0eSBzOiRpeSBsZWZ0CgkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCgl9IGVsc2UgewoJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCX0KICAgIH0KICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IHRyZWVkaXJvcGVuKCRkaXIpIDEKICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCiAgICBzZXQgaHQgWyR3IGNnZXQgLWhlaWdodF0KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBzOiRpeF0gLl0gMF0KICAgIGlmIHskbCA8ICR0b3B9IHsKCSR3IHl2aWV3ICRsLjAKICAgIH0gZWxzZWlmIHskbCArICRuICsgMSA+ICR0b3AgKyAkaHR9IHsKCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KCWlmIHskbCA8ICR0b3B9IHsKCSAgICBzZXQgdG9wICRsCgl9CgkkdyB5dmlldyAkdG9wLjAKICAgIH0KfQoKcHJvYyB0cmVlY2xpY2sge3cgeCB5fSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKCXJldHVybgogICAgfQogICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gbmUgIi8ifSB7CglzaG93ZmlsZSAkZQogICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKCXRyZWVjbG9zZWRpciAkdyAkZQogICAgfSBlbHNlIHsKCXRyZWVvcGVuZGlyICR3ICRlCiAgICB9Cn0KCnByb2Mgc2V0ZmlsZWxpc3Qge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IGNmbGlzdAoKICAgIHRyZWV2aWV3ICRjZmxpc3QgJHRyZWVmaWxlbGlzdCgkaWQpIDAKfQoKaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktcnQgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1ydF93aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktcnRfYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhmMCwgMHgwMCwKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnQtbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1ydC1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCiAgICAgICAweGY4LCAweDAzLCAweGY4LCAweDAxLCAweGY4LCAweDAwLCAweDc4LCAweDAwLCAweDM4LCAweDAwLCAweDE4LCAweDAwLAogICAgICAgMHgwOCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktZG4gLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1kbl93aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktZG5fYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwNywgMHhmOCwgMHgwMywKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG4tbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1kbi1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCiAgICAgICAweGY4LCAweDAzLCAweGYwLCAweDAxLCAweGUwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0KCnByb2MgaW5pdF9mbGlzdCB7Zmlyc3R9IHsKICAgIGdsb2JhbCBjZmxpc3QgY2ZsaXN0X3RvcCBzZWxlY3RlZGxpbmUgZGlmZmZpbGVzdGFydAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IGRlbGV0ZSAwLjAgZW5kCiAgICBpZiB7JGZpcnN0IG5lIHt9fSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGZpcnN0CglzZXQgY2ZsaXN0X3RvcCAxCgkkY2ZsaXN0IHRhZyBhZGQgaGlnaGxpZ2h0IDEuMCAiMS4wIGxpbmVlbmQiCiAgICB9IGVsc2UgewoJY2F0Y2gge3Vuc2V0IGNmbGlzdF90b3B9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgZGlmZmZpbGVzdGFydCB7fQp9Cgpwcm9jIGhpZ2hsaWdodF90YWcge2Z9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcGF0aHMKCiAgICBmb3JlYWNoIHAgJGhpZ2hsaWdodF9wYXRocyB7CglpZiB7W3N0cmluZyBtYXRjaCAkcCAkZl19IHsKCSAgICByZXR1cm4gImJvbGQiCgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBoaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNtaXRtb2RlIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJc2V0IGVuZCBbbGluZGV4IFtzcGxpdCBbJGNmbGlzdCBpbmRleCBlbmRdIC5dIDBdCglmb3Ige3NldCBsIDJ9IHskbCA8ICRlbmR9IHtpbmNyIGx9IHsKCSAgICBzZXQgbGluZSBbJGNmbGlzdCBnZXQgJGwuMCAiJGwuMCBsaW5lZW5kIl0KCSAgICBpZiB7W2hpZ2hsaWdodF90YWcgJGxpbmVdIG5lIHt9fSB7CgkJJGNmbGlzdCB0YWcgYWRkIGJvbGQgJGwuMCAiJGwuMCBsaW5lZW5kIgoJICAgIH0KCX0KICAgIH0gZWxzZSB7CgloaWdobGlnaHRfdHJlZSAyIHt9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgdW5oaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgYm9sZCAxLjAgZW5kCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgYWRkX2ZsaXN0IHtmbH0gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGZsIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAiXG4iCgkkY2ZsaXN0IGluc2VydCBlbmQgJGYgW2hpZ2hsaWdodF90YWcgJGZdCiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2Mgc2VsX2ZsaXN0IHt3IHggeX0gewogICAgZ2xvYmFsIGN0ZXh0IGRpZmZmaWxlc3RhcnQgY2ZsaXN0IGNmbGlzdF90b3AgY21pdG1vZGUKCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKICAgIH0gZWxzZSB7CgljYXRjaCB7JGN0ZXh0IHl2aWV3IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgW2V4cHIgeyRsIC0gMn1dXX0KICAgIH0KfQoKIyBGdW5jdGlvbnMgZm9yIGFkZGluZyBhbmQgcmVtb3Zpbmcgc2hlbGwtdHlwZSBxdW90aW5nCgpwcm9jIHNoZWxscXVvdGUge3N0cn0gewogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqXFsnXCJcXCBcdF0qIiAkc3RyXX0gewoJcmV0dXJuICRzdHIKICAgIH0KICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFxdKiIgJHN0cl19IHsKCXJldHVybiAiXCIkc3RyXCIiCiAgICB9CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIionKiIgJHN0cl19IHsKCXJldHVybiAiJyRzdHInIgogICAgfQogICAgcmV0dXJuICJcIltzdHJpbmcgbWFwIHtcIiBcXFwiIFxcIFxcXFx9ICRzdHJdXCIiCn0KCnByb2Mgc2hlbGxhcmdsaXN0IHtsfSB7CiAgICBzZXQgc3RyIHt9CiAgICBmb3JlYWNoIGEgJGwgewoJaWYgeyRzdHIgbmUge319IHsKCSAgICBhcHBlbmQgc3RyICIgIgoJfQoJYXBwZW5kIHN0ciBbc2hlbGxxdW90ZSAkYV0KICAgIH0KICAgIHJldHVybiAkc3RyCn0KCnByb2Mgc2hlbGxkZXF1b3RlIHtzdHJ9IHsKICAgIHNldCByZXQge30KICAgIHNldCB1c2VkIC0xCiAgICB3aGlsZSB7MX0gewoJaW5jciB1c2VkCglpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcWydcIlxcXFwgXHRdIiAkc3RyIGZpcnN0XX0gewoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIGVuZF0KCSAgICBzZXQgdXNlZCBbc3RyaW5nIGxlbmd0aCAkc3RyXQoJICAgIGJyZWFrCgl9CglzZXQgZmlyc3QgW2xpbmRleCAkZmlyc3QgMF0KCXNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJaWYgeyRmaXJzdCA+ICR1c2VkfSB7CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KCSAgICBzZXQgdXNlZCAkZmlyc3QKCX0KCWlmIHskY2ggZXEgIiAiIHx8ICRjaCBlcSAiXHQifSBicmVhawoJaW5jciB1c2VkCglpZiB7JGNoIGVxICInIn0gewoJICAgIHNldCBmaXJzdCBbc3RyaW5nIGZpcnN0ICInIiAkc3RyICR1c2VkXQoJICAgIGlmIHskZmlyc3QgPCAwfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBzaW5nbGUtcXVvdGUiCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkgICAgc2V0IHVzZWQgJGZpcnN0CgkgICAgY29udGludWUKCX0KCWlmIHskY2ggZXEgIlxcIn0gewoJICAgIGlmIHskdXNlZCA+PSBbc3RyaW5nIGxlbmd0aCAkc3RyXX0gewoJCWVycm9yICJ0cmFpbGluZyBiYWNrc2xhc2giCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQoJICAgIGNvbnRpbnVlCgl9CgkjIGhlcmUgY2ggPT0gIlwiIgoJd2hpbGUgezF9IHsKCSAgICBpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcW1wiXFxcXF0iICRzdHIgZmlyc3RdfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBkb3VibGUtcXVvdGUiCgkgICAgfQoJICAgIHNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQoJICAgIHNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJICAgIGlmIHskZmlyc3QgPiAkdXNlZH0gewoJCWFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkJc2V0IHVzZWQgJGZpcnN0CgkgICAgfQoJICAgIGlmIHskY2ggZXEgIlwiIn0gYnJlYWsKCSAgICBpbmNyIHVzZWQKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KCSAgICBpbmNyIHVzZWQKCX0KICAgIH0KICAgIHJldHVybiBbbGlzdCAkdXNlZCAkcmV0XQp9Cgpwcm9jIHNoZWxsc3BsaXQge3N0cn0gewogICAgc2V0IGwge30KICAgIHdoaWxlIHsxfSB7CglzZXQgc3RyIFtzdHJpbmcgdHJpbWxlZnQgJHN0cl0KCWlmIHskc3RyIGVxIHt9fSBicmVhawoJc2V0IGRxIFtzaGVsbGRlcXVvdGUgJHN0cl0KCXNldCBuIFtsaW5kZXggJGRxIDBdCglzZXQgd29yZCBbbGluZGV4ICRkcSAxXQoJc2V0IHN0ciBbc3RyaW5nIHJhbmdlICRzdHIgJG4gZW5kXQoJbGFwcGVuZCBsICR3b3JkCiAgICB9CiAgICByZXR1cm4gJGwKfQoKIyBDb2RlIHRvIGltcGxlbWVudCBtdWx0aXBsZSB2aWV3cwoKcHJvYyBuZXd2aWV3IHtpc2hpZ2hsaWdodH0gewogICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHVpZm9udCBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIG5ld3ZpZXdhcmdzIHJldnRyZWVhcmdzCgogICAgc2V0IG5ld2lzaGlnaGxpZ2h0ICRpc2hpZ2hsaWdodAogICAgc2V0IHRvcCAuZ2l0a3ZpZXcKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXd2aWV3bmFtZSgkbmV4dHZpZXdudW0pICJWaWV3ICRuZXh0dmlld251bSIKICAgIHNldCBuZXd2aWV3cGVybSgkbmV4dHZpZXdudW0pIDAKICAgIHNldCBuZXd2aWV3YXJncygkbmV4dHZpZXdudW0pIFtzaGVsbGFyZ2xpc3QgJHJldnRyZWVhcmdzXQogICAgdmlld2VkaXRvciAkdG9wICRuZXh0dmlld251bSAiR2l0ayB2aWV3IGRlZmluaXRpb24iCn0KCnByb2MgZWRpdHZpZXcge30gewogICAgZ2xvYmFsIGN1cnZpZXcKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3cGVybSBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybQogICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzCgogICAgc2V0IHRvcCAuZ2l0a3ZlZGl0LSRjdXJ2aWV3CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3dmlld25hbWUoJGN1cnZpZXcpICR2aWV3bmFtZSgkY3VydmlldykKICAgIHNldCBuZXd2aWV3cGVybSgkY3VydmlldykgJHZpZXdwZXJtKCRjdXJ2aWV3KQogICAgc2V0IG5ld3ZpZXdhcmdzKCRjdXJ2aWV3KSBbc2hlbGxhcmdsaXN0ICR2aWV3YXJncygkY3VydmlldyldCiAgICB2aWV3ZWRpdG9yICR0b3AgJGN1cnZpZXcgIkdpdGs6IGVkaXQgdmlldyAkdmlld25hbWUoJGN1cnZpZXcpIgp9Cgpwcm9jIHZpZXdlZGl0b3Ige3RvcCBuIHRpdGxlfSB7CiAgICBnbG9iYWwgbmV3dmlld25hbWUgbmV3dmlld3Blcm0gdmlld2ZpbGVzCiAgICBnbG9iYWwgdWlmb250CgogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAkdGl0bGUKICAgIGxhYmVsICR0b3AubmwgLXRleHQgIk5hbWUiIC1mb250ICR1aWZvbnQKICAgIGVudHJ5ICR0b3AubmFtZSAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBuZXd2aWV3bmFtZSgkbikKICAgIGdyaWQgJHRvcC5ubCAkdG9wLm5hbWUgLXN0aWNreSB3IC1wYWR5IDUKICAgIGNoZWNrYnV0dG9uICR0b3AucGVybSAtdGV4dCAiUmVtZW1iZXIgdGhpcyB2aWV3IiAtdmFyaWFibGUgbmV3dmlld3Blcm0oJG4pCiAgICBncmlkICR0b3AucGVybSAtIC1wYWR5IDUgLXN0aWNreSB3CiAgICBtZXNzYWdlICR0b3AuYWwgLWFzcGVjdCAxMDAwIC1mb250ICR1aWZvbnQgXAoJLXRleHQgIkNvbW1pdHMgdG8gaW5jbHVkZSAoYXJndW1lbnRzIHRvIGdpdCByZXYtbGlzdCk6IgogICAgZ3JpZCAkdG9wLmFsIC0gLXN0aWNreSB3IC1wYWR5IDUKICAgIGVudHJ5ICR0b3AuYXJncyAtd2lkdGggNTAgLXRleHR2YXJpYWJsZSBuZXd2aWV3YXJncygkbikgXAoJLWJhY2tncm91bmQgd2hpdGUKICAgIGdyaWQgJHRvcC5hcmdzIC0gLXN0aWNreSBldyAtcGFkeCA1CiAgICBtZXNzYWdlICR0b3AubCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCgktdGV4dCAiRW50ZXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIGluY2x1ZGUsIG9uZSBwZXIgbGluZToiCiAgICBncmlkICR0b3AubCAtIC1zdGlja3kgdwogICAgdGV4dCAkdG9wLnQgLXdpZHRoIDQwIC1oZWlnaHQgMTAgLWJhY2tncm91bmQgd2hpdGUKICAgIGlmIHtbaW5mbyBleGlzdHMgdmlld2ZpbGVzKCRuKV19IHsKCWZvcmVhY2ggZiAkdmlld2ZpbGVzKCRuKSB7CgkgICAgJHRvcC50IGluc2VydCBlbmQgJGYKCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAiXG4iCgl9CgkkdG9wLnQgZGVsZXRlIHtlbmQgLSAxY30gZW5kCgkkdG9wLnQgbWFyayBzZXQgaW5zZXJ0IDAuMAogICAgfQogICAgZ3JpZCAkdG9wLnQgLSAtc3RpY2t5IGV3IC1wYWR4IDUKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5vayAtdGV4dCAiT0siIC1jb21tYW5kIFtsaXN0IG5ld3ZpZXdvayAkdG9wICRuXQogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkdG9wXQogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudAp9Cgpwcm9jIGRvdmlld21lbnUge20gZmlyc3QgY21kIG9wIGFyZ3Z9IHsKICAgIHNldCBubWVudSBbJG0gaW5kZXggZW5kXQogICAgZm9yIHtzZXQgaSAkZmlyc3R9IHskaSA8PSAkbm1lbnV9IHtpbmNyIGl9IHsKCWlmIHtbJG0gZW50cnljZ2V0ICRpIC1jb21tYW5kXSBlcSAkY21kfSB7CgkgICAgZXZhbCAkbSAkb3AgJGkgJGFyZ3YKCSAgICBicmVhawoJfQogICAgfQp9Cgpwcm9jIGFsbHZpZXdtZW51cyB7biBvcCBhcmdzfSB7CiAgICBnbG9iYWwgdmlld2hsbWVudQoKICAgIGRvdmlld21lbnUgLmJhci52aWV3IDUgW2xpc3Qgc2hvd3ZpZXcgJG5dICRvcCAkYXJncwogICAgZG92aWV3bWVudSAkdmlld2hsbWVudSAxIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dICRvcCAkYXJncwp9Cgpwcm9jIG5ld3ZpZXdvayB7dG9wIG59IHsKICAgIGdsb2JhbCBuZXh0dmlld251bSBuZXd2aWV3cGVybSBuZXd2aWV3bmFtZSBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdmaWxlcyB2aWV3cGVybSBzZWxlY3RlZHZpZXcgY3VydmlldwogICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzIHZpZXdobG1lbnUKCiAgICBpZiB7W2NhdGNoIHsKCXNldCBuZXdhcmdzIFtzaGVsbHNwbGl0ICRuZXd2aWV3YXJncygkbildCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBpbiBjb21taXQgc2VsZWN0aW9uIGFyZ3VtZW50czogJGVyciIKCXdtIHJhaXNlICR0b3AKCWZvY3VzICR0b3AKCXJldHVybgogICAgfQogICAgc2V0IGZpbGVzIHt9CiAgICBmb3JlYWNoIGYgW3NwbGl0IFskdG9wLnQgZ2V0IDAuMCBlbmRdICJcbiJdIHsKCXNldCBmdCBbc3RyaW5nIHRyaW0gJGZdCglpZiB7JGZ0IG5lIHt9fSB7CgkgICAgbGFwcGVuZCBmaWxlcyAkZnQKCX0KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdmaWxlcygkbildfSB7CgkjIGNyZWF0aW5nIGEgbmV3IHZpZXcKCWluY3IgbmV4dHZpZXdudW0KCXNldCB2aWV3bmFtZSgkbikgJG5ld3ZpZXduYW1lKCRuKQoJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCglzZXQgdmlld2ZpbGVzKCRuKSAkZmlsZXMKCXNldCB2aWV3YXJncygkbikgJG5ld2FyZ3MKCWFkZHZpZXdtZW51ICRuCglpZiB7ISRuZXdpc2hpZ2hsaWdodH0gewoJICAgIGFmdGVyIGlkbGUgc2hvd3ZpZXcgJG4KCX0gZWxzZSB7CgkgICAgYWZ0ZXIgaWRsZSBhZGR2aGlnaGxpZ2h0ICRuCgl9CiAgICB9IGVsc2UgewoJIyBlZGl0aW5nIGFuIGV4aXN0aW5nIHZpZXcKCXNldCB2aWV3cGVybSgkbikgJG5ld3ZpZXdwZXJtKCRuKQoJaWYgeyRuZXd2aWV3bmFtZSgkbikgbmUgJHZpZXduYW1lKCRuKX0gewoJICAgIHNldCB2aWV3bmFtZSgkbikgJG5ld3ZpZXduYW1lKCRuKQoJICAgIGRvdmlld21lbnUgLmJhci52aWV3IDUgW2xpc3Qgc2hvd3ZpZXcgJG5dIFwKCQllbnRyeWNvbmYgW2xpc3QgLWxhYmVsICR2aWV3bmFtZSgkbildCgkgICAgZG92aWV3bWVudSAkdmlld2hsbWVudSAxIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dIFwKCQllbnRyeWNvbmYgW2xpc3QgLWxhYmVsICR2aWV3bmFtZSgkbikgLXZhbHVlICR2aWV3bmFtZSgkbildCgl9CglpZiB7JGZpbGVzIG5lICR2aWV3ZmlsZXMoJG4pIHx8ICRuZXdhcmdzIG5lICR2aWV3YXJncygkbil9IHsKCSAgICBzZXQgdmlld2ZpbGVzKCRuKSAkZmlsZXMKCSAgICBzZXQgdmlld2FyZ3MoJG4pICRuZXdhcmdzCgkgICAgaWYgeyRjdXJ2aWV3ID09ICRufSB7CgkJYWZ0ZXIgaWRsZSB1cGRhdGVjb21taXRzCgkgICAgfQoJfQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KfQoKcHJvYyBkZWx2aWV3IHt9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHZpZXdkYXRhIHZpZXdwZXJtIGhsdmlldyBzZWxlY3RlZGhsdmlldwoKICAgIGlmIHskY3VydmlldyA9PSAwfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkaGx2aWV3ID09ICRjdXJ2aWV3fSB7CglzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQoJdW5zZXQgaGx2aWV3CiAgICB9CiAgICBhbGx2aWV3bWVudXMgJGN1cnZpZXcgZGVsZXRlCiAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIHt9CiAgICBzZXQgdmlld3Blcm0oJGN1cnZpZXcpIDAKICAgIHNob3d2aWV3IDAKfQoKcHJvYyBhZGR2aWV3bWVudSB7bn0gewogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdobG1lbnUKCiAgICAuYmFyLnZpZXcgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkdmlld25hbWUoJG4pIFwKCS1jb21tYW5kIFtsaXN0IHNob3d2aWV3ICRuXSAtdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAkbgogICAgJHZpZXdobG1lbnUgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkdmlld25hbWUoJG4pIFwKCS1jb21tYW5kIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dIC12YXJpYWJsZSBzZWxlY3RlZGhsdmlldwp9Cgpwcm9jIGZsYXR0ZW4ge3Zhcn0gewogICAgZ2xvYmFsICR2YXIKCiAgICBzZXQgcmV0IHt9CiAgICBmb3JlYWNoIGkgW2FycmF5IG5hbWVzICR2YXJdIHsKCWxhcHBlbmQgcmV0ICRpIFtzZXQgJHZhclwoJGlcKV0KICAgIH0KICAgIHJldHVybiAkcmV0Cn0KCnByb2MgdW5mbGF0dGVuIHt2YXIgbH0gewogICAgZ2xvYmFsICR2YXIKCiAgICBjYXRjaCB7dW5zZXQgJHZhcn0KICAgIGZvcmVhY2gge2kgdn0gJGwgewoJc2V0ICR2YXJcKCRpXCkgJHYKICAgIH0KfQoKcHJvYyBzaG93dmlldyB7bn0gewogICAgZ2xvYmFsIGN1cnZpZXcgdmlld2RhdGEgdmlld2ZpbGVzCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudGxpc3QgY2hpbGRsaXN0IHJvd2lkbGlzdCByb3dvZmZzZXRzCiAgICBnbG9iYWwgY29sb3JtYXAgcm93dGV4dHggY29tbWl0cm93IG5leHRjb2xvciBjYW52eG1heAogICAgZ2xvYmFsIG51bWNvbW1pdHMgcm93cmFuZ2VsaXN0IGNvbW1pdGxpc3RlZCBpZHJvd3JhbmdlcwogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgY2FudiBjYW52eTAKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHRyZWVkaWZmcwogICAgZ2xvYmFsIHBlbmRpbmdfc2VsZWN0IHBoYXNlCiAgICBnbG9iYWwgY29tbWl0aWR4IHJvd2xhaWRvdXQgcm93b3B0aW0gbGluZXNlZ2VuZHMKICAgIGdsb2JhbCBjb21tZmQgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHNlbGVjdGVkdmlldwogICAgZ2xvYmFsIHZwYXJlbnRsaXN0IHZjaGlsZGxpc3QgdmRpc3BvcmRlciB2Y21pdGxpc3RlZAogICAgZ2xvYmFsIGhsdmlldyBzZWxlY3RlZGhsdmlldwoKICAgIGlmIHskbiA9PSAkY3Vydmlld30gcmV0dXJuCiAgICBzZXQgc2VsaWQge30KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IHNlbGlkICRjdXJyZW50aWQKCXNldCB5IFt5YyAkc2VsZWN0ZWRsaW5lXQoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJc2V0IHNwYW4gWyRjYW52IHl2aWV3XQoJc2V0IHl0b3AgW2V4cHIge1tsaW5kZXggJHNwYW4gMF0gKiAkeW1heH1dCglzZXQgeWJvdCBbZXhwciB7W2xpbmRleCAkc3BhbiAxXSAqICR5bWF4fV0KCWlmIHskeXRvcCA8ICR5ICYmICR5IDwgJHlib3R9IHsKCSAgICBzZXQgeXNjcmVlbiBbZXhwciB7JHkgLSAkeXRvcH1dCgl9IGVsc2UgewoJICAgIHNldCB5c2NyZWVuIFtleHByIHsoJHlib3QgLSAkeXRvcCkgLyAyfV0KCX0KICAgIH0KICAgIHVuc2VsZWN0bGluZQogICAgbm9ybWFsbGluZQogICAgc3RvcGZpbmRwcm9jCiAgICBpZiB7JGN1cnZpZXcgPj0gMH0gewoJc2V0IHZwYXJlbnRsaXN0KCRjdXJ2aWV3KSAkcGFyZW50bGlzdAoJc2V0IHZjaGlsZGxpc3QoJGN1cnZpZXcpICRjaGlsZGxpc3QKCXNldCB2ZGlzcG9yZGVyKCRjdXJ2aWV3KSAkZGlzcGxheW9yZGVyCglzZXQgdmNtaXRsaXN0ZWQoJGN1cnZpZXcpICRjb21taXRsaXN0ZWQKCWlmIHskcGhhc2UgbmUge319IHsKCSAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIFwKCQlbbGlzdCAkcGhhc2UgJHJvd2lkbGlzdCAkcm93b2Zmc2V0cyAkcm93cmFuZ2VsaXN0IFwKCQkgICAgIFtmbGF0dGVuIGlkcm93cmFuZ2VzXSBbZmxhdHRlbiBpZGlubGlzdF0gXAoJCSAgICAgJHJvd2xhaWRvdXQgJHJvd29wdGltICRudW1jb21taXRzICRsaW5lc2VnZW5kc10KCX0gZWxzZWlmIHshW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRjdXJ2aWV3KV0KCQkgIHx8IFtsaW5kZXggJHZpZXdkYXRhKCRjdXJ2aWV3KSAwXSBuZSB7fX0gewoJICAgIHNldCB2aWV3ZGF0YSgkY3VydmlldykgXAoJCVtsaXN0IHt9ICRyb3dpZGxpc3QgJHJvd29mZnNldHMgJHJvd3JhbmdlbGlzdF0KCX0KICAgIH0KICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IHRyZWVkaWZmc30KICAgIGNsZWFyX2Rpc3BsYXkKICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkaGx2aWV3ID09ICRufSB7Cgl1bnNldCBobHZpZXcKCXNldCBzZWxlY3RlZGhsdmlldyBOb25lCiAgICB9CgogICAgc2V0IGN1cnZpZXcgJG4KICAgIHNldCBzZWxlY3RlZHZpZXcgJG4KICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRWRpdCogLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCiAgICAuYmFyLnZpZXcgZW50cnljb25mIERlbGV0ZSogLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCgogICAgaWYgeyFbaW5mbyBleGlzdHMgdmlld2RhdGEoJG4pXX0gewoJc2V0IHBlbmRpbmdfc2VsZWN0ICRzZWxpZAoJZ2V0Y29tbWl0cwoJcmV0dXJuCiAgICB9CgogICAgc2V0IHYgJHZpZXdkYXRhKCRuKQogICAgc2V0IHBoYXNlIFtsaW5kZXggJHYgMF0KICAgIHNldCBkaXNwbGF5b3JkZXIgJHZkaXNwb3JkZXIoJG4pCiAgICBzZXQgcGFyZW50bGlzdCAkdnBhcmVudGxpc3QoJG4pCiAgICBzZXQgY2hpbGRsaXN0ICR2Y2hpbGRsaXN0KCRuKQogICAgc2V0IGNvbW1pdGxpc3RlZCAkdmNtaXRsaXN0ZWQoJG4pCiAgICBzZXQgcm93aWRsaXN0IFtsaW5kZXggJHYgMV0KICAgIHNldCByb3dvZmZzZXRzIFtsaW5kZXggJHYgMl0KICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbmRleCAkdiAzXQogICAgaWYgeyRwaGFzZSBlcSB7fX0gewoJc2V0IG51bWNvbW1pdHMgW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KCWNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KICAgIH0gZWxzZSB7Cgl1bmZsYXR0ZW4gaWRyb3dyYW5nZXMgW2xpbmRleCAkdiA0XQoJdW5mbGF0dGVuIGlkaW5saXN0IFtsaW5kZXggJHYgNV0KCXNldCByb3dsYWlkb3V0IFtsaW5kZXggJHYgNl0KCXNldCByb3dvcHRpbSBbbGluZGV4ICR2IDddCglzZXQgbnVtY29tbWl0cyBbbGluZGV4ICR2IDhdCglzZXQgbGluZXNlZ2VuZHMgW2xpbmRleCAkdiA5XQogICAgfQoKICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KICAgIGNhdGNoIHt1bnNldCByb3d0ZXh0eH0KICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ4bWF4IFskY2FudiBjZ2V0IC13aWR0aF0KICAgIHNldCBjdXJ2aWV3ICRuCiAgICBzZXQgcm93IDAKICAgIHNldGNhbnZzY3JvbGwKICAgIHNldCB5ZiAwCiAgICBzZXQgcm93IDAKICAgIGlmIHskc2VsaWQgbmUge30gJiYgW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkbiwkc2VsaWQpXX0gewoJc2V0IHJvdyAkY29tbWl0cm93KCRuLCRzZWxpZCkKCSMgdHJ5IHRvIGdldCB0aGUgc2VsZWN0ZWQgcm93IGluIHRoZSBzYW1lIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4KCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCXNldCB5dG9wIFtleHByIHtbeWMgJHJvd10gLSAkeXNjcmVlbn1dCglpZiB7JHl0b3AgPCAwfSB7CgkgICAgc2V0IHl0b3AgMAoJfQoJc2V0IHlmIFtleHByIHskeXRvcCAqIDEuMCAvICR5bWF4fV0KICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byAkeWYKICAgIGRyYXd2aXNpYmxlCiAgICBzZWxlY3RsaW5lICRyb3cgMAogICAgaWYgeyRwaGFzZSBuZSB7fX0gewoJaWYgeyRwaGFzZSBlcSAiZ2V0Y29tbWl0cyJ9IHsKCSAgICBzaG93X3N0YXR1cyAiUmVhZGluZyBjb21taXRzLi4uIgoJfQoJaWYge1tpbmZvIGV4aXN0cyBjb21tZmQoJG4pXX0gewoJICAgIGxheW91dG1vcmUge30KCX0gZWxzZSB7CgkgICAgZmluaXNoY29tbWl0cwoJfQogICAgfSBlbHNlaWYgeyRudW1jb21taXRzID09IDB9IHsKCXNob3dfc3RhdHVzICJObyBjb21taXRzIHNlbGVjdGVkIgogICAgfQp9CgojIFN0dWZmIHJlbGF0aW5nIHRvIHRoZSBoaWdobGlnaHRpbmcgZmFjaWxpdHkKCnByb2MgaXNoaWdobGlnaHRlZCB7cm93fSB7CiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXSAmJiAkbmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJG5oaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXSAmJiAkdmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXSAmJiAkZmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJGZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXSAmJiAkcmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHJoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICByZXR1cm4gMAp9Cgpwcm9jIGJvbGRlbiB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIHNlbGVjdGVkbGluZSBib2xkcm93cwoKICAgIGxhcHBlbmQgYm9sZHJvd3MgJHJvdwogICAgJGNhbnYgaXRlbWNvbmYgJGxpbmVodGFnKCRyb3cpIC1mb250ICRmb250CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHJvdyA9PSAkc2VsZWN0ZWRsaW5lfSB7CgkkY2FudiBkZWxldGUgc2Vjc2VsCglzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJHJvdyldIFwKCQkgICAtb3V0bGluZSB7e319IC10YWdzIHNlY3NlbCBcCgkJICAgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyBib2xkZW5fbmFtZSB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52MiBsaW5lbnRhZyBzZWxlY3RlZGxpbmUgYm9sZG5hbWVyb3dzCgogICAgbGFwcGVuZCBib2xkbmFtZXJvd3MgJHJvdwogICAgJGNhbnYyIGl0ZW1jb25mICRsaW5lbnRhZygkcm93KSAtZm9udCAkZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRyb3cgPT0gJHNlbGVjdGVkbGluZX0gewoJJGNhbnYyIGRlbGV0ZSBzZWNzZWwKCXNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRyb3cpXSBcCgkJICAgLW91dGxpbmUge3t9fSAtdGFncyBzZWNzZWwgXAoJCSAgIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCgkkY2FudjIgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bmJvbGRlbiB7fSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgYm9sZHJvd3MKCiAgICBzZXQgc3RpbGxib2xkIHt9CiAgICBmb3JlYWNoIHJvdyAkYm9sZHJvd3MgewoJaWYgeyFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93ICRtYWluZm9udAoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHN0aWxsYm9sZCAkcm93Cgl9CiAgICB9CiAgICBzZXQgYm9sZHJvd3MgJHN0aWxsYm9sZAp9Cgpwcm9jIGFkZHZoaWdobGlnaHQge259IHsKICAgIGdsb2JhbCBobHZpZXcgY3VydmlldyB2aWV3ZGF0YSB2aGxfZG9uZSB2aGlnaGxpZ2h0cyBjb21taXRpZHgKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKCWRlbHZoaWdobGlnaHQKICAgIH0KICAgIHNldCBobHZpZXcgJG4KICAgIGlmIHskbiAhPSAkY3VydmlldyAmJiAhW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKCXNldCB2aWV3ZGF0YSgkbikgW2xpc3QgZ2V0Y29tbWl0cyB7e319IHt7fX0ge30ge30ge30gMCAwIDAge31dCglzZXQgdnBhcmVudGxpc3QoJG4pIHt9CglzZXQgdmNoaWxkbGlzdCgkbikge30KCXNldCB2ZGlzcG9yZGVyKCRuKSB7fQoJc2V0IHZjbWl0bGlzdGVkKCRuKSB7fQoJc3RhcnRfcmV2X2xpc3QgJG4KICAgIH0KICAgIHNldCB2aGxfZG9uZSAkY29tbWl0aWR4KCRobHZpZXcpCiAgICBpZiB7JHZobF9kb25lID4gMH0gewoJZHJhd3Zpc2libGUKICAgIH0KfQoKcHJvYyBkZWx2aGlnaGxpZ2h0IHt9IHsKICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBobHZpZXddfSByZXR1cm4KICAgIHVuc2V0IGhsdmlldwogICAgY2F0Y2gge3Vuc2V0IHZoaWdobGlnaHRzfQogICAgdW5ib2xkZW4KfQoKcHJvYyB2aGlnaGxpZ2h0bW9yZSB7fSB7CiAgICBnbG9iYWwgaGx2aWV3IHZobF9kb25lIGNvbW1pdGlkeCB2aGlnaGxpZ2h0cwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciB2ZGlzcG9yZGVyIGN1cnZpZXcgbWFpbmZvbnQKCiAgICBzZXQgZm9udCBbY29uY2F0ICRtYWluZm9udCBib2xkXQogICAgc2V0IG1heCAkY29tbWl0aWR4KCRobHZpZXcpCiAgICBpZiB7JGhsdmlldyA9PSAkY3Vydmlld30gewoJc2V0IGRpc3AgJGRpc3BsYXlvcmRlcgogICAgfSBlbHNlIHsKCXNldCBkaXNwICR2ZGlzcG9yZGVyKCRobHZpZXcpCiAgICB9CiAgICBzZXQgdnIgW3Zpc2libGVyb3dzXQogICAgc2V0IHIwIFtsaW5kZXggJHZyIDBdCiAgICBzZXQgcjEgW2xpbmRleCAkdnIgMV0KICAgIGZvciB7c2V0IGkgJHZobF9kb25lfSB7JGkgPCAkbWF4fSB7aW5jciBpfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcCAkaV0KCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CgkgICAgc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKCSAgICBpZiB7JHIwIDw9ICRyb3cgJiYgJHJvdyA8PSAkcjF9IHsKCQlpZiB7IVtoaWdobGlnaHRlZCAkcm93XX0gewoJCSAgICBib2xkZW4gJHJvdyAkZm9udAoJCX0KCQlzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQoJICAgIH0KCX0KICAgIH0KICAgIHNldCB2aGxfZG9uZSAkbWF4Cn0KCnByb2MgYXNrdmhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzIGNvbW1pdHJvdyBpZGRyYXduIG1haW5mb250CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGhsdmlldywkaWQpXX0gewoJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQogICAgfSBlbHNlIHsKCXNldCB2aGlnaGxpZ2h0cygkcm93KSAwCiAgICB9Cn0KCnByb2MgaGZpbGVzX2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZoX3NlcmlhbAogICAgZ2xvYmFsIG1haW5mb250IGhpZ2hsaWdodF9wYXRocwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCSMgZGVsZXRlIHByZXZpb3VzIGhpZ2hsaWdodHMKCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KCXVuc2V0IGZpbGVoaWdobGlnaHQKCWNhdGNoIHt1bnNldCBmaGlnaGxpZ2h0c30KCXVuYm9sZGVuCgl1bmhpZ2hsaWdodF9maWxlbGlzdAogICAgfQogICAgc2V0IGhpZ2hsaWdodF9wYXRocyB7fQogICAgYWZ0ZXIgY2FuY2VsIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAogICAgaW5jciBmaF9zZXJpYWwKICAgIGlmIHskaGlnaGxpZ2h0X2ZpbGVzIG5lIHt9fSB7CglhZnRlciAzMDAgZG9fZmlsZV9obCAkZmhfc2VyaWFsCiAgICB9Cn0KCnByb2MgbWFrZXBhdHRlcm5zIHtsfSB7CiAgICBzZXQgcmV0IHt9CiAgICBmb3JlYWNoIGUgJGwgewoJc2V0IGVlIFtzdHJpbmcgbWFwIHsiKiIgIlxcKiIgIj8iICJcXD8iICJcWyIgIlxcXFsiICJcXCIgIlxcXFwifSAkZV0KCWlmIHtbc3RyaW5nIGluZGV4ICRlZSBlbmRdIGVxICIvIn0gewoJICAgIGxhcHBlbmQgcmV0ICIkZWUqIgoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHJldCAkZWUKCSAgICBsYXBwZW5kIHJldCAiJGVlLyoiCgl9CiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIGRvX2ZpbGVfaGwge3NlcmlhbH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBmaWxlaGlnaGxpZ2h0IGhpZ2hsaWdodF9wYXRocyBnZHR0eXBlIGZobF9saXN0CgogICAgaWYgeyRnZHR0eXBlIGVxICJ0b3VjaGluZyBwYXRoczoifSB7CglpZiB7W2NhdGNoIHtzZXQgcGF0aHMgW3NoZWxsc3BsaXQgJGhpZ2hsaWdodF9maWxlc119XX0gcmV0dXJuCglzZXQgaGlnaGxpZ2h0X3BhdGhzIFttYWtlcGF0dGVybnMgJHBhdGhzXQoJaGlnaGxpZ2h0X2ZpbGVsaXN0CglzZXQgZ2R0YXJncyBbY29uY2F0IC0tICRwYXRoc10KICAgIH0gZWxzZSB7CglzZXQgZ2R0YXJncyBbbGlzdCAiLVMkaGlnaGxpZ2h0X2ZpbGVzIl0KICAgIH0KICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLXIgLXMgLS1zdGRpbiAkZ2R0YXJnc10KICAgIHNldCBmaWxlaGlnaGxpZ2h0IFtvcGVuICRjbWQgcitdCiAgICBmY29uZmlndXJlICRmaWxlaGlnaGxpZ2h0IC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGZpbGVoaWdobGlnaHQgcmVhZGFibGUgcmVhZGZoaWdobGlnaHQKICAgIHNldCBmaGxfbGlzdCB7fQogICAgZHJhd3Zpc2libGUKICAgIGZsdXNoaGlnaGxpZ2h0cwp9Cgpwcm9jIGZsdXNoaGlnaGxpZ2h0cyB7fSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGxfbGlzdAoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCWxhcHBlbmQgZmhsX2xpc3Qge30KCXB1dHMgJGZpbGVoaWdobGlnaHQgIiIKCWZsdXNoICRmaWxlaGlnaGxpZ2h0CiAgICB9Cn0KCnByb2MgYXNrZmlsZWhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaGxfbGlzdAoKICAgIGxhcHBlbmQgZmhsX2xpc3QgJGlkCiAgICBzZXQgZmhpZ2hsaWdodHMoJHJvdykgLTEKICAgIHB1dHMgJGZpbGVoaWdobGlnaHQgJGlkCn0KCnByb2MgcmVhZGZoaWdobGlnaHQge30gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgY29tbWl0cm93IGN1cnZpZXcgbWFpbmZvbnQgaWRkcmF3bgogICAgZ2xvYmFsIGZobF9saXN0CgogICAgd2hpbGUge1tnZXRzICRmaWxlaGlnaGxpZ2h0IGxpbmVdID49IDB9IHsKCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkZmhsX2xpc3QgJGxpbmVdCglpZiB7JGkgPCAwfSBjb250aW51ZQoJZm9yIHtzZXQgaiAwfSB7JGogPCAkaX0ge2luY3Igan0gewoJICAgIHNldCBpZCBbbGluZGV4ICRmaGxfbGlzdCAkal0KCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJCXNldCBmaGlnaGxpZ2h0cygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIDAKCSAgICB9Cgl9CglzZXQgZmhsX2xpc3QgW2xyYW5nZSAkZmhsX2xpc3QgW2V4cHIgeyRpKzF9XSBlbmRdCglpZiB7JGxpbmUgZXEge319IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGxpbmUpXX0gY29udGludWUKCXNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkbGluZSkKCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkbGluZSldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglzZXQgZmhpZ2hsaWdodHMoJHJvdykgMQogICAgfQogICAgaWYge1tlb2YgJGZpbGVoaWdobGlnaHRdfSB7CgkjIHN0cmFuZ2UuLi4KCXB1dHMgIm9vcHMsIGdpdC1kaWZmLXRyZWUgZGllZCIKCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KCXVuc2V0IGZpbGVoaWdobGlnaHQKICAgIH0KICAgIG5leHRfaGxjb250Cn0KCnByb2MgZmluZF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBtYWluZm9udCBib2xkbmFtZXJvd3MKICAgIGdsb2JhbCBmaW5kc3RyaW5nIGZpbmRwYXR0ZXJuIGZpbmR0eXBlCgogICAgIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cywgaWYgYW55CiAgICBmb3JlYWNoIHJvdyAkYm9sZG5hbWVyb3dzIHsKCWJvbGRlbl9uYW1lICRyb3cgJG1haW5mb250CiAgICB9CiAgICBzZXQgYm9sZG5hbWVyb3dzIHt9CiAgICBjYXRjaCB7dW5zZXQgbmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgogICAgaWYgeyRmaW5kdHlwZSBuZSAiUmVnZXhwIn0gewoJc2V0IGUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9IFwKCQkgICAkZmluZHN0cmluZ10KCXNldCBmaW5kcGF0dGVybiAiKiRlKiIKICAgIH0KICAgIGRyYXd2aXNpYmxlCn0KCnByb2MgYXNrZmluZGhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgbmhpZ2hsaWdodHMgY29tbWl0aW5mbyBpZGRyYXduIG1haW5mb250CiAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kdHlwZSBmaW5kbG9jIGZpbmRwYXR0ZXJuCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJZ2V0Y29tbWl0ICRpZAogICAgfQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGlzYm9sZCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KICAgIGZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJaWYgeyRmaW5kbG9jIG5lICJBbGwgZmllbGRzIiAmJiAkZmluZGxvYyBuZSAkdHl9IHsKCSAgICBjb250aW51ZQoJfQoJaWYgeyRmaW5kdHlwZSBlcSAiUmVnZXhwIn0gewoJICAgIHNldCBkb2VzbWF0Y2ggW3JlZ2V4cCAkZmluZHN0cmluZyAkZl0KCX0gZWxzZWlmIHskZmluZHR5cGUgZXEgIklnbkNhc2UifSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoIC1ub2Nhc2UgJGZpbmRwYXR0ZXJuICRmXQoJfSBlbHNlIHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggJGZpbmRwYXR0ZXJuICRmXQoJfQoJaWYgeyRkb2VzbWF0Y2h9IHsKCSAgICBpZiB7JHR5IGVxICJBdXRob3IifSB7CgkJc2V0IGlzYm9sZCAyCgkgICAgfSBlbHNlIHsKCQlzZXQgaXNib2xkIDEKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHsKCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglpZiB7JGlzYm9sZCA+PSAyfSB7CgkgICAgYm9sZGVuX25hbWUgJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQogICAgfQogICAgc2V0IG5oaWdobGlnaHRzKCRyb3cpICRpc2JvbGQKfQoKcHJvYyB2cmVsX2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkCgogICAgcmhpZ2hsaWdodF9ub25lCiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0gewoJYWZ0ZXIgaWRsZSBkcmF3dmlzaWJsZQogICAgfQp9CgojIHByZXBhcmUgZm9yIHRlc3Rpbmcgd2hldGhlciBjb21taXRzIGFyZSBkZXNjZW5kZW50cyBvciBhbmNlc3RvcnMgb2YgYQpwcm9jIHJoaWdobGlnaHRfc2VsIHthfSB7CiAgICBnbG9iYWwgZGVzY2VuZGVudCBkZXNjX3RvZG8gYW5jZXN0b3IgYW5jX3RvZG8KICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZCByaGlnaGxpZ2h0cwoKICAgIGNhdGNoIHt1bnNldCBkZXNjZW5kZW50fQogICAgc2V0IGRlc2NfdG9kbyBbbGlzdCAkYV0KICAgIGNhdGNoIHt1bnNldCBhbmNlc3Rvcn0KICAgIHNldCBhbmNfdG9kbyBbbGlzdCAkYV0KICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CglyaGlnaGxpZ2h0X25vbmUKCWFmdGVyIGlkbGUgZHJhd3Zpc2libGUKICAgIH0KfQoKcHJvYyByaGlnaGxpZ2h0X25vbmUge30gewogICAgZ2xvYmFsIHJoaWdobGlnaHRzCgogICAgY2F0Y2gge3Vuc2V0IHJoaWdobGlnaHRzfQogICAgdW5ib2xkZW4KfQoKcHJvYyBpc19kZXNjZW5kZW50IHthfSB7CiAgICBnbG9iYWwgY3VydmlldyBjaGlsZHJlbiBjb21taXRyb3cgZGVzY2VuZGVudCBkZXNjX3RvZG8KCiAgICBzZXQgdiAkY3VydmlldwogICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCiAgICBzZXQgdG9kbyAkZGVzY190b2RvCiAgICBzZXQgbGVmdG92ZXIge30KICAgIHNldCBkb25lIDAKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dfSB7aW5jciBpfSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAkaV0KCWlmIHskY29tbWl0cm93KCR2LCRkbykgPCAkbGF9IHsKCSAgICBsYXBwZW5kIGxlZnRvdmVyICRkbwoJICAgIGNvbnRpbnVlCgl9Cglmb3JlYWNoIG5rICRjaGlsZHJlbigkdiwkZG8pIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZXNjZW5kZW50KCRuayldfSB7CgkJc2V0IGRlc2NlbmRlbnQoJG5rKSAxCgkJbGFwcGVuZCB0b2RvICRuawoJCWlmIHskbmsgZXEgJGF9IHsKCQkgICAgc2V0IGRvbmUgMQoJCX0KCSAgICB9Cgl9CglpZiB7JGRvbmV9IHsKCSAgICBzZXQgZGVzY190b2RvIFtjb25jYXQgJGxlZnRvdmVyIFtscmFuZ2UgJHRvZG8gW2V4cHIgeyRpKzF9XSBlbmRdXQoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGRlc2NlbmRlbnQoJGEpIDAKICAgIHNldCBkZXNjX3RvZG8gJGxlZnRvdmVyCn0KCnByb2MgaXNfYW5jZXN0b3Ige2F9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHBhcmVudGxpc3QgY29tbWl0cm93IGFuY2VzdG9yIGFuY190b2RvCgogICAgc2V0IHYgJGN1cnZpZXcKICAgIHNldCBsYSAkY29tbWl0cm93KCR2LCRhKQogICAgc2V0IHRvZG8gJGFuY190b2RvCiAgICBzZXQgbGVmdG92ZXIge30KICAgIHNldCBkb25lIDAKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dfSB7aW5jciBpfSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAkaV0KCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkdiwkZG8pXSB8fCAkY29tbWl0cm93KCR2LCRkbykgPiAkbGF9IHsKCSAgICBsYXBwZW5kIGxlZnRvdmVyICRkbwoJICAgIGNvbnRpbnVlCgl9Cglmb3JlYWNoIG5wIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkdiwkZG8pXSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgYW5jZXN0b3IoJG5wKV19IHsKCQlzZXQgYW5jZXN0b3IoJG5wKSAxCgkJbGFwcGVuZCB0b2RvICRucAoJCWlmIHskbnAgZXEgJGF9IHsKCQkgICAgc2V0IGRvbmUgMQoJCX0KCSAgICB9Cgl9CglpZiB7JGRvbmV9IHsKCSAgICBzZXQgYW5jX3RvZG8gW2NvbmNhdCAkbGVmdG92ZXIgW2xyYW5nZSAkdG9kbyBbZXhwciB7JGkrMX1dIGVuZF1dCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYW5jZXN0b3IoJGEpIDAKICAgIHNldCBhbmNfdG9kbyAkbGVmdG92ZXIKfQoKcHJvYyBhc2tyZWxoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIGRlc2NlbmRlbnQgaGlnaGxpZ2h0X3JlbGF0ZWQgaWRkcmF3biBtYWluZm9udCByaGlnaGxpZ2h0cwogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBhbmNlc3RvcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGlzYm9sZCAwCiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50IiB8fAoJJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJOb3QgZGVzY2VuZGVudCJ9IHsKCWlmIHshW2luZm8gZXhpc3RzIGRlc2NlbmRlbnQoJGlkKV19IHsKCSAgICBpc19kZXNjZW5kZW50ICRpZAoJfQoJaWYgeyRkZXNjZW5kZW50KCRpZCkgPT0gKCRoaWdobGlnaHRfcmVsYXRlZCBlcSAiRGVzY2VuZGVudCIpfSB7CgkgICAgc2V0IGlzYm9sZCAxCgl9CiAgICB9IGVsc2VpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIGVxICJBbmNlc3RvciIgfHwKCSAgICAgICRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGFuY2VzdG9yIn0gewoJaWYgeyFbaW5mbyBleGlzdHMgYW5jZXN0b3IoJGlkKV19IHsKCSAgICBpc19hbmNlc3RvciAkaWQKCX0KCWlmIHskYW5jZXN0b3IoJGlkKSA9PSAoJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJBbmNlc3RvciIpfSB7CgkgICAgc2V0IGlzYm9sZCAxCgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHsKCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CiAgICB9CiAgICBzZXQgcmhpZ2hsaWdodHMoJHJvdykgJGlzYm9sZAp9Cgpwcm9jIG5leHRfaGxjb250IHt9IHsKICAgIGdsb2JhbCBmaGxfcm93IGZobF9kaXJuIGRpc3BsYXlvcmRlciBudW1jb21taXRzCiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKICAgIGdsb2JhbCBobHZpZXcgZmlsZWhpZ2hsaWdodCBmaW5kc3RyaW5nIGhpZ2hsaWdodF9yZWxhdGVkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZmhsX2Rpcm5dIHx8ICRmaGxfZGlybiA9PSAwfSByZXR1cm4KICAgIHNldCByb3cgJGZobF9yb3cKICAgIHdoaWxlIHsxfSB7CglpZiB7JHJvdyA8IDAgfHwgJHJvdyA+PSAkbnVtY29tbWl0c30gewoJICAgIGJlbGwKCSAgICBzZXQgZmhsX2Rpcm4gMAoJICAgIHJldHVybgoJfQoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJaWYge1tpbmZvIGV4aXN0cyBobHZpZXddfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrdmhpZ2hsaWdodCAkcm93ICRpZAoJICAgIH0KCSAgICBpZiB7JHZoaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWlmIHskZmluZHN0cmluZyBuZSB7fX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXX0gewoJCWFza2ZpbmRoaWdobGlnaHQgJHJvdyAkaWQKCSAgICB9CgkgICAgaWYgeyRuaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXX0gewoJCWFza3JlbGhpZ2hsaWdodCAkcm93ICRpZAoJICAgIH0KCSAgICBpZiB7JHJoaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV19IHsKCQkjIGFzayBmb3IgYSBmZXcgbW9yZSB3aGlsZSB3ZSdyZSBhdCBpdC4uLgoJCXNldCByICRyb3cKCQlmb3Ige3NldCBuIDB9IHskbiA8IDEwMH0ge2luY3Igbn0gewoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcildfSB7CgkJCWFza2ZpbGVoaWdobGlnaHQgJHIgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQoJCSAgICB9CgkJICAgIGluY3IgciAkZmhsX2Rpcm4KCQkgICAgaWYgeyRyIDwgMCB8fCAkciA+PSAkbnVtY29tbWl0c30gYnJlYWsKCQl9CgkJZmx1c2hoaWdobGlnaHRzCgkgICAgfQoJICAgIGlmIHskZmhpZ2hsaWdodHMoJHJvdykgPCAwfSB7CgkJc2V0IGZobF9yb3cgJHJvdwoJCXJldHVybgoJICAgIH0KCSAgICBpZiB7JGZoaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWluY3Igcm93ICRmaGxfZGlybgogICAgfQogICAgc2V0IGZobF9kaXJuIDAKICAgIHNlbGVjdGxpbmUgJHJvdyAxCn0KCnByb2MgbmV4dF9oaWdobGlnaHQge2Rpcm59IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgZmhsX3JvdyBmaGxfZGlybgogICAgZ2xvYmFsIGhsdmlldyBmaWxlaGlnaGxpZ2h0IGZpbmRzdHJpbmcgaGlnaGxpZ2h0X3JlbGF0ZWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGlmIHshKFtpbmZvIGV4aXN0cyBobHZpZXddIHx8ICRmaW5kc3RyaW5nIG5lIHt9IHx8CgkgICRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSIgfHwgW2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdKX0gcmV0dXJuCiAgICBzZXQgZmhsX3JvdyBbZXhwciB7JHNlbGVjdGVkbGluZSArICRkaXJufV0KICAgIHNldCBmaGxfZGlybiAkZGlybgogICAgbmV4dF9obGNvbnQKfQoKcHJvYyBjYW5jZWxfbmV4dF9oaWdobGlnaHQge30gewogICAgZ2xvYmFsIGZobF9kaXJuCgogICAgc2V0IGZobF9kaXJuIDAKfQoKIyBHcmFwaCBsYXlvdXQgZnVuY3Rpb25zCgpwcm9jIHNob3J0aWRzIHtpZHN9IHsKICAgIHNldCByZXMge30KICAgIGZvcmVhY2ggaWQgJGlkcyB7CglpZiB7W2xsZW5ndGggJGlkXSA+IDF9IHsKCSAgICBsYXBwZW5kIHJlcyBbc2hvcnRpZHMgJGlkXQoJfSBlbHNlaWYge1tyZWdleHAge15bMC05YS1mXXs0MH0kfSAkaWRdfSB7CgkgICAgbGFwcGVuZCByZXMgW3N0cmluZyByYW5nZSAkaWQgMCA3XQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHJlcyAkaWQKCX0KICAgIH0KICAgIHJldHVybiAkcmVzCn0KCnByb2MgaW5jcmFuZ2Uge2wgeCBvfSB7CiAgICBzZXQgbiBbbGxlbmd0aCAkbF0KICAgIHdoaWxlIHskeCA8ICRufSB7CglzZXQgZSBbbGluZGV4ICRsICR4XQoJaWYgeyRlIG5lIHt9fSB7CgkgICAgbHNldCBsICR4IFtleHByIHskZSArICRvfV0KCX0KCWluY3IgeAogICAgfQogICAgcmV0dXJuICRsCn0KCnByb2MgbnRpbWVzIHtuIG99IHsKICAgIHNldCByZXQge30KICAgIGZvciB7fSB7JG4gPiAwfSB7aW5jciBuIC0xfSB7CglsYXBwZW5kIHJldCAkbwogICAgfQogICAgcmV0dXJuICRyZXQKfQoKcHJvYyB1c2VkaW5yYW5nZSB7aWQgbDEgbDJ9IHsKICAgIGdsb2JhbCBjaGlsZHJlbiBjb21taXRyb3cgY2hpbGRsaXN0IGN1cnZpZXcKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJc2V0IHIgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCglpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0gewoJICAgIHJldHVybiBbZXhwciB7JHIgLSAkbDEgKyAxfV0KCX0KCXNldCBraWRzIFtsaW5kZXggJGNoaWxkbGlzdCAkcl0KICAgIH0gZWxzZSB7CglzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgfQogICAgZm9yZWFjaCBjICRraWRzIHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGMpCglpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0gewoJICAgIHJldHVybiBbZXhwciB7JHIgLSAkbDEgKyAxfV0KCX0KICAgIH0KICAgIHJldHVybiAwCn0KCnByb2Mgc2FuaXR5IHtyb3cge2Z1bGwgMH19IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBjb2wgLTEKICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBmb3JlYWNoIGlkICRpZHMgewoJaW5jciBjb2wKCWlmIHskaWQgZXEge319IGNvbnRpbnVlCglpZiB7JGNvbCA8IFtsbGVuZ3RoICRpZHNdIC0gMSAmJgoJICAgIFtsc2VhcmNoIC1leGFjdCAtc3RhcnQgW2V4cHIgeyRjb2wrMX1dICRpZHMgJGlkXSA+PSAwfSB7CgkgICAgcHV0cyAib29wczogW3Nob3J0aWRzICRpZF0gcmVwZWF0ZWQgaW4gcm93ICRyb3cgY29sICRjb2w6IHtbc2hvcnRpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXX0iCgl9CglzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KCXNldCB5ICRyb3cKCXNldCB4ICRjb2wKCXdoaWxlIHskbyBuZSB7fX0gewoJICAgIGluY3IgeSAtMQoJICAgIGluY3IgeCAkbwoJICAgIGlmIHtbbGluZGV4ICRyb3dpZGxpc3QgJHkgJHhdICE9ICRpZH0gewoJCXB1dHMgIm9vcHM6IHJvd29mZnNldHMgd3JvbmcgYXQgcm93IFtleHByIHskeSsxfV0gY29sIFtleHByIHskeC0kb31dIgoJCXB1dHMgIiAgaWQ9W3Nob3J0aWRzICRpZF0gY2hlY2sgc3RhcnRlZCBhdCByb3cgJHJvdyIKCQlmb3Ige3NldCBpICRyb3d9IHskaSA+PSAkeX0ge2luY3IgaSAtMX0gewoJCSAgICBwdXRzICIgIHJvdyAkaSBpZHM9e1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJGldXX0gb2Zmcz17W2xpbmRleCAkcm93b2Zmc2V0cyAkaV19IgoJCX0KCQlicmVhawoJICAgIH0KCSAgICBpZiB7ISRmdWxsfSBicmVhawoJICAgIHNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHkgJHhdCgl9CiAgICB9Cn0KCnByb2MgbWFrZXVwYXJyb3cge29pZCB4IHkgen0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIHVwYXJyb3dsZW4gaWRyb3dyYW5nZXMKCiAgICBmb3Ige3NldCBpIDF9IHskaSA8ICR1cGFycm93bGVuICYmICR5ID4gMX0ge2luY3IgaX0gewoJaW5jciB5IC0xCglpbmNyIHggJHoKCXNldCBvZmYwIFtsaW5kZXggJHJvd29mZnNldHMgJHldCglmb3Ige3NldCB4MCAkeH0gezF9IHtpbmNyIHgwfSB7CgkgICAgaWYgeyR4MCA+PSBbbGxlbmd0aCAkb2ZmMF19IHsKCQlzZXQgeDAgW2xsZW5ndGggW2xpbmRleCAkcm93b2Zmc2V0cyBbZXhwciB7JHktMX1dXV0KCQlicmVhawoJICAgIH0KCSAgICBzZXQgeiBbbGluZGV4ICRvZmYwICR4MF0KCSAgICBpZiB7JHogbmUge319IHsKCQlpbmNyIHgwICR6CgkJYnJlYWsKCSAgICB9Cgl9CglzZXQgeiBbZXhwciB7JHgwIC0gJHh9XQoJbHNldCByb3dpZGxpc3QgJHkgW2xpbnNlcnQgW2xpbmRleCAkcm93aWRsaXN0ICR5XSAkeCAkb2lkXQoJbHNldCByb3dvZmZzZXRzICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR6XQogICAgfQogICAgc2V0IHRtcCBbbHJlcGxhY2UgW2xpbmRleCAkcm93b2Zmc2V0cyAkeV0gJHggJHgge31dCiAgICBsc2V0IHJvd29mZnNldHMgJHkgW2luY3JhbmdlICR0bXAgW2V4cHIgeyR4KzF9XSAtMV0KICAgIGxhcHBlbmQgaWRyb3dyYW5nZXMoJG9pZCkgJHkKfQoKcHJvYyBpbml0bGF5b3V0IHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbQogICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBudW1jb21taXRzIGNhbnZ4bWF4IGNhbnYKICAgIGdsb2JhbCBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRsaXN0IGNoaWxkbGlzdCBjaGlsZHJlbgogICAgZ2xvYmFsIGNvbG9ybWFwIHJvd3RleHR4CiAgICBnbG9iYWwgbGluZXNlZ2VuZHMKCiAgICBzZXQgbnVtY29tbWl0cyAwCiAgICBzZXQgZGlzcGxheW9yZGVyIHt9CiAgICBzZXQgY29tbWl0bGlzdGVkIHt9CiAgICBzZXQgcGFyZW50bGlzdCB7fQogICAgc2V0IGNoaWxkbGlzdCB7fQogICAgc2V0IHJvd3JhbmdlbGlzdCB7fQogICAgc2V0IG5leHRjb2xvciAwCiAgICBzZXQgcm93aWRsaXN0IHt7fX0KICAgIHNldCByb3dvZmZzZXRzIHt7fX0KICAgIGNhdGNoIHt1bnNldCBpZGlubGlzdH0KICAgIGNhdGNoIHt1bnNldCByb3djaGt9CiAgICBzZXQgcm93bGFpZG91dCAwCiAgICBzZXQgcm93b3B0aW0gMAogICAgc2V0IGNhbnZ4bWF4IFskY2FudiBjZ2V0IC13aWR0aF0KICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KICAgIGNhdGNoIHt1bnNldCByb3d0ZXh0eH0KICAgIGNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KICAgIHNldCBsaW5lc2VnZW5kcyB7fQp9Cgpwcm9jIHNldGNhbnZzY3JvbGwge30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbnVtY29tbWl0cyBsaW5lc3BjIGNhbnZ4bWF4IGNhbnZ5MAoKICAgIHNldCB5bWF4IFtleHByIHskY2FudnkwICsgKCRudW1jb21taXRzIC0gMC41KSAqICRsaW5lc3BjICsgMn1dCiAgICAkY2FudiBjb25mIC1zY3JvbGxyZWdpb24gW2xpc3QgMCAwICRjYW52eG1heCAkeW1heF0KICAgICRjYW52MiBjb25mIC1zY3JvbGxyZWdpb24gW2xpc3QgMCAwIDAgJHltYXhdCiAgICAkY2FudjMgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQp9Cgpwcm9jIHZpc2libGVyb3dzIHt9IHsKICAgIGdsb2JhbCBjYW52IG51bWNvbW1pdHMgbGluZXNwYwoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCBmIFskY2FudiB5dmlld10KICAgIHNldCB5MCBbZXhwciB7aW50KFtsaW5kZXggJGYgMF0gKiAkeW1heCl9XQogICAgc2V0IHIwIFtleHByIHtpbnQoKCR5MCAtIDMpIC8gJGxpbmVzcGMpIC0gMX1dCiAgICBpZiB7JHIwIDwgMH0gewoJc2V0IHIwIDAKICAgIH0KICAgIHNldCB5MSBbZXhwciB7aW50KFtsaW5kZXggJGYgMV0gKiAkeW1heCl9XQogICAgc2V0IHIxIFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCiAgICBpZiB7JHIxID49ICRudW1jb21taXRzfSB7CglzZXQgcjEgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHIwICRyMV0KfQoKcHJvYyBsYXlvdXRtb3JlIHt0bWF4fSB7CiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbSBjb21taXRpZHggbnVtY29tbWl0cyBvcHRpbV9kZWxheQogICAgZ2xvYmFsIHVwYXJyb3dsZW4gY3VydmlldwoKICAgIHdoaWxlIHsxfSB7CglpZiB7JHJvd29wdGltIC0gJG9wdGltX2RlbGF5ID4gJG51bWNvbW1pdHN9IHsKCSAgICBzaG93c3R1ZmYgW2V4cHIgeyRyb3dvcHRpbSAtICRvcHRpbV9kZWxheX1dCgl9IGVsc2VpZiB7JHJvd2xhaWRvdXQgLSAkdXBhcnJvd2xlbiAtIDEgPiAkcm93b3B0aW19IHsKCSAgICBzZXQgbnIgW2V4cHIgeyRyb3dsYWlkb3V0IC0gJHVwYXJyb3dsZW4gLSAxIC0gJHJvd29wdGltfV0KCSAgICBpZiB7JG5yID4gMTAwfSB7CgkJc2V0IG5yIDEwMAoJICAgIH0KCSAgICBvcHRpbWl6ZV9yb3dzICRyb3dvcHRpbSAwIFtleHByIHskcm93b3B0aW0gKyAkbnJ9XQoJICAgIGluY3Igcm93b3B0aW0gJG5yCgl9IGVsc2VpZiB7JGNvbW1pdGlkeCgkY3VydmlldykgPiAkcm93bGFpZG91dH0gewoJICAgIHNldCBuciBbZXhwciB7JGNvbW1pdGlkeCgkY3VydmlldykgLSAkcm93bGFpZG91dH1dCgkgICAgIyBtYXkgbmVlZCB0byBpbmNyZWFzZSB0aGlzIHRocmVzaG9sZCBpZiB1cGFycm93bGVuIG9yCgkgICAgIyBtaW5nYXBsZW4gYXJlIGluY3JlYXNlZC4uLgoJICAgIGlmIHskbnIgPiAxNTB9IHsKCQlzZXQgbnIgMTUwCgkgICAgfQoJICAgIHNldCByb3cgJHJvd2xhaWRvdXQKCSAgICBzZXQgcm93bGFpZG91dCBbbGF5b3V0cm93cyAkcm93IFtleHByIHskcm93ICsgJG5yfV0gMF0KCSAgICBpZiB7JHJvd2xhaWRvdXQgPT0gJHJvd30gewoJCXJldHVybiAwCgkgICAgfQoJfSBlbHNlIHsKCSAgICByZXR1cm4gMAoJfQoJaWYgeyR0bWF4IG5lIHt9ICYmIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJHRtYXh9IHsKCSAgICByZXR1cm4gMQoJfQogICAgfQp9Cgpwcm9jIHNob3dzdHVmZiB7Y2Fuc2hvd30gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgY29tbWl0cm93IHBlbmRpbmdfc2VsZWN0IHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVzZWdlbmRzIGlkcm93cmFuZ2VzIGlkcmFuZ2VkcmF3biBjdXJ2aWV3CgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHsKCWdsb2JhbCBwaGFzZQoJc2V0IHBoYXNlICJpbmNyZHJhdyIKCWFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIH0KICAgIHNldCByb3cgJG51bWNvbW1pdHMKICAgIHNldCBudW1jb21taXRzICRjYW5zaG93CiAgICBzZXRjYW52c2Nyb2xsCiAgICBzZXQgcm93cyBbdmlzaWJsZXJvd3NdCiAgICBzZXQgcjAgW2xpbmRleCAkcm93cyAwXQogICAgc2V0IHIxIFtsaW5kZXggJHJvd3MgMV0KICAgIHNldCBzZWxyb3cgLTEKICAgIGZvciB7c2V0IHIgJHJvd30geyRyIDwgJGNhbnNob3d9IHtpbmNyIHJ9IHsKCWZvcmVhY2ggaWQgW2xpbmRleCAkbGluZXNlZ2VuZHMgW2V4cHIgeyRyKzF9XV0gewoJICAgIHNldCBpIC0xCgkgICAgZm9yZWFjaCB7cyBlfSBbcm93cmFuZ2VzICRpZF0gewoJCWluY3IgaQoJCWlmIHskZSBuZSB7fSAmJiAkZSA8ICRudW1jb21taXRzICYmICRzIDw9ICRyMSAmJiAkZSA+PSAkcjAKCQkgICAgJiYgIVtpbmZvIGV4aXN0cyBpZHJhbmdlZHJhd24oJGlkLCRpKV19IHsKCQkgICAgZHJhd2xpbmVzZWcgJGlkICRpCgkJICAgIHNldCBpZHJhbmdlZHJhd24oJGlkLCRpKSAxCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskY2Fuc2hvdyA+ICRyMX0gewoJc2V0IGNhbnNob3cgJHIxCiAgICB9CiAgICB3aGlsZSB7JHJvdyA8ICRjYW5zaG93fSB7CglkcmF3Y21pdHJvdyAkcm93CglpbmNyIHJvdwogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF0gJiYKCVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KV0gJiYKCSRjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KSA8ICRudW1jb21taXRzfSB7CglzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KSAxCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICFbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdfSB7CglzZWxlY3RsaW5lIDAgMQogICAgfQp9Cgpwcm9jIGxheW91dHJvd3Mge3JvdyBlbmRyb3cgbGFzdH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIHVwYXJyb3dsZW4gZG93bmFycm93bGVuIG1heHdpZHRoIG1pbmdhcGxlbgogICAgZ2xvYmFsIGNoaWxkbGlzdCBwYXJlbnRsaXN0CiAgICBnbG9iYWwgaWRyb3dyYW5nZXMgbGluZXNlZ2VuZHMKICAgIGdsb2JhbCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QKCiAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQogICAgd2hpbGUgeyRyb3cgPCAkZW5kcm93fSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglzZXQgb2xkb2xkcyB7fQoJc2V0IG5ld29sZHMge30KCWZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGlubGlzdCgkcCldfSB7CgkJbGFwcGVuZCBuZXdvbGRzICRwCgkgICAgfSBlbHNlaWYgeyEkaWRpbmxpc3QoJHApfSB7CgkJbGFwcGVuZCBvbGRvbGRzICRwCgkgICAgfQoJfQoJc2V0IGxzZSB7fQoJc2V0IG5ldiBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gKyBbbGxlbmd0aCAkbmV3b2xkc10KCQkgICAgICAgKyBbbGxlbmd0aCAkb2xkb2xkc10gLSAkbWF4d2lkdGggKyAxfV0KCWlmIHskbmV2ID4gMH0gewoJICAgIGlmIHshJGxhc3QgJiYKCQkkcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVuID49ICRjb21taXRpZHgoJGN1cnZpZXcpfSBicmVhawoJICAgIGZvciB7c2V0IHggW2xsZW5ndGggJGlkbGlzdF19IHtbaW5jciB4IC0xXSA+PSAwfSB7fSB7CgkJc2V0IGkgW2xpbmRleCAkaWRsaXN0ICR4XQoJCWlmIHshW2luZm8gZXhpc3RzIHJvd2NoaygkaSldIHx8ICRyb3cgPj0gJHJvd2NoaygkaSl9IHsKCQkgICAgc2V0IHIgW3VzZWRpbnJhbmdlICRpIFtleHByIHskcm93IC0gJGRvd25hcnJvd2xlbn1dIFwKCQkJICAgICAgIFtleHByIHskcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVufV1dCgkJICAgIGlmIHskciA9PSAwfSB7CgkJCXNldCBpZGxpc3QgW2xyZXBsYWNlICRpZGxpc3QgJHggJHhdCgkJCXNldCBvZmZzIFtscmVwbGFjZSAkb2ZmcyAkeCAkeF0KCQkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICR4IDFdCgkJCXNldCBpZGlubGlzdCgkaSkgMAoJCQlzZXQgcm0xIFtleHByIHskcm93IC0gMX1dCgkJCWxhcHBlbmQgbHNlICRpCgkJCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGkpICRybTEKCQkJaWYge1tpbmNyIG5ldiAtMV0gPD0gMH0gYnJlYWsKCQkJY29udGludWUKCQkgICAgfQoJCSAgICBzZXQgcm93Y2hrKCRpZCkgW2V4cHIgeyRyb3cgKyAkcn1dCgkJfQoJICAgIH0KCSAgICBsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJfQoJbGFwcGVuZCBsaW5lc2VnZW5kcyAkbHNlCglzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkaWRsaXN0ICRpZF0KCWlmIHskY29sIDwgMH0gewoJICAgIHNldCBjb2wgW2xsZW5ndGggJGlkbGlzdF0KCSAgICBsYXBwZW5kIGlkbGlzdCAkaWQKCSAgICBsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCSAgICBzZXQgeiB7fQoJICAgIGlmIHtbbGluZGV4ICRjaGlsZGxpc3QgJHJvd10gbmUge319IHsKCQlzZXQgeiBbZXhwciB7W2xsZW5ndGggW2xpbmRleCAkcm93aWRsaXN0IFtleHByIHskcm93LTF9XV1dIC0gJGNvbH1dCgkJdW5zZXQgaWRpbmxpc3QoJGlkKQoJICAgIH0KCSAgICBsYXBwZW5kIG9mZnMgJHoKCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJICAgIGlmIHskeiBuZSB7fX0gewoJCW1ha2V1cGFycm93ICRpZCAkY29sICRyb3cgJHoKCSAgICB9Cgl9IGVsc2UgewoJICAgIHVuc2V0IGlkaW5saXN0KCRpZCkKCX0KCXNldCByYW5nZXMge30KCWlmIHtbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV19IHsKCSAgICBzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCgkgICAgbGFwcGVuZCByYW5nZXMgJHJvdwoJICAgIHVuc2V0IGlkcm93cmFuZ2VzKCRpZCkKCX0KCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRyYW5nZXMKCWluY3Igcm93CglzZXQgb2ZmcyBbbnRpbWVzIFtsbGVuZ3RoICRpZGxpc3RdIDBdCglzZXQgbCBbbGxlbmd0aCAkbmV3b2xkc10KCXNldCBpZGxpc3QgW2V2YWwgbHJlcGxhY2UgXCRpZGxpc3QgJGNvbCAkY29sICRuZXdvbGRzXQoJc2V0IG8gMAoJaWYgeyRsICE9IDF9IHsKCSAgICBzZXQgb2ZmcyBbbHJhbmdlICRvZmZzIDAgW2V4cHIgeyRjb2wgLSAxfV1dCgkgICAgZm9yZWFjaCB4ICRuZXdvbGRzIHsKCQlsYXBwZW5kIG9mZnMge30KCQlpbmNyIG8gLTEKCSAgICB9CgkgICAgaW5jciBvCgkgICAgc2V0IHRtcCBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gLSBbbGxlbmd0aCAkb2Zmc119XQoJICAgIGlmIHskdG1wID4gMH0gewoJCXNldCBvZmZzIFtjb25jYXQgJG9mZnMgW250aW1lcyAkdG1wICRvXV0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGxzZXQgb2ZmcyAkY29sIHt9Cgl9Cglmb3JlYWNoIGkgJG5ld29sZHMgewoJICAgIHNldCBpZGlubGlzdCgkaSkgMQoJICAgIHNldCBpZHJvd3JhbmdlcygkaSkgJHJvdwoJfQoJaW5jciBjb2wgJGwKCWZvcmVhY2ggb2lkICRvbGRvbGRzIHsKCSAgICBzZXQgaWRpbmxpc3QoJG9pZCkgMQoJICAgIHNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sICRvaWRdCgkgICAgc2V0IG9mZnMgW2xpbnNlcnQgJG9mZnMgJGNvbCAkb10KCSAgICBtYWtldXBhcnJvdyAkb2lkICRjb2wgJHJvdyAkbwoJICAgIGluY3IgY29sCgl9CglsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CglsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKICAgIH0KICAgIHJldHVybiAkcm93Cn0KCnByb2MgYWRkZXh0cmFpZCB7aWQgcm93fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGNvbW1pdHJvdyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29tbWl0aWR4IGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIHBhcmVudGxpc3QgY2hpbGRsaXN0IGNoaWxkcmVuIGN1cnZpZXcKCiAgICBpbmNyIGNvbW1pdGlkeCgkY3VydmlldykKICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAogICAgbGFwcGVuZCBjb21taXRsaXN0ZWQgMAogICAgbGFwcGVuZCBwYXJlbnRsaXN0IHt9CiAgICBzZXQgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgJHJvdwogICAgcmVhZGNvbW1pdCAkaWQKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCXNldCBjb21taXRpbmZvKCRpZCkgeyJObyBjb21taXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIn0KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKSB7fQogICAgfQogICAgbGFwcGVuZCBjaGlsZGxpc3QgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKfQoKcHJvYyBsYXlvdXR0YWlsIHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZGlubGlzdCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIGlkcm93cmFuZ2VzIHJvd3JhbmdlbGlzdAoKICAgIHNldCByb3cgJGNvbW1pdGlkeCgkY3VydmlldykKICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICB3aGlsZSB7JGlkbGlzdCBuZSB7fX0gewoJc2V0IGNvbCBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gLSAxfV0KCXNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KCWFkZGV4dHJhaWQgJGlkICRyb3cKCXVuc2V0IGlkaW5saXN0KCRpZCkKCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93CglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkaWRyb3dyYW5nZXMoJGlkKQoJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJaW5jciByb3cKCXNldCBvZmZzIFtudGltZXMgJGNvbCAwXQoJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkY29sICRjb2xdCglsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CglsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKICAgIH0KCiAgICBmb3JlYWNoIGlkIFthcnJheSBuYW1lcyBpZGlubGlzdF0gewoJYWRkZXh0cmFpZCAkaWQgJHJvdwoJbHNldCByb3dpZGxpc3QgJHJvdyBbbGlzdCAkaWRdCglsc2V0IHJvd29mZnNldHMgJHJvdyAwCgltYWtldXBhcnJvdyAkaWQgMCAkcm93IDAKCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93CglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkaWRyb3dyYW5nZXMoJGlkKQoJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJaW5jciByb3cKCWxhcHBlbmQgcm93aWRsaXN0IHt9CglsYXBwZW5kIHJvd29mZnNldHMge30KICAgIH0KfQoKcHJvYyBpbnNlcnRfcGFkIHtyb3cgY29sIG5wYWR9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBwYWQgW250aW1lcyAkbnBhZCB7fV0KICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgW2V2YWwgbGluc2VydCBbbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dICRjb2wgJHBhZF0KICAgIHNldCB0bXAgW2V2YWwgbGluc2VydCBbbGlzdCBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddXSAkY29sICRwYWRdCiAgICBsc2V0IHJvd29mZnNldHMgJHJvdyBbaW5jcmFuZ2UgJHRtcCBbZXhwciB7JGNvbCArICRucGFkfV0gW2V4cHIgey0kbnBhZH1dXQp9Cgpwcm9jIG9wdGltaXplX3Jvd3Mge3JvdyBjb2wgZW5kcm93fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgaWRyb3dyYW5nZXMgZGlzcGxheW9yZGVyCgogICAgZm9yIHt9IHskcm93IDwgJGVuZHJvd30ge2luY3Igcm93fSB7CglzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQoJc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQoJc2V0IGhhc3BhZCAwCglmb3Ige30geyRjb2wgPCBbbGxlbmd0aCAkb2Zmc119IHtpbmNyIGNvbH0gewoJICAgIGlmIHtbbGluZGV4ICRpZGxpc3QgJGNvbF0gZXEge319IHsKCQlzZXQgaGFzcGFkIDEKCQljb250aW51ZQoJICAgIH0KCSAgICBzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkgICAgaWYgeyR6IGVxIHt9fSBjb250aW51ZQoJICAgIHNldCBpc2Fycm93IDAKCSAgICBzZXQgeDAgW2V4cHIgeyRjb2wgKyAken1dCgkgICAgc2V0IHkwIFtleHByIHskcm93IC0gMX1dCgkgICAgc2V0IHowIFtsaW5kZXggJHJvd29mZnNldHMgJHkwICR4MF0KCSAgICBpZiB7JHowIGVxIHt9fSB7CgkJc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJCXNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCgkJaWYgeyRyYW5nZXMgbmUge30gJiYgJHkwID4gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CgkJICAgIHNldCBpc2Fycm93IDEKCQl9CgkgICAgfQoJICAgIGlmIHskeiA8IC0xIHx8ICgkeiA8IDAgJiYgJGlzYXJyb3cpfSB7CgkJc2V0IG5wYWQgW2V4cHIgey0xIC0gJHogKyAkaXNhcnJvd31dCgkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgJG5wYWRdCgkJaW5zZXJ0X3BhZCAkeTAgJHgwICRucGFkCgkJaWYgeyR5MCA+IDB9IHsKCQkgICAgb3B0aW1pemVfcm93cyAkeTAgJHgwICRyb3cKCQl9CgkJc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQoJCXNldCB4MCBbZXhwciB7JGNvbCArICR6fV0KCQlzZXQgejAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTAgJHgwXQoJICAgIH0gZWxzZWlmIHskeiA+IDEgfHwgKCR6ID4gMCAmJiAkaXNhcnJvdyl9IHsKCQlzZXQgbnBhZCBbZXhwciB7JHogLSAxICsgJGlzYXJyb3d9XQoJCXNldCB5MSBbZXhwciB7JHJvdyArIDF9XQoJCXNldCBvZmZzMiBbbGluZGV4ICRyb3dvZmZzZXRzICR5MV0KCQlzZXQgeDEgLTEKCQlmb3JlYWNoIHogJG9mZnMyIHsKCQkgICAgaW5jciB4MQoJCSAgICBpZiB7JHogZXEge30gfHwgJHgxICsgJHogPCAkY29sfSBjb250aW51ZQoJCSAgICBpZiB7JHgxICsgJHogPiAkY29sfSB7CgkJCWluY3IgbnBhZAoJCSAgICB9CgkJICAgIGxzZXQgcm93b2Zmc2V0cyAkeTEgW2luY3JhbmdlICRvZmZzMiAkeDEgJG5wYWRdCgkJICAgIGJyZWFrCgkJfQoJCXNldCBwYWQgW250aW1lcyAkbnBhZCB7fV0KCQlzZXQgaWRsaXN0IFtldmFsIGxpbnNlcnQgXCRpZGxpc3QgJGNvbCAkcGFkXQoJCXNldCB0bXAgW2V2YWwgbGluc2VydCBcJG9mZnMgJGNvbCAkcGFkXQoJCWluY3IgY29sICRucGFkCgkJc2V0IG9mZnMgW2luY3JhbmdlICR0bXAgJGNvbCBbZXhwciB7LSRucGFkfV1dCgkJc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQoJCXNldCBoYXNwYWQgMQoJICAgIH0KCSAgICBpZiB7JHowIGVxIHt9ICYmICEkaXNhcnJvd30gewoJCSMgdGhpcyBsaW5lIGxpbmtzIHRvIGl0cyBmaXJzdCBjaGlsZCBvbiByb3cgJHJvdy0yCgkJc2V0IHJtMiBbZXhwciB7JHJvdyAtIDJ9XQoJCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJtMl0KCQlzZXQgeGMgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm0yXSAkaWRdCgkJaWYgeyR4YyA+PSAwfSB7CgkJICAgIHNldCB6MCBbZXhwciB7JHhjIC0gJHgwfV0KCQl9CgkgICAgfQoJICAgIGlmIHskejAgbmUge30gJiYgJHogPCAwICYmICR6MCA+IDB9IHsKCQlpbnNlcnRfcGFkICR5MCAkeDAgMQoJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkY29sIDFdCgkJb3B0aW1pemVfcm93cyAkeTAgW2V4cHIgeyR4MCArIDF9XSAkcm93CgkgICAgfQoJfQoJaWYgeyEkaGFzcGFkfSB7CgkgICAgc2V0IG8ge30KCSAgICBmb3Ige3NldCBjb2wgW2xsZW5ndGggJGlkbGlzdF19IHtbaW5jciBjb2wgLTFdID49IDB9IHt9IHsKCQlzZXQgbyBbbGluZGV4ICRvZmZzICRjb2xdCgkJaWYgeyRvIGVxIHt9fSB7CgkJICAgICMgY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGluayB0byB0aGUgZmlyc3QgY2hpbGQKCQkgICAgc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJCSAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQoJCSAgICBpZiB7JHJhbmdlcyBuZSB7fSAmJiAkcm93ID09IFtsaW5kZXggJHJhbmdlcyAwXX0gewoJCQkjIGl0IGlzLCB3b3JrIG91dCBvZmZzZXQgdG8gY2hpbGQKCQkJc2V0IHkwIFtleHByIHskcm93IC0gMX1dCgkJCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHkwXQoJCQlzZXQgeDAgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkeTBdICRpZF0KCQkJaWYgeyR4MCA+PSAwfSB7CgkJCSAgICBzZXQgbyBbZXhwciB7JHgwIC0gJGNvbH1dCgkJCX0KCQkgICAgfQoJCX0KCQlpZiB7JG8gZXEge30gfHwgJG8gPD0gMH0gYnJlYWsKCSAgICB9CgkgICAgaWYgeyRvIG5lIHt9ICYmIFtpbmNyIGNvbF0gPCBbbGxlbmd0aCAkaWRsaXN0XX0gewoJCXNldCB5MSBbZXhwciB7JHJvdyArIDF9XQoJCXNldCBvZmZzMiBbbGluZGV4ICRyb3dvZmZzZXRzICR5MV0KCQlzZXQgeDEgLTEKCQlmb3JlYWNoIHogJG9mZnMyIHsKCQkgICAgaW5jciB4MQoJCSAgICBpZiB7JHogZXEge30gfHwgJHgxICsgJHogPCAkY29sfSBjb250aW51ZQoJCSAgICBsc2V0IHJvd29mZnNldHMgJHkxIFtpbmNyYW5nZSAkb2ZmczIgJHgxIDFdCgkJICAgIGJyZWFrCgkJfQoJCXNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sIHt9XQoJCXNldCB0bXAgW2xpbnNlcnQgJG9mZnMgJGNvbCB7fV0KCQlpbmNyIGNvbAoJCXNldCBvZmZzIFtpbmNyYW5nZSAkdG1wICRjb2wgLTFdCgkgICAgfQoJfQoJbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0Cglsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJc2V0IGNvbCAwCiAgICB9Cn0KCnByb2MgeGMge3JvdyBjb2x9IHsKICAgIGdsb2JhbCBjYW52eDAgbGluZXNwYwogICAgcmV0dXJuIFtleHByIHskY2FudngwICsgJGNvbCAqICRsaW5lc3BjfV0KfQoKcHJvYyB5YyB7cm93fSB7CiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMKICAgIHJldHVybiBbZXhwciB7JGNhbnZ5MCArICRyb3cgKiAkbGluZXNwY31dCn0KCnByb2MgbGluZXdpZHRoIHtpZH0gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lIGx0aGlja25lc3MKCiAgICBzZXQgd2lkICRsdGhpY2tuZXNzCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXSAmJiAkaWQgZXEgJHRoaWNrZXJsaW5lfSB7CglzZXQgd2lkIFtleHByIHsyICogJGx0aGlja25lc3N9XQogICAgfQogICAgcmV0dXJuICR3aWQKfQoKcHJvYyByb3dyYW5nZXMge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgaWRyb3dyYW5nZXMgY29tbWl0cm93IHJvd2xhaWRvdXQgcm93cmFuZ2VsaXN0IGN1cnZpZXcKCiAgICBzZXQgcmFuZ2VzIHt9CiAgICBpZiB7JHBoYXNlIGVxIHt9IHx8CgkoW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXQoJICYmICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSA8ICRyb3dsYWlkb3V0KX0gewoJc2V0IHJhbmdlcyBbbGluZGV4ICRyb3dyYW5nZWxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkaWQpXQogICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0gewoJc2V0IHJhbmdlcyAkaWRyb3dyYW5nZXMoJGlkKQogICAgfQogICAgcmV0dXJuICRyYW5nZXMKfQoKcHJvYyBkcmF3bGluZXNlZyB7aWQgaX0gewogICAgZ2xvYmFsIHJvd29mZnNldHMgcm93aWRsaXN0CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyCiAgICBnbG9iYWwgY2FudiBjb2xvcm1hcCBsaW5lc3BjCiAgICBnbG9iYWwgbnVtY29tbWl0cyBjb21taXRyb3cgY3VydmlldwoKICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCiAgICBzZXQgZG93bmFycm93IDEKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCgkmJiAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgPCAkbnVtY29tbWl0c30gewoJc2V0IGRvd25hcnJvdyBbZXhwciB7JGkgPCBbbGxlbmd0aCAkcmFuZ2VzXSAvIDIgLSAxfV0KICAgIH0gZWxzZSB7CglzZXQgZG93bmFycm93IDEKICAgIH0KICAgIHNldCBzdGFydHJvdyBbbGluZGV4ICRyYW5nZXMgW2V4cHIgezIgKiAkaX1dXQogICAgc2V0IHJvdyBbbGluZGV4ICRyYW5nZXMgW2V4cHIgezIgKiAkaSArIDF9XV0KICAgIGlmIHskc3RhcnRyb3cgPT0gJHJvd30gcmV0dXJuCiAgICBhc3NpZ25jb2xvciAkaWQKICAgIHNldCBjb29yZHMge30KICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdCiAgICBpZiB7JGNvbCA8IDB9IHsKCXB1dHMgIm9vcHM6IGRyYXdsaW5lOiBpZCAkaWQgbm90IG9uIHJvdyAkcm93IgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbGFzdG8ge30KICAgIHNldCBucyAwCiAgICB3aGlsZSB7MX0gewoJc2V0IG8gW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICRjb2xdCglpZiB7JG8gZXEge319IGJyZWFrCglpZiB7JG8gbmUgJGxhc3RvfSB7CgkgICAgIyBjaGFuZ2luZyBkaXJlY3Rpb24KCSAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQoJICAgIHNldCB5IFt5YyAkcm93XQoJICAgIGxhcHBlbmQgY29vcmRzICR4ICR5CgkgICAgc2V0IGxhc3RvICRvCgl9CglpbmNyIGNvbCAkbwoJaW5jciByb3cgLTEKICAgIH0KICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCiAgICBzZXQgeSBbeWMgJHJvd10KICAgIGxhcHBlbmQgY29vcmRzICR4ICR5CiAgICBpZiB7JGkgPT0gMH0gewoJIyBkcmF3IHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZCBhcyBwYXJ0IG9mIHRoaXMgbGluZQoJaW5jciByb3cgLTEKCXNldCBjaGlsZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCXNldCBjY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGNoaWxkXQoJaWYgeyRjY29sID49IDB9IHsKCSAgICBzZXQgeCBbeGMgJHJvdyAkY2NvbF0KCSAgICBzZXQgeSBbeWMgJHJvd10KCSAgICBpZiB7JGNjb2wgPCAkY29sIC0gMX0gewoJCWxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskY29sIC0gMX1dXSBbeWMgJHJvd10KCSAgICB9IGVsc2VpZiB7JGNjb2wgPiAkY29sICsgMX0gewoJCWxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskY29sICsgMX1dXSBbeWMgJHJvd10KCSAgICB9CgkgICAgbGFwcGVuZCBjb29yZHMgJHggJHkKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkY29vcmRzXSA8IDR9IHJldHVybgogICAgaWYgeyRkb3duYXJyb3d9IHsKCSMgVGhpcyBsaW5lIGhhcyBhbiBhcnJvdyBhdCB0aGUgbG93ZXIgZW5kOiBjaGVjayBpZiB0aGUgYXJyb3cgaXMKCSMgb24gYSBkaWFnb25hbCBzZWdtZW50LCBhbmQgaWYgc28sIHdvcmsgYXJvdW5kIHRoZSBUayA4LjQKCSMgcmVmdXNhbCB0byBkcmF3IGFycm93cyBvbiBkaWFnb25hbCBsaW5lcy4KCXNldCB4MCBbbGluZGV4ICRjb29yZHMgMF0KCXNldCB4MSBbbGluZGV4ICRjb29yZHMgMl0KCWlmIHskeDAgIT0gJHgxfSB7CgkgICAgc2V0IHkwIFtsaW5kZXggJGNvb3JkcyAxXQoJICAgIHNldCB5MSBbbGluZGV4ICRjb29yZHMgM10KCSAgICBpZiB7JHkwIC0gJHkxIDw9IDIgKiAkbGluZXNwYyAmJiAkeDEgPT0gW2xpbmRleCAkY29vcmRzIDRdfSB7CgkJIyB3ZSBoYXZlIGEgbmVhcmJ5IHZlcnRpY2FsIHNlZ21lbnQsIGp1c3QgdHJpbSBvZmYgdGhlIGRpYWcgYml0CgkJc2V0IGNvb3JkcyBbbHJhbmdlICRjb29yZHMgMiBlbmRdCgkgICAgfSBlbHNlIHsKCQlzZXQgc2xvcGUgW2V4cHIgeygkeDAgLSAkeDEpIC8gKCR5MCAtICR5MSl9XQoJCXNldCB4aSBbZXhwciB7JHgwIC0gJHNsb3BlICogJGxpbmVzcGMgLyAyfV0KCQlzZXQgeWkgW2V4cHIgeyR5MCAtICRsaW5lc3BjIC8gMn1dCgkJc2V0IGNvb3JkcyBbbHJlcGxhY2UgJGNvb3JkcyAwIDEgJHhpICR5MCAkeGkgJHlpXQoJICAgIH0KCX0KICAgIH0KICAgIHNldCBhcnJvdyBbZXhwciB7MiAqICgkaSA+IDApICsgJGRvd25hcnJvd31dCiAgICBzZXQgYXJyb3cgW2xpbmRleCB7bm9uZSBmaXJzdCBsYXN0IGJvdGh9ICRhcnJvd10KICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRpZF0gXAoJICAgICAgIC1maWxsICRjb2xvcm1hcCgkaWQpIC10YWdzIGxpbmVzLiRpZCAtYXJyb3cgJGFycm93XQogICAgJGNhbnYgbG93ZXIgJHQKICAgIGJpbmRsaW5lICR0ICRpZAp9Cgpwcm9jIGRyYXdwYXJlbnRsaW5rcyB7aWQgcm93IGNvbCBvbGRzfSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IGNhbnYgY29sb3JtYXAKCiAgICBzZXQgcm93MiBbZXhwciB7JHJvdyArIDF9XQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgc2V0IHkyIFt5YyAkcm93Ml0KICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3cyXQogICAgIyBybXggPSByaWdodC1tb3N0IFggY29vcmQgdXNlZAogICAgc2V0IHJteCAwCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZHMgJHBdCglpZiB7JGkgPCAwfSB7CgkgICAgcHV0cyAib29wcywgcGFyZW50ICRwIG9mICRpZCBub3QgaW4gbGlzdCIKCSAgICBjb250aW51ZQoJfQoJc2V0IHgyIFt4YyAkcm93MiAkaV0KCWlmIHskeDIgPiAkcm14fSB7CgkgICAgc2V0IHJteCAkeDIKCX0KCXNldCByYW5nZXMgW3Jvd3JhbmdlcyAkcF0KCWlmIHskcmFuZ2VzIG5lIHt9ICYmICRyb3cyID09IFtsaW5kZXggJHJhbmdlcyAwXQoJICAgICYmICRyb3cyIDwgW2xpbmRleCAkcmFuZ2VzIDFdfSB7CgkgICAgIyBkcmF3bGluZXNlZyB3aWxsIGRvIHRoaXMgb25lIGZvciB1cwoJICAgIGNvbnRpbnVlCgl9Cglhc3NpZ25jb2xvciAkcAoJIyBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZWQgcGFyZW50cyBoZXJlLi4uCglzZXQgY29vcmRzIFtsaXN0ICR4ICR5XQoJaWYgeyRpIDwgJGNvbCAtIDF9IHsKCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGkgKyAxfV1dICR5Cgl9IGVsc2VpZiB7JGkgPiAkY29sICsgMX0gewoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSAtIDF9XV0gJHkKCX0KCWxhcHBlbmQgY29vcmRzICR4MiAkeTIKCXNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRwXSBcCgkJICAgLWZpbGwgJGNvbG9ybWFwKCRwKSAtdGFncyBsaW5lcy4kcF0KCSRjYW52IGxvd2VyICR0CgliaW5kbGluZSAkdCAkcAogICAgfQogICAgcmV0dXJuICRybXgKfQoKcHJvYyBkcmF3bGluZXMge2lkfSB7CiAgICBnbG9iYWwgY29sb3JtYXAgY2FudgogICAgZ2xvYmFsIGlkcmFuZ2VkcmF3bgogICAgZ2xvYmFsIGNoaWxkcmVuIGlkZHJhd24gY29tbWl0cm93IHJvd2lkbGlzdCBjdXJ2aWV3CgogICAgJGNhbnYgZGVsZXRlIGxpbmVzLiRpZAogICAgc2V0IG5yIFtleHByIHtbbGxlbmd0aCBbcm93cmFuZ2VzICRpZF1dIC8gMn1dCiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRucn0ge2luY3IgaX0gewoJaWYge1tpbmZvIGV4aXN0cyBpZHJhbmdlZHJhd24oJGlkLCRpKV19IHsKCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCX0KICAgIH0KICAgIGZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkgewoJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRjaGlsZCldfSB7CgkgICAgc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRjaGlsZCkKCSAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGNoaWxkXQoJICAgIGlmIHskY29sID49IDB9IHsKCQlkcmF3cGFyZW50bGlua3MgJGNoaWxkICRyb3cgJGNvbCBbbGlzdCAkaWRdCgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIGRyYXdjbWl0dGV4dCB7aWQgcm93IGNvbCBybXh9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNhbnYgY2FudjIgY2FudjMgY2FudnkwIGZnY29sb3IKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgY29tbWl0aW5mbyByb3dpZGxpc3QKICAgIGdsb2JhbCByb3d0ZXh0eCBpZHBvcyBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgY2FudnhtYXggYm9sZHJvd3MgYm9sZG5hbWVyb3dzIGZnY29sb3IKCiAgICBzZXQgb2ZpbGwgW2V4cHIge1tsaW5kZXggJGNvbW1pdGxpc3RlZCAkcm93XT8gImJsdWUiOiAid2hpdGUifV0KICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCiAgICBzZXQgeSBbeWMgJHJvd10KICAgIHNldCBvcmFkIFtleHByIHskbGluZXNwYyAvIDN9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBvdmFsIFtleHByIHskeCAtICRvcmFkfV0gW2V4cHIgeyR5IC0gJG9yYWR9XSBcCgkgICAgICAgW2V4cHIgeyR4ICsgJG9yYWQgLSAxfV0gW2V4cHIgeyR5ICsgJG9yYWQgLSAxfV0gXAoJICAgICAgIC1maWxsICRvZmlsbCAtb3V0bGluZSAkZmdjb2xvciAtd2lkdGggMSAtdGFncyBjaXJjbGVdCiAgICAkY2FudiByYWlzZSAkdAogICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQogICAgc2V0IHh0IFt4YyAkcm93IFtsbGVuZ3RoIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV1dCiAgICBpZiB7JHh0IDwgJHJteH0gewoJc2V0IHh0ICRybXgKICAgIH0KICAgIHNldCByb3d0ZXh0eCgkcm93KSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldCgl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeV0KICAgIH0KICAgIHNldCBoZWFkbGluZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMF0KICAgIHNldCBuYW1lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAxXQogICAgc2V0IGRhdGUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDJdCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSAkZGF0ZV0KICAgIHNldCBmb250ICRtYWluZm9udAogICAgc2V0IG5mb250ICRtYWluZm9udAogICAgc2V0IGlzYm9sZCBbaXNoaWdobGlnaHRlZCAkcm93XQogICAgaWYgeyRpc2JvbGQgPiAwfSB7CglsYXBwZW5kIGJvbGRyb3dzICRyb3cKCWxhcHBlbmQgZm9udCBib2xkCglpZiB7JGlzYm9sZCA+IDF9IHsKCSAgICBsYXBwZW5kIGJvbGRuYW1lcm93cyAkcm93CgkgICAgbGFwcGVuZCBuZm9udCBib2xkCgl9CiAgICB9CiAgICBzZXQgbGluZWh0YWcoJHJvdykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJGhlYWRsaW5lIC1mb250ICRmb250IC10YWdzIHRleHRdCiAgICAkY2FudiBiaW5kICRsaW5laHRhZygkcm93KSA8QnV0dG9uLTM+ICJyb3dtZW51ICVYICVZICRpZCIKICAgIHNldCBsaW5lbnRhZygkcm93KSBbJGNhbnYyIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IC1maWxsICRmZ2NvbG9yIFwKCQkJICAgIC10ZXh0ICRuYW1lIC1mb250ICRuZm9udCAtdGFncyB0ZXh0XQogICAgc2V0IGxpbmVkdGFnKCRyb3cpIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJGRhdGUgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRdCiAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICRoZWFkbGluZV19XQogICAgaWYgeyR4ciA+ICRjYW52eG1heH0gewoJc2V0IGNhbnZ4bWF4ICR4cgoJc2V0Y2FudnNjcm9sbAogICAgfQp9Cgpwcm9jIGRyYXdjbWl0cm93IHtyb3d9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcm93aWRsaXN0CiAgICBnbG9iYWwgaWRyYW5nZWRyYXduIGlkZHJhd24KICAgIGdsb2JhbCBjb21taXRpbmZvIHBhcmVudGxpc3QgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmluZHN0cmluZyBuaGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkIHJoaWdobGlnaHRzCgogICAgaWYgeyRyb3cgPj0gJG51bWNvbW1pdHN9IHJldHVybgogICAgZm9yZWFjaCBpZCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gewoJaWYgeyRpZCBlcSB7fX0gY29udGludWUKCXNldCBpIC0xCglmb3JlYWNoIHtzIGV9IFtyb3dyYW5nZXMgJGlkXSB7CgkgICAgaW5jciBpCgkgICAgaWYgeyRyb3cgPCAkc30gY29udGludWUKCSAgICBpZiB7JGUgZXEge319IGJyZWFrCgkgICAgaWYgeyRyb3cgPD0gJGV9IHsKCQlpZiB7JGUgPCAkbnVtY29tbWl0cyAmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCQkgICAgc2V0IGlkcmFuZ2VkcmF3bigkaWQsJGkpIDEKCQl9CgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICFbaW5mbyBleGlzdHMgdmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdICYmICFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2tmaWxlaGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7JGZpbmRzdHJpbmcgbmUge30gJiYgIVtpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza2ZpbmRoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUiICYmICFbaW5mbyBleGlzdHMgcmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2tyZWxoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gcmV0dXJuCiAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGlkXQogICAgaWYgeyRjb2wgPCAwfSB7CglwdXRzICJvb3BzLCByb3cgJHJvdyBpZCAkaWQgbm90IGluIGxpc3QiCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCWdldGNvbW1pdCAkaWQKICAgIH0KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQogICAgaWYgeyRvbGRzIG5lIHt9fSB7CglzZXQgcm14IFtkcmF3cGFyZW50bGlua3MgJGlkICRyb3cgJGNvbCAkb2xkc10KICAgIH0gZWxzZSB7CglzZXQgcm14IDAKICAgIH0KICAgIGRyYXdjbWl0dGV4dCAkaWQgJHJvdyAkY29sICRybXgKICAgIHNldCBpZGRyYXduKCRpZCkgMQp9Cgpwcm9jIGRyYXdmcmFjIHtmMCBmMX0gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgY2FudgogICAgZ2xvYmFsIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgeTAgW2V4cHIge2ludCgkZjAgKiAkeW1heCl9XQogICAgc2V0IHJvdyBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyb3cgPCAwfSB7CglzZXQgcm93IDAKICAgIH0KICAgIHNldCB5MSBbZXhwciB7aW50KCRmMSAqICR5bWF4KX1dCiAgICBzZXQgZW5kcm93IFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCiAgICBpZiB7JGVuZHJvdyA+PSAkbnVtY29tbWl0c30gewoJc2V0IGVuZHJvdyBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIH0KICAgIGZvciB7fSB7JHJvdyA8PSAkZW5kcm93fSB7aW5jciByb3d9IHsKCWRyYXdjbWl0cm93ICRyb3cKICAgIH0KfQoKcHJvYyBkcmF3dmlzaWJsZSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZXZhbCBkcmF3ZnJhYyBbJGNhbnYgeXZpZXddCn0KCnByb2MgY2xlYXJfZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgaWRkcmF3biBpZHJhbmdlZHJhd24KICAgIGdsb2JhbCB2aGlnaGxpZ2h0cyBmaGlnaGxpZ2h0cyBuaGlnaGxpZ2h0cyByaGlnaGxpZ2h0cwoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIGNhdGNoIHt1bnNldCBpZGRyYXdufQogICAgY2F0Y2gge3Vuc2V0IGlkcmFuZ2VkcmF3bn0KICAgIGNhdGNoIHt1bnNldCB2aGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCBmaGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCBuaGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KfQoKcHJvYyBmaW5kY3Jvc3NpbmdzIHtpZH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCBwYXJlbnRsaXN0IG51bWNvbW1pdHMgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKCiAgICBzZXQgY3Jvc3Mge30KICAgIHNldCBjY3Jvc3Mge30KICAgIGZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKCWlmIHskZSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBlIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQoJfQoJaWYgeyRlIDw9ICRzfSBjb250aW51ZQoJc2V0IHggW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkZV0gJGlkXQoJaWYgeyR4IDwgMH0gewoJICAgIHB1dHMgImZpbmRjcm9zc2luZ3M6IG9vcHMsIG5vIFtzaG9ydGlkcyAkaWRdIGluIHJvdyAkZSIKCSAgICBjb250aW51ZQoJfQoJZm9yIHtzZXQgcm93ICRlfSB7W2luY3Igcm93IC0xXSA+PSAkc30ge30gewoJICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJHJvd10KCSAgICBzZXQga2lkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJICAgIHNldCBraWR4IFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGtpZF0KCSAgICBpZiB7JGtpZHggPCAwfSBjb250aW51ZQoJICAgIHNldCBuZXh0cm93IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdyArIDF9XV0KCSAgICBmb3JlYWNoIHAgJG9sZHMgewoJCXNldCBweCBbbHNlYXJjaCAtZXhhY3QgJG5leHRyb3cgJHBdCgkJaWYgeyRweCA8IDB9IGNvbnRpbnVlCgkJaWYgeygka2lkeCA8ICR4ICYmICR4IDwgJHB4KSB8fCAoJHB4IDwgJHggJiYgJHggPCAka2lkeCl9IHsKCQkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkY2Nyb3NzICRwXSA+PSAwfSBjb250aW51ZQoJCSAgICBpZiB7JHggPT0gJHB4ICsgKCRraWR4IDwgJHB4PyAtMTogMSl9IHsKCQkJbGFwcGVuZCBjY3Jvc3MgJHAKCQkgICAgfSBlbHNlaWYge1tsc2VhcmNoIC1leGFjdCAkY3Jvc3MgJHBdIDwgMH0gewoJCQlsYXBwZW5kIGNyb3NzICRwCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIHNldCBpbmMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICR4XQoJICAgIGlmIHskaW5jIGVxIHt9fSBicmVhawoJICAgIGluY3IgeCAkaW5jCgl9CiAgICB9CiAgICByZXR1cm4gW2NvbmNhdCAkY2Nyb3NzIHt7fX0gJGNyb3NzXQp9Cgpwcm9jIGFzc2lnbmNvbG9yIHtpZH0gewogICAgZ2xvYmFsIGNvbG9ybWFwIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBjb21taXRyb3cgcGFyZW50bGlzdCBjaGlsZHJlbiBjaGlsZHJlbiBjdXJ2aWV3CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXX0gcmV0dXJuCiAgICBzZXQgbmNvbG9ycyBbbGxlbmd0aCAkY29sb3JzXQogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkY3VydmlldywkaWQpXX0gewoJc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKICAgIH0gZWxzZSB7CglzZXQga2lkcyB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA9PSAxfSB7CglzZXQgY2hpbGQgW2xpbmRleCAka2lkcyAwXQoJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJICAgICYmIFtsbGVuZ3RoIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpXV0gPT0gMX0gewoJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYmFkY29sb3JzIHt9CiAgICBzZXQgb3JpZ2JhZCB7fQogICAgZm9yZWFjaCB4IFtmaW5kY3Jvc3NpbmdzICRpZF0gewoJaWYgeyR4IGVxIHt9fSB7CgkgICAgIyBkZWxpbWl0ZXIgYmV0d2VlbiBjb3JuZXIgY3Jvc3NpbmdzIGFuZCBvdGhlciBjcm9zc2luZ3MKCSAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnMgLSAxfSBicmVhawoJICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKCX0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkeCldIDwgMH0gewoJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7Cglmb3JlYWNoIGNoaWxkICRraWRzIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCldIDwgMH0gewoJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgfQoJICAgIGZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKV0gewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCX0KCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzICRvcmlnYmFkCgl9CiAgICB9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbmNvbG9yc30ge2luY3IgaX0gewoJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCglpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBuZXh0Y29sb3IgMAoJfQoJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKICAgIH0KICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKfQoKcHJvYyBkcmF3dGFncyB7aWQgeCB4dCB5MX0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCiAgICBnbG9iYWwgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjb21taXRyb3cgcm93dGV4dHggY3VydmlldyBmZ2NvbG9yIGJnY29sb3IKCiAgICBzZXQgbWFya3Mge30KICAgIHNldCBudGFncyAwCiAgICBzZXQgbmhlYWRzIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgbWFya3MgJGlkdGFncygkaWQpCglzZXQgbnRhZ3MgW2xsZW5ndGggJG1hcmtzXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkaGVhZHMoJGlkKV0KCXNldCBuaGVhZHMgW2xsZW5ndGggJGlkaGVhZHMoJGlkKV0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRvdGhlcnJlZnMoJGlkKV0KICAgIH0KICAgIGlmIHskbWFya3MgZXEge319IHsKCXJldHVybiAkeHQKICAgIH0KCiAgICBzZXQgZGVsdGEgW2V4cHIge2ludCgwLjUgKiAoJGxpbmVzcGMgLSAkbHRoaWNrbmVzcykpfV0KICAgIHNldCB5dCBbZXhwciB7JHkxIC0gMC41ICogJGxpbmVzcGN9XQogICAgc2V0IHliIFtleHByIHskeXQgKyAkbGluZXNwYyAtIDF9XQogICAgc2V0IHh2YWxzIHt9CiAgICBzZXQgd3ZhbHMge30KICAgIHNldCBpIC0xCiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJaW5jciBpCglpZiB7JGkgPj0gJG50YWdzICYmICRpIDwgJG50YWdzICsgJG5oZWFkcyAmJiAkdGFnIGVxICRtYWluaGVhZH0gewoJICAgIHNldCB3aWQgW2ZvbnQgbWVhc3VyZSBbY29uY2F0ICRtYWluZm9udCBib2xkXSAkdGFnXQoJfSBlbHNlIHsKCSAgICBzZXQgd2lkIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0YWddCgl9CglsYXBwZW5kIHh2YWxzICR4dAoJbGFwcGVuZCB3dmFscyAkd2lkCglzZXQgeHQgW2V4cHIgeyR4dCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzcyArICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkeCAkeTEgW2xpbmRleCAkeHZhbHMgZW5kXSAkeTEgXAoJICAgICAgIC13aWR0aCAkbHRoaWNrbmVzcyAtZmlsbCBibGFjayAtdGFncyB0YWcuJGlkXQogICAgJGNhbnYgbG93ZXIgJHQKICAgIGZvcmVhY2ggdGFnICRtYXJrcyB4ICR4dmFscyB3aWQgJHd2YWxzIHsKCXNldCB4bCBbZXhwciB7JHggKyAkZGVsdGF9XQoJc2V0IHhyIFtleHByIHskeCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzc31dCglzZXQgZm9udCAkbWFpbmZvbnQKCWlmIHtbaW5jciBudGFncyAtMV0gPj0gMH0gewoJICAgICMgZHJhdyBhIHRhZwoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgcG9seWdvbiAkeCBbZXhwciB7JHl0ICsgJGRlbHRhfV0gJHhsICR5dCBcCgkJICAgICAgICR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByIHskeWIgLSAkZGVsdGF9XSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCQlpZiB7JHRhZyBlcSAkbWFpbmhlYWR9IHsKCQkgICAgbGFwcGVuZCBmb250IGJvbGQKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgY29sICIjZGRkZGZmIgoJICAgIH0KCSAgICBzZXQgeGwgW2V4cHIgeyR4bCAtICRkZWx0YS8yfV0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCgkgICAgaWYge1tyZWdleHAge14ocmVtb3Rlcy8uKi98cmVtb3Rlcy8pfSAkdGFnIG1hdGNoIHJlbW90ZXByZWZpeF19IHsKCSAgICAgICAgc2V0IHJ3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHJlbW90ZXByZWZpeF0KCQlzZXQgeGkgW2V4cHIgeyR4ICsgMX1dCgkJc2V0IHl0aSBbZXhwciB7JHl0ICsgMX1dCgkJc2V0IHhyaSBbZXhwciB7JHggKyAkcndpZH1dCgkJJGNhbnYgY3JlYXRlIHBvbHlnb24gJHhpICR5dGkgJHhyaSAkeXRpICR4cmkgJHliICR4aSAkeWIgXAoJCQktd2lkdGggMCAtZmlsbCAiI2ZmZGRhYSIgLXRhZ3MgdGFnLiRpZAoJICAgIH0KCX0KCXNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeGwgJHkxIC1hbmNob3IgdyAtdGV4dCAkdGFnIC1maWxsICRmZ2NvbG9yIFwKCQkgICAtZm9udCAkZm9udCAtdGFncyBbbGlzdCB0YWcuJGlkIHRleHRdXQoJaWYgeyRudGFncyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgl9IGVsc2VpZiB7JG5oZWFkcyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTM+IFtsaXN0IGhlYWRtZW51ICVYICVZICRpZCAkdGFnXQoJfQogICAgfQogICAgcmV0dXJuICR4dAp9Cgpwcm9jIHhjb29yZCB7aSBsZXZlbCBsbn0gewogICAgZ2xvYmFsIGNhbnZ4MCB4c3BjMSB4c3BjMgoKICAgIHNldCB4IFtleHByIHskY2FudngwICsgJGkgKiAkeHNwYzEoJGxuKX1dCiAgICBpZiB7JGkgPiAwICYmICRpID09ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgMC41ICogKCR4c3BjMiAtICR4c3BjMSgkbG4pKX1dCiAgICB9IGVsc2VpZiB7JGkgPiAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArICR4c3BjMiAtICR4c3BjMSgkbG4pfV0KICAgIH0KICAgIHJldHVybiAkeAp9Cgpwcm9jIHNob3dfc3RhdHVzIHttc2d9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGZnY29sb3IKCiAgICBjbGVhcl9kaXNwbGF5CiAgICAkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAkbXNnIC1mb250ICRtYWluZm9udCBcCgktdGFncyB0ZXh0IC1maWxsICRmZ2NvbG9yCn0KCnByb2MgZmluaXNoY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgY29tbWl0aWR4IHBoYXNlIGN1cnZpZXcKICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdAoKICAgIGlmIHskY29tbWl0aWR4KCRjdXJ2aWV3KSA+IDB9IHsKCWRyYXdyZXN0CiAgICB9IGVsc2UgewoJc2hvd19zdGF0dXMgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiCiAgICB9CiAgICBzZXQgcGhhc2Uge30KICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KfQoKIyBJbnNlcnQgYSBuZXcgY29tbWl0IGFzIHRoZSBjaGlsZCBvZiB0aGUgY29tbWl0IG9uIHJvdyAkcm93LgojIFRoZSBuZXcgY29tbWl0IHdpbGwgYmUgZGlzcGxheWVkIG9uIHJvdyAkcm93IGFuZCB0aGUgY29tbWl0cwojIG9uIHRoYXQgcm93IGFuZCBiZWxvdyB3aWxsIG1vdmUgZG93biBvbmUgcm93Lgpwcm9jIGluc2VydHJvdyB7cm93IG5ld2NtaXR9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcGFyZW50bGlzdCBjaGlsZGxpc3QgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgY29tbWl0cm93IGN1cnZpZXcgcm93aWRsaXN0IHJvd29mZnNldHMgbnVtY29tbWl0cwogICAgZ2xvYmFsIHJvd3JhbmdlbGlzdCBpZHJvd3JhbmdlcyByb3dsYWlkb3V0IHJvd29wdGltIG51bWNvbW1pdHMKICAgIGdsb2JhbCBsaW5lc2VnZW5kcyBzZWxlY3RlZGxpbmUKCiAgICBpZiB7JHJvdyA+PSAkbnVtY29tbWl0c30gewoJcHV0cyAib29wcywgaW5zZXJ0aW5nIG5ldyByb3cgJHJvdyBidXQgb25seSBoYXZlICRudW1jb21taXRzIHJvd3MiCglyZXR1cm4KICAgIH0KICAgIHNldCBwIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQogICAgc2V0IGRpc3BsYXlvcmRlciBbbGluc2VydCAkZGlzcGxheW9yZGVyICRyb3cgJG5ld2NtaXRdCiAgICBzZXQgcGFyZW50bGlzdCBbbGluc2VydCAkcGFyZW50bGlzdCAkcm93ICRwXQogICAgc2V0IGtpZHMgW2xpbmRleCAkY2hpbGRsaXN0ICRyb3ddCiAgICBsYXBwZW5kIGtpZHMgJG5ld2NtaXQKICAgIGxzZXQgY2hpbGRsaXN0ICRyb3cgJGtpZHMKICAgIHNldCBjaGlsZGxpc3QgW2xpbnNlcnQgJGNoaWxkbGlzdCAkcm93IHt9XQogICAgc2V0IGNvbW1pdGxpc3RlZCBbbGluc2VydCAkY29tbWl0bGlzdGVkICRyb3cgMV0KICAgIHNldCBsIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCiAgICBmb3Ige3NldCByICRyb3d9IHskciA8ICRsfSB7aW5jciByfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQoJc2V0IGNvbW1pdHJvdygkY3VydmlldywkaWQpICRyCiAgICB9CgogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KICAgIHNldCBuZXdvZmZzIHt9CiAgICBmb3JlYWNoIHggJGlkbGlzdCB7CglpZiB7JHggZXEge30gfHwgKCR4IGVxICRwICYmIFtsbGVuZ3RoICRraWRzXSA9PSAxKX0gewoJICAgIGxhcHBlbmQgbmV3b2ZmcyB7fQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIG5ld29mZnMgMAoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA9PSAxfSB7CglzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkaWRsaXN0ICRwXQoJbHNldCBpZGxpc3QgJGNvbCAkbmV3Y21pdAogICAgfSBlbHNlIHsKCXNldCBjb2wgW2xsZW5ndGggJGlkbGlzdF0KCWxhcHBlbmQgaWRsaXN0ICRuZXdjbWl0CglsYXBwZW5kIG9mZnMge30KCWxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCiAgICB9CiAgICBzZXQgcm93aWRsaXN0IFtsaW5zZXJ0ICRyb3dpZGxpc3QgJHJvdyAkaWRsaXN0XQogICAgc2V0IHJvd29mZnNldHMgW2xpbnNlcnQgJHJvd29mZnNldHMgW2V4cHIgeyRyb3crMX1dICRuZXdvZmZzXQoKICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbnNlcnQgJHJvd3JhbmdlbGlzdCAkcm93IHt9XQogICAgc2V0IGwgW2xsZW5ndGggJHJvd3JhbmdlbGlzdF0KICAgIGZvciB7c2V0IHIgMH0geyRyIDwgJGx9IHtpbmNyIHJ9IHsKCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRyXQoJaWYgeyRyYW5nZXMgbmUge30gJiYgW2xpbmRleCAkcmFuZ2VzIGVuZF0gPj0gJHJvd30gewoJICAgIHNldCBuZXdyYW5nZXMge30KCSAgICBmb3JlYWNoIHggJHJhbmdlcyB7CgkJaWYgeyR4ID49ICRyb3d9IHsKCQkgICAgbGFwcGVuZCBuZXdyYW5nZXMgW2V4cHIgeyR4ICsgMX1dCgkJfSBlbHNlIHsKCQkgICAgbGFwcGVuZCBuZXdyYW5nZXMgJHgKCQl9CgkgICAgfQoJICAgIGxzZXQgcm93cmFuZ2VsaXN0ICRyICRuZXdyYW5nZXMKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPiAxfSB7CglzZXQgcnAxIFtleHByIHskcm93ICsgMX1dCglzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkcnAxXQoJaWYgeyRyYW5nZXMgZXEge319IHsKCSAgICBzZXQgcmFuZ2VzIFtsaXN0ICRyb3cgJHJwMV0KCX0gZWxzZWlmIHtbbGluZGV4ICRyYW5nZXMgZW5kLTFdID09ICRycDF9IHsKCSAgICBsc2V0IHJhbmdlcyBlbmQtMSAkcm93Cgl9Cglsc2V0IHJvd3JhbmdlbGlzdCAkcnAxICRyYW5nZXMKICAgIH0KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIGlkcm93cmFuZ2VzXSB7CglzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCglpZiB7JHJhbmdlcyBuZSB7fSAmJiBbbGluZGV4ICRyYW5nZXMgZW5kXSA+PSAkcm93fSB7CgkgICAgc2V0IG5ld3JhbmdlcyB7fQoJICAgIGZvcmVhY2ggeCAkcmFuZ2VzIHsKCQlpZiB7JHggPj0gJHJvd30gewoJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyBbZXhwciB7JHggKyAxfV0KCQl9IGVsc2UgewoJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyAkeAoJCX0KCSAgICB9CgkgICAgc2V0IGlkcm93cmFuZ2VzKCRpZCkgJG5ld3JhbmdlcwoJfQogICAgfQoKICAgIHNldCBsaW5lc2VnZW5kcyBbbGluc2VydCAkbGluZXNlZ2VuZHMgJHJvdyB7fV0KCiAgICBpbmNyIHJvd2xhaWRvdXQKICAgIGluY3Igcm93b3B0aW0KICAgIGluY3IgbnVtY29tbWl0cwoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID49ICRyb3d9IHsKCWluY3Igc2VsZWN0ZWRsaW5lCiAgICB9CiAgICByZWRpc3BsYXkKfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2Mgbm93YnVzeSB7d2hhdH0gewogICAgZ2xvYmFsIGlzYnVzeQoKICAgIGlmIHtbYXJyYXkgbmFtZXMgaXNidXN5XSBlcSB7fX0gewoJLiBjb25maWcgLWN1cnNvciB3YXRjaAoJc2V0dGV4dGN1cnNvciB3YXRjaAogICAgfQogICAgc2V0IGlzYnVzeSgkd2hhdCkgMQp9Cgpwcm9jIG5vdGJ1c3kge3doYXR9IHsKICAgIGdsb2JhbCBpc2J1c3kgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCgogICAgY2F0Y2gge3Vuc2V0IGlzYnVzeSgkd2hhdCl9CiAgICBpZiB7W2FycmF5IG5hbWVzIGlzYnVzeV0gZXEge319IHsKCS4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKCXNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKICAgIH0KfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcwogICAgZ2xvYmFsIHJvd2xhaWRvdXQgY29tbWl0aWR4IGN1cnZpZXcKICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdAoKICAgIHNldCByb3cgJHJvd2xhaWRvdXQKICAgIGxheW91dHJvd3MgJHJvd2xhaWRvdXQgJGNvbW1pdGlkeCgkY3VydmlldykgMQogICAgbGF5b3V0dGFpbAogICAgb3B0aW1pemVfcm93cyAkcm93IDAgJGNvbW1pdGlkeCgkY3VydmlldykKICAgIHNob3dzdHVmZiAkY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCXNlbGVjdGxpbmUgMCAxCiAgICB9CgogICAgc2V0IGRyYXdtc2VjcyBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzfV0KICAgICNnbG9iYWwgbnVtY29tbWl0cwogICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKfQoKcHJvYyBmaW5kbWF0Y2hlcyB7Zn0gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCiAgICBpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CglzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZm91bmRzdHJpbmcgJGZdCiAgICB9IGVsc2UgewoJaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgc3RyIFtzdHJpbmcgdG9sb3dlciAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IHN0ciAkZgoJfQoJc2V0IG1hdGNoZXMge30KCXNldCBpIDAKCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZm91bmRzdHJpbmcgJHN0ciAkaV1dID49IDB9IHsKCSAgICBsYXBwZW5kIG1hdGNoZXMgW2xpc3QgJGogW2V4cHIgeyRqKyRmb3VuZHN0cmxlbi0xfV1dCgkgICAgc2V0IGkgW2V4cHIgeyRqICsgJGZvdW5kc3RybGVufV0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7fSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbwogICAgZ2xvYmFsIG51bWNvbW1pdHMgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgY2FudiBjYW52MiBjYW52MyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuIG1hdGNoc3RyaW5nCiAgICBnbG9iYWwgY29tbWl0ZGF0YQoKICAgIHN0b3BmaW5kcHJvYwogICAgdW5tYXJrbWF0Y2hlcwogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBmb2N1cyAuCiAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQogICAgaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCXNldCBmb3VuZHN0cmluZyBbc3RyaW5nIHRvbG93ZXIgJGZpbmRzdHJpbmddCiAgICB9IGVsc2UgewoJc2V0IGZvdW5kc3RyaW5nICRmaW5kc3RyaW5nCiAgICB9CiAgICBzZXQgZm91bmRzdHJsZW4gW3N0cmluZyBsZW5ndGggJGZpbmRzdHJpbmddCiAgICBpZiB7JGZvdW5kc3RybGVuID09IDB9IHJldHVybgogICAgcmVnc3ViIC1hbGwge1sqP1xbXFxdfSAkZm91bmRzdHJpbmcge1xcJn0gbWF0Y2hzdHJpbmcKICAgIHNldCBtYXRjaHN0cmluZyAiKiRtYXRjaHN0cmluZyoiCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgb2xkc2VsIC0xCiAgICB9IGVsc2UgewoJc2V0IG9sZHNlbCAkc2VsZWN0ZWRsaW5lCiAgICB9CiAgICBzZXQgZGlkc2VsIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgc2V0IGwgLTEKICAgIGZvcmVhY2ggaWQgJGRpc3BsYXlvcmRlciB7CglzZXQgZCAkY29tbWl0ZGF0YSgkaWQpCglpbmNyIGwKCWlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtyZWdleHAgJGZvdW5kc3RyaW5nICRkXQoJfSBlbHNlaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkbWF0Y2hzdHJpbmcgJGRdCgl9IGVsc2UgewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAkbWF0Y2hzdHJpbmcgJGRdCgl9CglpZiB7ISRkb2VzbWF0Y2h9IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgZ2V0Y29tbWl0ICRpZAoJfQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQlkcmF3Y21pdHJvdyAkbAoJCW1hcmttYXRjaGVzICRjYW52MiAkbCAkZiAkbGluZW50YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIge1tsaW5kZXggJG1hdGNoIDFdICsgMX1dCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9Cgpwcm9jIGZpbmRuZXh0IHtyZXN0YXJ0fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcwogICAgZ2xvYmFsIGN0ZXh0IGZpbmRvbGRjdXJzb3IgcGhhc2UgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CglpZiB7ISRkb25lfSB7CgkgICAgY2F0Y2gge2V4ZWMga2lsbCAkZmluZHByb2NwaWR9Cgl9CgljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KCXVuc2V0IGZpbmRwcm9jcGlkCiAgICB9CiAgICBjYXRjaCB7dW5zZXQgZmluZGlucHJvZ3Jlc3N9CiAgICBub3RidXN5IGZpbmQKfQoKIyBtYXJrIGEgY29tbWl0IGFzIG1hdGNoaW5nIGJ5IHB1dHRpbmcgYSB5ZWxsb3cgYmFja2dyb3VuZAojIGJlaGluZCB0aGUgaGVhZGxpbmUKcHJvYyBtYXJraGVhZGxpbmUge2wgaWR9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGxpbmVodGFnCgogICAgZHJhd2NtaXRyb3cgJGwKICAgIHNldCBiYm94IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCiAgICAkY2FudiBsb3dlciAkdAp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRzdGFydC0xfV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JGVuZH1dXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciB7JHgwKyR4b2ZmfV0gJHkwIFwKCQkgICBbZXhwciB7JHgwKyR4bGVuKzJ9XSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMKICAgIGdsb2JhbCByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJZ2V0Y29tbWl0ICRwCiAgICB9CiAgICBzZXQgbCAiLi4uIgogICAgaWYge1tsbGVuZ3RoICRjb21taXRpbmZvKCRwKV0gPiAxfSB7CglzZXQgbCBbbGluZGV4ICRjb21taXRpbmZvKCRwKSAwXQogICAgfQogICAgcmV0dXJuICIkcCAoJGwpXG4iCn0KCiMgYXBwZW5kIHNvbWUgdGV4dCB0byB0aGUgY3RleHQgd2lkZ2V0LCBhbmQgbWFrZSBhbnkgU0hBMSBJRAojIHRoYXQgd2Uga25vdyBhYm91dCBiZSBhIGNsaWNrYWJsZSBsaW5rLgpwcm9jIGFwcGVuZHdpdGhsaW5rcyB7dGV4dCB0YWdzfSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0gY3VydmlldwoKICAgIHNldCBzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkdGV4dCAkdGFncwogICAgc2V0IGxpbmtzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lIHtbMC05YS1mXXs0MH19ICR0ZXh0XQogICAgZm9yZWFjaCBsICRsaW5rcyB7CglzZXQgcyBbbGluZGV4ICRsIDBdCglzZXQgZSBbbGluZGV4ICRsIDFdCglzZXQgbGlua2lkIFtzdHJpbmcgcmFuZ2UgJHRleHQgJHMgJGVdCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGxpbmtpZCldfSBjb250aW51ZQoJaW5jciBlCgkkY3RleHQgdGFnIGFkZCBsaW5rICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYWRkIGxpbmskbGlua251bSAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGJpbmQgbGluayRsaW5rbnVtIDwxPiBcCgkgICAgW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyB2aWV3bmV4dGxpbmUge2Rpcn0gewogICAgZ2xvYmFsIGNhbnYgbGluZXNwYwoKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIge1tsaW5kZXggJHdub3cgMF0gKiAkeW1heH1dCiAgICBzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRkaXIgKiAkbGluZXNwY31dCiAgICBpZiB7JG5ld3RvcCA8IDB9IHsKCXNldCBuZXd0b3AgMAogICAgfSBlbHNlaWYgeyRuZXd0b3AgPiAkeW1heH0gewoJc2V0IG5ld3RvcCAkeW1heAogICAgfQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQp9CgojIGFkZCBhIGxpc3Qgb2YgdGFnIG9yIGJyYW5jaCBuYW1lcyBhdCBwb3NpdGlvbiBwb3MKIyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbmFtZXMgaW5zZXJ0ZWQKcHJvYyBhcHBlbmRyZWZzIHtwb3MgdGFncyB2YXJ9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRyb3cgbGlua251bSBjdXJ2aWV3ICR2YXIKCiAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggJHBvc31dfSB7CglyZXR1cm4gMAogICAgfQogICAgc2V0IHRhZ3MgW2xzb3J0ICR0YWdzXQogICAgc2V0IHNlcCB7fQogICAgZm9yZWFjaCB0YWcgJHRhZ3MgewoJc2V0IGlkIFtzZXQgJHZhclwoJHRhZ1wpXQoJc2V0IGxrIGxpbmskbGlua251bQoJaW5jciBsaW5rbnVtCgkkY3RleHQgaW5zZXJ0ICRwb3MgJHNlcAoJJGN0ZXh0IGluc2VydCAkcG9zICR0YWcgJGxrCgkkY3RleHQgdGFnIGNvbmYgJGxrIC1mb3JlZ3JvdW5kIGJsdWUKCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CgkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8MT4gXAoJCVtsaXN0IHNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDFdCgkgICAgJGN0ZXh0IHRhZyBjb25mICRsayAtdW5kZXJsaW5lIDEKCSAgICAkY3RleHQgdGFnIGJpbmQgJGxrIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CgkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQoJfQoJc2V0IHNlcCAiLCAiCiAgICB9CiAgICByZXR1cm4gW2xsZW5ndGggJHRhZ3NdCn0KCnByb2MgdGFnbGlzdCB7aWRzfSB7CiAgICBnbG9iYWwgaWR0YWdzCgogICAgc2V0IHRhZ3Mge30KICAgIGZvcmVhY2ggaWQgJGlkcyB7Cglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgIGxhcHBlbmQgdGFncyAkdGFnCgl9CiAgICB9CiAgICByZXR1cm4gJHRhZ3MKfQoKIyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGZpbmlzaGVkIGNvbXB1dGluZyB0aGUgbmVhcmJ5IHRhZ3MKcHJvYyBkaXNwbmVhcnRhZ3Mge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgY3RleHQgYW5jX3RhZ3MgZGVzY190YWdzIHNob3duZWFydGFncwogICAgZ2xvYmFsIGRlc2NfaGVhZHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICEkc2hvd25lYXJ0YWdzfSByZXR1cm4KICAgIHNldCBpZCAkY3VycmVudGlkCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJGlkKV19IHsKCWlmIHtbYXBwZW5kcmVmcyBicmFuY2ggJGRlc2NfaGVhZHMoJGlkKSBoZWFkaWRzXSA+IDF9IHsKCSAgICAkY3RleHQgaW5zZXJ0ICJicmFuY2ggLTJjIiAiZXMiCgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSB7CglhcHBlbmRyZWZzIGZvbGxvd3MgW3RhZ2xpc3QgJGFuY190YWdzKCRpZCldIHRhZ2lkcwogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGlkKV19IHsKCWFwcGVuZHJlZnMgcHJlY2VkZXMgW3RhZ2xpc3QgJGRlc2NfdGFncygkaWQpXSB0YWdpZHMKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNlbGVjdGxpbmUge2wgaXNuZXd9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNvbW1pdGluZm8gc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50bGlzdCBjaGlsZGxpc3QKICAgIGdsb2JhbCBjdXJyZW50aWQgc2hhMWVudHJ5CiAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MgbGlua251bQogICAgZ2xvYmFsIG1lcmdlbWF4IG51bWNvbW1pdHMgcGVuZGluZ19zZWxlY3QKICAgIGdsb2JhbCBjbWl0bW9kZSBkZXNjX3RhZ3MgYW5jX3RhZ3Mgc2hvd25lYXJ0YWdzIGFsbGNvbW1pdHMgZGVzY19oZWFkcwoKICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgbm9ybWFsbGluZQogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBpZiB7JGwgPCAwIHx8ICRsID49ICRudW1jb21taXRzfSByZXR1cm4KICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IHdib3QgW2V4cHIge1tsaW5kZXggJHdub3cgMV0gKiAkeW1heH1dCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQoJZHJhd3Zpc2libGUKICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbF0KICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCiAgICByaGlnaGxpZ2h0X3NlbCAkaWQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgc2V0IGxpbmtudW0gMAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gICRkYXRlXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDRdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgJGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KCiAgICBzZXQgaGVhZGVycyB7fQogICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkbF0KICAgIGlmIHtbbGxlbmd0aCAkb2xkc10gPiAxfSB7CglzZXQgbnAgMAoJZm9yZWFjaCBwICRvbGRzIHsKCSAgICBpZiB7JG5wID49ICRtZXJnZW1heH0gewoJCXNldCB0YWcgbW1heAoJICAgIH0gZWxzZSB7CgkJc2V0IHRhZyBtJG5wCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6ICIgJHRhZwoJICAgIGFwcGVuZHdpdGhsaW5rcyBbY29tbWl0X2Rlc2NyaXB0b3IgJHBdIHt9CgkgICAgaW5jciBucAoJfQogICAgfSBlbHNlIHsKCWZvcmVhY2ggcCAkb2xkcyB7CgkgICAgYXBwZW5kIGhlYWRlcnMgIlBhcmVudDogW2NvbW1pdF9kZXNjcmlwdG9yICRwXSIKCX0KICAgIH0KCiAgICBmb3JlYWNoIGMgW2xpbmRleCAkY2hpbGRsaXN0ICRsXSB7CglhcHBlbmQgaGVhZGVycyAiQ2hpbGQ6ICBbY29tbWl0X2Rlc2NyaXB0b3IgJGNdIgogICAgfQoKICAgICMgbWFrZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBTSEExIElEIGJlIGEgY2xpY2thYmxlIGxpbmsKICAgIGFwcGVuZHdpdGhsaW5rcyAkaGVhZGVycyB7fQogICAgaWYgeyRzaG93bmVhcnRhZ3N9IHsKCWlmIHshW2luZm8gZXhpc3RzIGFsbGNvbW1pdHNdfSB7CgkgICAgZ2V0YWxsY29tbWl0cwoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIkJyYW5jaDogIgoJJGN0ZXh0IG1hcmsgc2V0IGJyYW5jaCAiZW5kIC0xYyIKCSRjdGV4dCBtYXJrIGdyYXZpdHkgYnJhbmNoIGxlZnQKCWlmIHtbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkaWQpXX0gewoJICAgIGlmIHtbYXBwZW5kcmVmcyBicmFuY2ggJGRlc2NfaGVhZHMoJGlkKSBoZWFkaWRzXSA+IDF9IHsKCQkjIHR1cm4gIkJyYW5jaCIgaW50byAiQnJhbmNoZXMiCgkJJGN0ZXh0IGluc2VydCAiYnJhbmNoIC0yYyIgImVzIgoJICAgIH0KCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbkZvbGxvd3M6ICIKCSRjdGV4dCBtYXJrIHNldCBmb2xsb3dzICJlbmQgLTFjIgoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmb2xsb3dzIGxlZnQKCWlmIHtbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGlkKV19IHsKCSAgICBhcHBlbmRyZWZzIGZvbGxvd3MgW3RhZ2xpc3QgJGFuY190YWdzKCRpZCldIHRhZ2lkcwoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuUHJlY2VkZXM6ICIKCSRjdGV4dCBtYXJrIHNldCBwcmVjZWRlcyAiZW5kIC0xYyIKCSRjdGV4dCBtYXJrIGdyYXZpdHkgcHJlY2VkZXMgbGVmdAoJaWYge1tpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGlkKV19IHsKCSAgICBhcHBlbmRyZWZzIHByZWNlZGVzIFt0YWdsaXN0ICRkZXNjX3RhZ3MoJGlkKV0gdGFnaWRzCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICBhcHBlbmR3aXRobGlua3MgW2xpbmRleCAkaW5mbyA1XSB7Y29tbWVudH0KCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgY29tbWVudGVuZCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgogICAgaW5pdF9mbGlzdCAiQ29tbWVudHMiCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gewoJZ2V0dHJlZSAkaWQKICAgIH0gZWxzZWlmIHtbbGxlbmd0aCAkb2xkc10gPD0gMX0gewoJc3RhcnRkaWZmICRpZAogICAgfSBlbHNlIHsKCW1lcmdlZGlmZiAkaWQgJGwKICAgIH0KfQoKcHJvYyBzZWxmaXJzdGxpbmUge30gewogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAwIDEKfQoKcHJvYyBzZWxsYXN0bGluZSB7fSB7CiAgICBnbG9iYWwgbnVtY29tbWl0cwogICAgdW5tYXJrbWF0Y2hlcwogICAgc2V0IGwgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBzZWxuZXh0bGluZSB7ZGlyfSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpcn1dCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBzZWxuZXh0cGFnZSB7ZGlyfSB7CiAgICBnbG9iYWwgY2FudiBsaW5lc3BjIHNlbGVjdGVkbGluZSBudW1jb21taXRzCgogICAgc2V0IGxwcCBbZXhwciB7KFt3aW5mbyBoZWlnaHQgJGNhbnZdIC0gMikgLyAkbGluZXNwY31dCiAgICBpZiB7JGxwcCA8IDF9IHsKCXNldCBscHAgMQogICAgfQogICAgYWxsY2FudnMgeXZpZXcgc2Nyb2xsIFtleHByIHskZGlyICogJGxwcH1dIHVuaXRzCiAgICBkcmF3dmlzaWJsZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArICRkaXIgKiAkbHBwfV0KICAgIGlmIHskbCA8IDB9IHsKCXNldCBsIDAKICAgIH0gZWxzZWlmIHskbCA+PSAkbnVtY29tbWl0c30gewogICAgICAgIHNldCBsIFtleHByICRudW1jb21taXRzIC0gMV0KICAgIH0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHVuc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZAoKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGlkfQogICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAogICAgcmhpZ2hsaWdodF9ub25lCiAgICBjYW5jZWxfbmV4dF9oaWdobGlnaHQKfQoKcHJvYyByZXNlbGVjdGxpbmUge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBhZGR0b2hpc3Rvcnkge2NtZH0gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4IGN1cnZpZXcKCiAgICBzZXQgZWx0IFtsaXN0ICRjdXJ2aWV3ICRjbWRdCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRlbHR9IHsKCXJldHVybgogICAgfQoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGVsdF0KICAgIH0gZWxzZSB7CglsYXBwZW5kIGhpc3RvcnkgJGVsdAogICAgfQogICAgaW5jciBoaXN0b3J5aW5kZXgKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJLnRmLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfSBlbHNlIHsKCS50Zi5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQogICAgLnRmLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGdvZG8ge2VsdH0gewogICAgZ2xvYmFsIGN1cnZpZXcKCiAgICBzZXQgdmlldyBbbGluZGV4ICRlbHQgMF0KICAgIHNldCBjbWQgW2xpbmRleCAkZWx0IDFdCiAgICBpZiB7JGN1cnZpZXcgIT0gJHZpZXd9IHsKCXNob3d2aWV3ICR2aWV3CiAgICB9CiAgICBldmFsICRjbWQKfQoKcHJvYyBnb2JhY2sge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CglpbmNyIGhpc3RvcnlpbmRleCAtMQoJZ29kbyBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXQoJLnRmLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4IDw9IDF9IHsKCS50Zi5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdvZm9ydyB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5ICRoaXN0b3J5aW5kZXhdCglpbmNyIGhpc3RvcnlpbmRleAoJZ29kbyAkY21kCgkudGYuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+PSBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCS50Zi5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnZXR0cmVlIHtpZH0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMgZGlmZm1lcmdlaWQgdHJlZXBlbmRpbmcKCiAgICBzZXQgZGlmZmlkcyAkaWQKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVmaWxlbGlzdCgkaWQpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgaWYge1tjYXRjaCB7c2V0IGd0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGxzLXRyZWUgLXIgJGlkXSByXX1dfSB7CgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCB0cmVlcGVuZGluZyAkaWQKCSAgICBzZXQgdHJlZWZpbGVsaXN0KCRpZCkge30KCSAgICBzZXQgdHJlZWlkbGlzdCgkaWQpIHt9CgkgICAgZmNvbmZpZ3VyZSAkZ3RmIC1ibG9ja2luZyAwCgkgICAgZmlsZWV2ZW50ICRndGYgcmVhZGFibGUgW2xpc3QgZ2V0dHJlZWxpbmUgJGd0ZiAkaWRdCgl9CiAgICB9IGVsc2UgewoJc2V0ZmlsZWxpc3QgJGlkCiAgICB9Cn0KCnByb2MgZ2V0dHJlZWxpbmUge2d0ZiBpZH0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IHRyZWVwZW5kaW5nIGNtaXRtb2RlIGRpZmZpZHMKCiAgICB3aGlsZSB7W2dldHMgJGd0ZiBsaW5lXSA+PSAwfSB7CglpZiB7W2xpbmRleCAkbGluZSAxXSBuZSAiYmxvYiJ9IGNvbnRpbnVlCglzZXQgc2hhMSBbbGluZGV4ICRsaW5lIDJdCglzZXQgZm5hbWUgW2xpbmRleCAkbGluZSAzXQoJbGFwcGVuZCB0cmVlZmlsZWxpc3QoJGlkKSAkZm5hbWUKCWxhcHBlbmQgdHJlZWlkbGlzdCgkaWQpICRzaGExCiAgICB9CiAgICBpZiB7IVtlb2YgJGd0Zl19IHJldHVybgogICAgY2xvc2UgJGd0ZgogICAgdW5zZXQgdHJlZXBlbmRpbmcKICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCSAgICBnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCX0KICAgIH0gZWxzZWlmIHskaWQgbmUgJGRpZmZpZHN9IHsKCWdldHRyZWUgJGRpZmZpZHMKICAgIH0gZWxzZSB7CglzZXRmaWxlbGlzdCAkaWQKICAgIH0KfQoKcHJvYyBzaG93ZmlsZSB7Zn0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMKICAgIGdsb2JhbCBjdGV4dCBjb21tZW50ZW5kCgogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZmlsZWxpc3QoJGRpZmZpZHMpICRmXQogICAgaWYgeyRpIDwgMH0gewoJcHV0cyAib29wcywgJGYgbm90IGluIGxpc3QgZm9yIGlkICRkaWZmaWRzIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgYmxvYiBbbGluZGV4ICR0cmVlaWRsaXN0KCRkaWZmaWRzKSAkaV0KICAgIGlmIHtbY2F0Y2gge3NldCBiZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGNhdC1maWxlIGJsb2IgJGJsb2JdIHJdfSBlcnJdfSB7CglwdXRzICJvb3BzLCBlcnJvciByZWFkaW5nIGJsb2IgJGJsb2I6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIGZjb25maWd1cmUgJGJmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGJmIHJlYWRhYmxlIFtsaXN0IGdldGJsb2JsaW5lICRiZiAkZGlmZmlkc10KICAgICRjdGV4dCBjb25maWcgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQgJGNvbW1lbnRlbmQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICIkZlxuIiBmaWxlc2VwCiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHl2aWV3ICRjb21tZW50ZW5kCn0KCnByb2MgZ2V0YmxvYmxpbmUge2JmIGlkfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBjbWl0bW9kZSBjdGV4dAoKICAgIGlmIHskaWQgbmUgJGRpZmZpZHMgfHwgJGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJY2F0Y2gge2Nsb3NlICRiZn0KCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgbm9ybWFsCiAgICB3aGlsZSB7W2dldHMgJGJmIGxpbmVdID49IDB9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgogICAgfQogICAgaWYge1tlb2YgJGJmXX0gewoJIyBkZWxldGUgbGFzdCBuZXdsaW5lCgkkY3RleHQgZGVsZXRlICJlbmQgLSAyYyIgImVuZCAtIDFjIgoJY2xvc2UgJGJmCiAgICB9CiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIG1lcmdlZGlmZiB7aWQgbH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZvcHRzIG1kaWZmZmQKICAgIGdsb2JhbCBkaWZmaWRzCiAgICBnbG9iYWwgcGFyZW50bGlzdAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmaWRzICRpZAogICAgIyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBhY3R1YWxseSBhZmZlY3QgYW55dGhpbmcuLi4KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC0tY2MgJGlkXQogICAgaWYge1tjYXRjaCB7c2V0IG1kZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgZ2V0dGluZyBtZXJnZSBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgZmNvbmZpZ3VyZSAkbWRmIC1ibG9ja2luZyAwCiAgICBzZXQgbWRpZmZmZCgkaWQpICRtZGYKICAgIHNldCBucCBbbGxlbmd0aCBbbGluZGV4ICRwYXJlbnRsaXN0ICRsXV0KICAgIGZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWQgJG5wXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldG1lcmdlZGlmZmxpbmUge21kZiBpZCBucH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGN0ZXh0IGNmbGlzdCBuZXh0dXBkYXRlIG1lcmdlbWF4CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBtZGlmZmZkCgogICAgc2V0IG4gW2dldHMgJG1kZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJG1kZl19IHsKCSAgICBjbG9zZSAkbWRmCgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXSB8fCAkaWQgIT0gJGRpZmZtZXJnZWlkCgl8fCAkbWRmICE9ICRtZGlmZmZkKCRpZCl9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tY2MgKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCWxhcHBlbmQgZGlmZmZpbGVzdGFydCAkaGVyZQoJYWRkX2ZsaXN0IFtsaXN0ICRmbmFtZV0KCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkZm5hbWVdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGZuYW1lICRwYWRcbiIgZmlsZXNlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQH0gJGxpbmVdfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15bMC05YS1mXXs0MH0kfSAkbGluZV0gfHwgW3JlZ2V4cCB7XmluZGV4fSAkbGluZV19IHsKCSMgZG8gbm90aGluZwogICAgfSBlbHNlIHsKCSMgcGFyc2UgdGhlIHByZWZpeCAtIG9uZSAnICcsICctJyBvciAnKycgZm9yIGVhY2ggcGFyZW50CglzZXQgc3BhY2VzIHt9CglzZXQgbWludXNlcyB7fQoJc2V0IHBsdXNlcyB7fQoJc2V0IGlzYmFkIDAKCWZvciB7c2V0IGogMH0geyRqIDwgJG5wfSB7aW5jciBqfSB7CgkgICAgc2V0IGMgW3N0cmluZyByYW5nZSAkbGluZSAkaiAkal0KCSAgICBpZiB7JGMgPT0gIiAifSB7CgkJbGFwcGVuZCBzcGFjZXMgJGoKCSAgICB9IGVsc2VpZiB7JGMgPT0gIi0ifSB7CgkJbGFwcGVuZCBtaW51c2VzICRqCgkgICAgfSBlbHNlaWYgeyRjID09ICIrIn0gewoJCWxhcHBlbmQgcGx1c2VzICRqCgkgICAgfSBlbHNlIHsKCQlzZXQgaXNiYWQgMQoJCWJyZWFrCgkgICAgfQoJfQoJc2V0IHRhZ3Mge30KCXNldCBudW0ge30KCWlmIHshJGlzYmFkICYmICRtaW51c2VzIG5lIHt9ICYmICRwbHVzZXMgZXEge319IHsKCSAgICAjIGxpbmUgZG9lc24ndCBhcHBlYXIgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRtaW51c2VzIGhhdmUgdGhlIGxpbmUKCSAgICBzZXQgbnVtIFtsaW5kZXggJG1pbnVzZXMgMF0KCX0gZWxzZWlmIHshJGlzYmFkICYmICRwbHVzZXMgbmUge30gJiYgJG1pbnVzZXMgZXEge319IHsKCSAgICAjIGxpbmUgYXBwZWFycyBpbiByZXN1bHQsIHBhcmVudHMgaW4gJHBsdXNlcyBkb24ndCBoYXZlIHRoZSBsaW5lCgkgICAgbGFwcGVuZCB0YWdzIG1yZXN1bHQKCSAgICBzZXQgbnVtIFtsaW5kZXggJHNwYWNlcyAwXQoJfQoJaWYgeyRudW0gbmUge319IHsKCSAgICBpZiB7JG51bSA+PSAkbWVyZ2VtYXh9IHsKCQlzZXQgbnVtICJtYXgiCgkgICAgfQoJICAgIGxhcHBlbmQgdGFncyBtJG51bQoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iICR0YWdzCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZGYgJGlkICRucF0KICAgIH0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkCgogICAgc2V0IGRpZmZpZHMgJGlkcwogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGFkZF9mbGlzdCAkdHJlZWRpZmZzKCRpZHMpCiAgICBnZXRibG9iZGlmZnMgJGlkcwp9Cgpwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmYge30KICAgIGlmIHtbY2F0Y2ggXAoJIHtzZXQgZ2R0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtciAkaWRzXSByXX0gXAoJXX0gcmV0dXJuCiAgICBmY29uZmlndXJlICRnZHRmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGdkdGYgcmVhZGFibGUgW2xpc3QgZ2V0dHJlZWRpZmZsaW5lICRnZHRmICRpZHNdCn0KCnByb2MgZ2V0dHJlZWRpZmZsaW5lIHtnZHRmIGlkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHRyZWVkaWZmcyB0cmVlcGVuZGluZyBkaWZmaWRzIGRpZmZtZXJnZWlkCiAgICBnbG9iYWwgY21pdG1vZGUKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gewoJICAgIGdldHRyZWUgJGRpZmZpZHMKCX0gZWxzZWlmIHskaWRzICE9ICRkaWZmaWRzfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CgkJZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgkgICAgfQoJfSBlbHNlIHsKCSAgICBhZGR0b2NmbGlzdCAkaWRzCgl9CglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlIFtsaW5kZXggJGxpbmUgNV0KICAgIGxhcHBlbmQgdHJlZWRpZmYgJGZpbGUKfQoKcHJvYyBnZXRibG9iZGlmZnMge2lkc30gewogICAgZ2xvYmFsIGRpZmZvcHRzIGJsb2JkaWZmZmQgZGlmZmlkcyBlbnYgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yIC1wIC1DICRpZHNdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCn0KCnByb2Mgc2V0aW5saXN0IHt2YXIgaSB2YWx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgd2hpbGUge1tsbGVuZ3RoIFtzZXQgJHZhcl1dIDwgJGl9IHsKCWxhcHBlbmQgJHZhciB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoIFtzZXQgJHZhcl1dID09ICRpfSB7CglsYXBwZW5kICR2YXIgJHZhbAogICAgfSBlbHNlIHsKCWxzZXQgJHZhciAkaSAkdmFsCiAgICB9Cn0KCnByb2MgZ2V0YmxvYmRpZmZsaW5lIHtiZGYgaWRzfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBibG9iZGlmZmZkIGN0ZXh0IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmbmV4dGhlYWQgZGlmZm5leHRub3RlIGRpZmZmaWxlc3RhcnQKICAgIGdsb2JhbCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkYmRmXX0gewoJICAgIGNsb3NlICRiZGYKCSAgICBpZiB7JGlkcyA9PSAkZGlmZmlkcyAmJiAkYmRmID09ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyRpZHMgIT0gJGRpZmZpZHMgfHwgJGJkZiAhPSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWUgbmV3bmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGN1cnRhZ3N0YXJ0ICRoZXJlCglzZXQgaGVhZGVyICRuZXduYW1lCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkZm5hbWVdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRoZXJlCgl9CglpZiB7JG5ld25hbWUgbmUgJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGlkcykgJG5ld25hbWVdCgkgICAgaWYgeyRpID49IDB9IHsKCQlzZXRpbmxpc3QgZGlmZmZpbGVzdGFydCAkaSAkaGVyZQoJICAgIH0KCX0KCXNldCBjdXJkaWZmdGFnICJmOiRmbmFtZSIKCSRjdGV4dCB0YWcgZGVsZXRlICRjdXJkaWZmdGFnCglzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGhlYWRlcl0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkaGVhZGVyICRwYWRcbiIgZmlsZXNlcAoJc2V0IGRpZmZpbmhkciAxCiAgICB9IGVsc2VpZiB7JGRpZmZpbmhkciAmJiBbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCAzICRsaW5lICItLS0iXSA9PSAwfSB7CgkjIGRvIG5vdGhpbmcKICAgIH0gZWxzZWlmIHskZGlmZmluaGRyICYmIFtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIisrKyJdID09IDB9IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZCR0YWcKCX0gZWxzZWlmIHskeCA9PSAiICJ9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKCX0gZWxzZWlmIHskZGlmZmluaGRyIHx8ICR4ID09ICJcXCJ9IHsKCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfSBlbHNlIHsKCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJCXNldCBjdXJkaWZmdGFnIENvbW1lbnRzCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgfQp9Cgpwcm9jIHByZXZmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgcHJldiBbbGluZGV4ICRkaWZmZmlsZXN0YXJ0IDBdCiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRsb2MgPj0gJGhlcmVdfSB7CgkgICAgJGN0ZXh0IHl2aWV3ICRwcmV2CgkgICAgcmV0dXJuCgl9CglzZXQgcHJldiAkbG9jCiAgICB9CiAgICAkY3RleHQgeXZpZXcgJHByZXYKfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yZWFjaCBsb2MgJGRpZmZmaWxlc3RhcnQgewoJaWYge1skY3RleHQgY29tcGFyZSAkbG9jID4gJGhlcmVdfSB7CgkgICAgJGN0ZXh0IHl2aWV3ICRsb2MKCSAgICByZXR1cm4KCX0KICAgIH0KfQoKcHJvYyBjbGVhcl9jdGV4dCB7e2ZpcnN0IDEuMH19IHsKICAgIGdsb2JhbCBjdGV4dCBzbWFya3RvcCBzbWFya2JvdAoKICAgIHNldCBsIFtsaW5kZXggW3NwbGl0ICRmaXJzdCAuXSAwXQogICAgaWYgeyFbaW5mbyBleGlzdHMgc21hcmt0b3BdIHx8IFskY3RleHQgY29tcGFyZSAkZmlyc3QgPCAkc21hcmt0b3AuMF19IHsKCXNldCBzbWFya3RvcCAkbAogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc21hcmtib3RdIHx8IFskY3RleHQgY29tcGFyZSAkZmlyc3QgPCAkc21hcmtib3QuMF19IHsKCXNldCBzbWFya2JvdCAkbAogICAgfQogICAgJGN0ZXh0IGRlbGV0ZSAkZmlyc3QgZW5kCn0KCnByb2MgaW5jcnNlYXJjaCB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGN0ZXh0IHNlYXJjaHN0cmluZyBzZWFyY2hkaXJuCgogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgaWYge1tjYXRjaCB7JGN0ZXh0IGluZGV4IGFuY2hvcn1dfSB7CgkjIG5vIGFuY2hvciBzZXQsIHVzZSBzdGFydCBvZiBzZWxlY3Rpb24sIG9yIG9mIHZpc2libGUgYXJlYQoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIFtsaW5kZXggJHNlbCAwXQoJfSBlbHNlaWYgeyRzZWFyY2hkaXJuIGVxICItZm9yd2FyZHMifSB7CgkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCwwCgl9IGVsc2UgewoJICAgICRjdGV4dCBtYXJrIHNldCBhbmNob3IgQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdCgl9CiAgICB9CiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IGhlcmUgWyRjdGV4dCBzZWFyY2ggJHNlYXJjaGRpcm4gLS0gJHNlYXJjaHN0cmluZyBhbmNob3JdCglpZiB7JGhlcmUgbmUge319IHsKCSAgICAkY3RleHQgc2VlICRoZXJlCgl9CglzZWFyY2htYXJrdmlzaWJsZSAxCiAgICB9Cn0KCnByb2MgZG9zZWFyY2gge30gewogICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICBmb2N1cyAkc3N0cmluZwogICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKICAgIHNldCBzZWFyY2hkaXJuIC1mb3J3YXJkcwogICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKCXNldCBzZWwgWyRjdGV4dCB0YWcgcmFuZ2VzIHNlbF0KCWlmIHskc2VsIG5lIHt9fSB7CgkgICAgc2V0IHN0YXJ0ICJbbGluZGV4ICRzZWwgMF0gKyAxYyIKCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0gewoJICAgIHNldCBzdGFydCAiQDAsMCIKCX0KCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCglpZiB7JG1hdGNoIGVxIHt9fSB7CgkgICAgYmVsbAoJICAgIHJldHVybgoJfQoJJGN0ZXh0IHNlZSAkbWF0Y2gKCXNldCBtZW5kICIkbWF0Y2ggKyAkbWxlbiBjIgoJJGN0ZXh0IHRhZyBhZGQgc2VsICRtYXRjaCAkbWVuZAoJJGN0ZXh0IG1hcmsgdW5zZXQgYW5jaG9yCiAgICB9Cn0KCnByb2MgZG9zZWFyY2hiYWNrIHt9IHsKICAgIGdsb2JhbCBzc3RyaW5nIGN0ZXh0IHNlYXJjaHN0cmluZyBzZWFyY2hkaXJuCgogICAgZm9jdXMgJHNzdHJpbmcKICAgICRzc3RyaW5nIGljdXJzb3IgZW5kCiAgICBzZXQgc2VhcmNoZGlybiAtYmFja3dhcmRzCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkc2VsIDBdCgl9IGVsc2VpZiB7W2NhdGNoIHtzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCBhbmNob3JdfV19IHsKCSAgICBzZXQgc3RhcnQgQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdCgl9CglzZXQgbWF0Y2ggWyRjdGV4dCBzZWFyY2ggLWJhY2t3YXJkcyAtY291bnQgbWwgLS0gJHNlYXJjaHN0cmluZyAkc3RhcnRdCgkkY3RleHQgdGFnIHJlbW92ZSBzZWwgMS4wIGVuZAoJaWYgeyRtYXRjaCBlcSB7fX0gewoJICAgIGJlbGwKCSAgICByZXR1cm4KCX0KCSRjdGV4dCBzZWUgJG1hdGNoCglzZXQgbWVuZCAiJG1hdGNoICsgJG1sIGMiCgkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCgkkY3RleHQgbWFyayB1bnNldCBhbmNob3IKICAgIH0KfQoKcHJvYyBzZWFyY2htYXJrIHtmaXJzdCBsYXN0fSB7CiAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nCgogICAgc2V0IG1lbmQgJGZpcnN0LjAKICAgIHdoaWxlIHsxfSB7CglzZXQgbWF0Y2ggWyRjdGV4dCBzZWFyY2ggLWNvdW50IG1sZW4gLS0gJHNlYXJjaHN0cmluZyAkbWVuZCAkbGFzdC5lbmRdCglpZiB7JG1hdGNoIGVxIHt9fSBicmVhawoJc2V0IG1lbmQgIiRtYXRjaCArICRtbGVuIGMiCgkkY3RleHQgdGFnIGFkZCBmb3VuZCAkbWF0Y2ggJG1lbmQKICAgIH0KfQoKcHJvYyBzZWFyY2htYXJrdmlzaWJsZSB7ZG9hbGx9IHsKICAgIGdsb2JhbCBjdGV4dCBzbWFya3RvcCBzbWFya2JvdAoKICAgIHNldCB0b3BsaW5lIFtsaW5kZXggW3NwbGl0IFskY3RleHQgaW5kZXggQDAsMF0gLl0gMF0KICAgIHNldCBib3RsaW5lIFtsaW5kZXggW3NwbGl0IFskY3RleHQgaW5kZXggQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdXSAuXSAwXQogICAgaWYgeyRkb2FsbCB8fCAkYm90bGluZSA8ICRzbWFya3RvcCB8fCAkdG9wbGluZSA+ICRzbWFya2JvdH0gewoJIyBubyBvdmVybGFwIHdpdGggcHJldmlvdXMKCXNlYXJjaG1hcmsgJHRvcGxpbmUgJGJvdGxpbmUKCXNldCBzbWFya3RvcCAkdG9wbGluZQoJc2V0IHNtYXJrYm90ICRib3RsaW5lCiAgICB9IGVsc2UgewoJaWYgeyR0b3BsaW5lIDwgJHNtYXJrdG9wfSB7CgkgICAgc2VhcmNobWFyayAkdG9wbGluZSBbZXhwciB7JHNtYXJrdG9wLTF9XQoJICAgIHNldCBzbWFya3RvcCAkdG9wbGluZQoJfQoJaWYgeyRib3RsaW5lID4gJHNtYXJrYm90fSB7CgkgICAgc2VhcmNobWFyayBbZXhwciB7JHNtYXJrYm90KzF9XSAkYm90bGluZQoJICAgIHNldCBzbWFya2JvdCAkYm90bGluZQoJfQogICAgfQp9Cgpwcm9jIHNjcm9sbHRleHQge2YwIGYxfSB7CiAgICBnbG9iYWwgc2VhcmNoc3RyaW5nCgogICAgLmJsZWZ0LnNiIHNldCAkZjAgJGYxCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2VhcmNobWFya3Zpc2libGUgMAogICAgfQp9Cgpwcm9jIHNldGNvb3JkcyB7fSB7CiAgICBnbG9iYWwgbGluZXNwYyBjaGFyc3BjIGNhbnZ4MCBjYW52eTAgbWFpbmZvbnQKICAgIGdsb2JhbCB4c3BjMSB4c3BjMiBsdGhpY2tuZXNzCgogICAgc2V0IGxpbmVzcGMgW2ZvbnQgbWV0cmljcyAkbWFpbmZvbnQgLWxpbmVzcGFjZV0KICAgIHNldCBjaGFyc3BjIFtmb250IG1lYXN1cmUgJG1haW5mb250ICJtIl0KICAgIHNldCBjYW52eTAgW2V4cHIge2ludCgzICsgMC41ICogJGxpbmVzcGMpfV0KICAgIHNldCBjYW52eDAgW2V4cHIge2ludCgzICsgMC41ICogJGxpbmVzcGMpfV0KICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgc2V0IHhzcGMxKDApICRsaW5lc3BjCiAgICBzZXQgeHNwYzIgJGxpbmVzcGMKfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIGNhbnYKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgc3BhbiBbJGNhbnYgeXZpZXddCiAgICBjbGVhcl9kaXNwbGF5CiAgICBzZXRjYW52c2Nyb2xsCiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gW2xpbmRleCAkc3BhbiAwXQogICAgZHJhd3Zpc2libGUKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCiAgICB9Cn0KCnByb2MgaW5jcmZvbnQge2luY30gewogICAgZ2xvYmFsIG1haW5mb250IHRleHRmb250IGN0ZXh0IGNhbnYgcGhhc2UKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgdGV4dGZvbnQgW2xyZXBsYWNlICR0ZXh0Zm9udCAxIDEgW2V4cHIge1tsaW5kZXggJHRleHRmb250IDFdICsgJGluY31dXQogICAgc2V0Y29vcmRzCiAgICAkY3RleHQgY29uZiAtZm9udCAkdGV4dGZvbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJJGUgY29uZiAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIGlmIHskcGhhc2UgZXEgImdldGNvbW1pdHMifSB7CgkkY2FudiBpdGVtY29uZiB0ZXh0aXRlbXMgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICByZWRpc3BsYXkKfQoKcHJvYyBjbGVhcnNoYTEge30gewogICAgZ2xvYmFsIHNoYTFlbnRyeSBzaGExc3RyaW5nCiAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNoYTFzdHJpbmddID09IDQwfSB7Cgkkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgfQp9Cgpwcm9jIHNoYTFjaGFuZ2Uge24xIG4yIG9wfSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgc2hhMWJ1dAogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHtbJHNoYTFidXQgY2dldCAtc3RhdGVdID09ICRzdGF0ZX0gcmV0dXJuCiAgICBpZiB7JHN0YXRlID09ICJub3JtYWwifSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBub3JtYWwgLXJlbGllZiByYWlzZWQgLXRleHQgIkdvdG86ICIKICAgIH0gZWxzZSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgLXRleHQgIlNIQTEgSUQ6ICIKICAgIH0KfQoKcHJvYyBnb3RvY29tbWl0IHt9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBjb21taXRyb3cgdGFnaWRzIGhlYWRpZHMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbnVtY29tbWl0cyBjdXJ2aWV3CgogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhlYWRpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICRoZWFkaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yZWFjaCBpICRkaXNwbGF5b3JkZXIgewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkaQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDEKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWcvSGVhZCIKICAgIH0KICAgIGVycm9yX3BvcHVwICIkdHlwZSAkc2hhMXN0cmluZyBpcyBub3Qga25vd24iCn0KCnByb2MgbGluZWVudGVyIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCiAgICBzZXQgaG92ZXJ4ICR4CiAgICBzZXQgaG92ZXJ5ICR5CiAgICBzZXQgaG92ZXJpZCAkaWQKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCWFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgogICAgfQogICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICAkY2FudiBkZWxldGUgaG92ZXIKfQoKcHJvYyBsaW5lbW90aW9uIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CglzZXQgaG92ZXJ4ICR4CglzZXQgaG92ZXJ5ICR5CglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgl9CglzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgIH0KfQoKcHJvYyBsaW5lbGVhdmUge2lkfSB7CiAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJJGNhbnYgZGVsZXRlIGhvdmVyCglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgkgICAgdW5zZXQgaG92ZXJ0aW1lcgoJfQoJdW5zZXQgaG92ZXJpZAogICAgfQp9Cgpwcm9jIGxpbmVob3ZlciB7fSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKCiAgICBzZXQgdGV4dCBbbGluZGV4ICRjb21taXRpbmZvKCRob3ZlcmlkKSAwXQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KICAgIHNldCB5IFtleHByIHskaG92ZXJ5ICsgJHlmcmFjICogJHltYXggLSAkbGluZXNwYyAvIDJ9XQogICAgc2V0IHgwIFtleHByIHskeCAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB4MSBbZXhwciB7JHggKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF0gKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkxIFtleHByIHskeSArICRsaW5lc3BjICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCgkgICAgICAgLWZpbGwgXCNmZmZmODAgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDEgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgXAoJICAgICAgIC1mb250ICRtYWluZm9udF0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgY2xpY2tpc29uYXJyb3cge2lkIHl9IHsKICAgIGdsb2JhbCBsdGhpY2tuZXNzCgogICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KICAgIHNldCB0aHJlc2ggW2V4cHIgezIgKiAkbHRoaWNrbmVzcyArIDZ9XQogICAgc2V0IG4gW2V4cHIge1tsbGVuZ3RoICRyYW5nZXNdIC0gMX1dCiAgICBmb3Ige3NldCBpIDF9IHskaSA8ICRufSB7aW5jciBpfSB7CglzZXQgcm93IFtsaW5kZXggJHJhbmdlcyAkaV0KCWlmIHthYnMoW3ljICRyb3ddIC0gJHkpIDwgJHRocmVzaH0gewoJICAgIHJldHVybiAkaQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgYXJyb3dqdW1wIHtpZCBuIHl9IHsKICAgIGdsb2JhbCBjYW52CgogICAgIyAxIDwtPiAyLCAzIDwtPiA0LCBldGMuLi4KICAgIHNldCBuIFtleHByIHsoKCRuIC0gMSkgXiAxKSArIDF9XQogICAgc2V0IHJvdyBbbGluZGV4IFtyb3dyYW5nZXMgJGlkXSAkbl0KICAgIHNldCB5dCBbeWMgJHJvd10KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA8PSAwfSByZXR1cm4KICAgIHNldCB2aWV3IFskY2FudiB5dmlld10KICAgIHNldCB5c3BhbiBbZXhwciB7W2xpbmRleCAkdmlldyAxXSAtIFtsaW5kZXggJHZpZXcgMF19XQogICAgc2V0IHlmcmFjIFtleHByIHskeXQgLyAkeW1heCAtICR5c3BhbiAvIDJ9XQogICAgaWYgeyR5ZnJhYyA8IDB9IHsKCXNldCB5ZnJhYyAwCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gJHlmcmFjCn0KCnByb2MgbGluZWNsaWNrIHt4IHkgaWQgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNhbnYgdGhpY2tlcmxpbmUgY3VydmlldwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCiAgICB1bm1hcmttYXRjaGVzCiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgIyBkcmF3IHRoaXMgbGluZSB0aGlja2VyIHRoYW4gbm9ybWFsCiAgICBzZXQgdGhpY2tlcmxpbmUgJGlkCiAgICBkcmF3bGluZXMgJGlkCiAgICBpZiB7JGlzbmV3fSB7CglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglpZiB7JHltYXggZXEge319IHJldHVybgoJc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQoJc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgfQogICAgc2V0IGRpcm4gW2NsaWNraXNvbmFycm93ICRpZCAkeV0KICAgIGlmIHskZGlybiBuZSB7fX0gewoJYXJyb3dqdW1wICRpZCAkZGlybiAkeQoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IGxpbmVjbGljayAkeCAkeSAkaWQgMF0KICAgIH0KICAgICMgZmlsbCB0aGUgZGV0YWlscyBwYW5lIHdpdGggaW5mbyBhYm91dCB0aGlzIGxpbmUKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50Olx0IgogICAgJGN0ZXh0IGluc2VydCBlbmQgJGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJGlkXQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0RGF0ZTpcdCRkYXRlXG4iCiAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgaWYgeyRraWRzIG5lIHt9fSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglzZXQgaSAwCglmb3JlYWNoIGNoaWxkICRraWRzIHsKCSAgICBpbmNyIGkKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRjaGlsZCldICYmICFbZ2V0Y29tbWl0ICRjaGlsZF19IGNvbnRpbnVlCgkgICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGNoaWxkKQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0IgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICRjaGlsZCBbbGlzdCBsaW5rIGxpbmskaV0KCSAgICAkY3RleHQgdGFnIGJpbmQgbGluayRpIDwxPiBbbGlzdCBzZWxieWlkICRjaGlsZF0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF0iCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdIgoJICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHREYXRlOlx0JGRhdGVcbiIKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaW5pdF9mbGlzdCB7fQp9Cgpwcm9jIG5vcm1hbGxpbmUge30gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXX0gewoJc2V0IGlkICR0aGlja2VybGluZQoJdW5zZXQgdGhpY2tlcmxpbmUKCWRyYXdsaW5lcyAkaWQKICAgIH0KfQoKcHJvYyBzZWxieWlkIHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdHJvdyBjdXJ2aWV3CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQogICAgfQp9Cgpwcm9jIG1zdGltZSB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc3RpbWUKICAgIGlmIHshW2luZm8gZXhpc3RzIHN0YXJ0bXN0aW1lXX0gewoJc2V0IHN0YXJ0bXN0aW1lIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIH0KICAgIHJldHVybiBbZm9ybWF0ICIlLjNmIiBbZXhwciB7KFtjbG9jayBjbGljayAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zdGltZSkgLyAxMDAwLjB9XV0KfQoKcHJvYyByb3dtZW51IHt4IHkgaWR9IHsKICAgIGdsb2JhbCByb3djdHhtZW51IGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgcm93bWVudWlkIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdCgl8fCAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgZXEgJHNlbGVjdGVkbGluZX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgIkRpZmYgdGhpcyoiIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlICJEaWZmIHNlbGVjdGVkKiIgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgIk1ha2UgcGF0Y2giIC1zdGF0ZSAkc3RhdGUKICAgIHNldCByb3dtZW51aWQgJGlkCiAgICB0a19wb3B1cCAkcm93Y3R4bWVudSAkeCAkeQp9Cgpwcm9jIGRpZmZ2c3NlbCB7ZGlybn0gewogICAgZ2xvYmFsIHJvd21lbnVpZCBzZWxlY3RlZGxpbmUgZGlzcGxheW9yZGVyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KCXNldCBuZXdpZCAkcm93bWVudWlkCiAgICB9IGVsc2UgewoJc2V0IG9sZGlkICRyb3dtZW51aWQKCXNldCBuZXdpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KICAgIH0KICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KICAgIGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkCn0KCnByb2MgZG9zZWxkaWZmIHtvbGRpZCBuZXdpZH0gewogICAgZ2xvYmFsIGN0ZXh0CiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICBpbml0X2ZsaXN0ICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAiCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG9sZGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXG5UbyAgICIKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMSA8MT4gW2xpc3Qgc2VsYnlpZCAkbmV3aWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG9sZGlkICRuZXdpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IGZuYW1lIFskcGF0Y2h0b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQgZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgW2dpdGRpcl0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICByZWRyYXd0YWdzICRpZAogICAgYWRkZWR0YWcgJGlkCn0KCnByb2MgcmVkcmF3dGFncyB7aWR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIGNvbW1pdHJvdyBpZHBvcyBzZWxlY3RlZGxpbmUgY3VydmlldwogICAgZ2xvYmFsIG1haW5mb250IGNhbnZ4bWF4CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSByZXR1cm4KICAgIGRyYXdjbWl0cm93ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQogICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKICAgIHNldCB4dCBbZXZhbCBkcmF3dGFncyAkaWQgJGlkcG9zKCRpZCldCiAgICAkY2FudiBjb29yZHMgJGxpbmVodGFnKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgJHh0IFtsaW5kZXggJGlkcG9zKCRpZCkgMl0KICAgIHNldCB0ZXh0IFskY2FudiBpdGVtY2dldCAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAtdGV4dF0KICAgIHNldCB4ciBbZXhwciB7JHh0ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdfV0KICAgIGlmIHskeHIgPiAkY2FudnhtYXh9IHsKCXNldCBjYW52eG1heCAkeHIKCXNldGNhbnZzY3JvbGwKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQoJJiYgJHNlbGVjdGVkbGluZSA9PSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCl9IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCiAgICB9Cn0KCnByb2MgbWt0YWdjYW4ge30gewogICAgZ2xvYmFsIG1rdGFndG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJG1rdGFndG9wfQogICAgdW5zZXQgbWt0YWd0b3AKfQoKcHJvYyBta3RhZ2dvIHt9IHsKICAgIGRvbWt0YWcKICAgIG1rdGFnY2FuCn0KCnByb2Mgd3JpdGVjb21taXQge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCB3cmNvbXRvcCBjb21taXRpbmZvIHdyY29tY21kCgogICAgc2V0IHRvcCAud3JpdGVjb21taXQKICAgIHNldCB3cmNvbXRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuY2xhYiAtdGV4dCAiQ29tbWFuZDoiCiAgICBlbnRyeSAkdG9wLmNtZCAtd2lkdGggNjAgLXRleHR2YXJpYWJsZSB3cmNvbWNtZAogICAgZ3JpZCAkdG9wLmNsYWIgJHRvcC5jbWQgLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAiY29tbWl0LVtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDZdIl0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJXcml0ZSIgLWNvbW1hbmQgd3Jjb21nbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgd3Jjb21jYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIHdyY29tZ28ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgc2V0IGlkIFskd3Jjb210b3Auc2hhMSBnZXRdCiAgICBzZXQgY21kICJlY2hvICRpZCB8IFskd3Jjb210b3AuY21kIGdldF0iCiAgICBzZXQgZm5hbWUgWyR3cmNvbXRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIHNoIC1jICRjbWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igd3JpdGluZyBjb21taXQ6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIHdyY29tY2FuIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2MgbWticmFuY2gge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta2JydG9wCgogICAgc2V0IHRvcCAubWFrZWJyYW5jaAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSBuZXcgYnJhbmNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5ubGFiIC10ZXh0ICJOYW1lOiIKICAgIGVudHJ5ICR0b3AubmFtZSAtd2lkdGggNDAKICAgIGdyaWQgJHRvcC5ubGFiICR0b3AubmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nbyAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBbbGlzdCBta2JyZ28gJHRvcF0KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kICJjYXRjaCB7ZGVzdHJveSAkdG9wfSIKICAgIGdyaWQgJHRvcC5idXRzLmdvICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLm5hbWUKfQoKcHJvYyBta2JyZ28ge3RvcH0gewogICAgZ2xvYmFsIGhlYWRpZHMgaWRoZWFkcwoKICAgIHNldCBuYW1lIFskdG9wLm5hbWUgZ2V0XQogICAgc2V0IGlkIFskdG9wLnNoYTEgZ2V0XQogICAgaWYgeyRuYW1lIGVxIHt9fSB7CgllcnJvcl9wb3B1cCAiUGxlYXNlIHNwZWNpZnkgYSBuYW1lIGZvciB0aGUgbmV3IGJyYW5jaCIKCXJldHVybgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIG5vd2J1c3kgbmV3YnJhbmNoCiAgICB1cGRhdGUKICAgIGlmIHtbY2F0Y2ggewoJZXhlYyBnaXQgYnJhbmNoICRuYW1lICRpZAogICAgfSBlcnJdfSB7Cglub3RidXN5IG5ld2JyYW5jaAoJZXJyb3JfcG9wdXAgJGVycgogICAgfSBlbHNlIHsKCWFkZGVkaGVhZCAkaWQgJG5hbWUKCSMgWFhYIHNob3VsZCB1cGRhdGUgbGlzdCBvZiBoZWFkcyBkaXNwbGF5ZWQgZm9yIHNlbGVjdGVkIGNvbW1pdAoJbm90YnVzeSBuZXdicmFuY2gKCXJlZHJhd3RhZ3MgJGlkCiAgICB9Cn0KCnByb2MgY2hlcnJ5cGljayB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnZpZXcgY29tbWl0cm93CiAgICBnbG9iYWwgbWFpbmhlYWQgZGVzY19oZWFkcyBhbmNfdGFncyBkZXNjX3RhZ3MgYWxscGFyZW50cyBhbGxjaGlsZHJlbgoKICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcm93bWVudWlkKV0KCSYmIFtsc2VhcmNoIC1leGFjdCAkZGVzY19oZWFkcygkcm93bWVudWlkKSAkbWFpbmhlYWRdID49IDB9IHsKCXNldCBvayBbY29uZmlybV9wb3B1cCAiQ29tbWl0IFtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDddIGlzIGFscmVhZHlcCgkJCWluY2x1ZGVkIGluIGJyYW5jaCAkbWFpbmhlYWQgLS0gcmVhbGx5IHJlLWFwcGx5IGl0PyJdCglpZiB7ISRva30gcmV0dXJuCiAgICB9CiAgICBub3didXN5IGNoZXJyeXBpY2sKICAgIHVwZGF0ZQogICAgc2V0IG9sZGhlYWQgW2V4ZWMgZ2l0IHJldi1wYXJzZSBIRUFEXQogICAgIyBVbmZvcnR1bmF0ZWx5IGdpdC1jaGVycnktcGljayB3cml0ZXMgc3R1ZmYgdG8gc3RkZXJyIGV2ZW4gd2hlbgogICAgIyBubyBlcnJvciBvY2N1cnMsIGFuZCBleGVjIHRha2VzIHRoYXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBlcnJvci4uLgogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAiZ2l0IGNoZXJyeS1waWNrIC1yICRyb3dtZW51aWQgMj4mMSJ9IGVycl19IHsKCW5vdGJ1c3kgY2hlcnJ5cGljawoJZXJyb3JfcG9wdXAgJGVycgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3aGVhZCBbZXhlYyBnaXQgcmV2LXBhcnNlIEhFQURdCiAgICBpZiB7JG5ld2hlYWQgZXEgJG9sZGhlYWR9IHsKCW5vdGJ1c3kgY2hlcnJ5cGljawoJZXJyb3JfcG9wdXAgIk5vIGNoYW5nZXMgY29tbWl0dGVkIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgYWxscGFyZW50cygkbmV3aGVhZCkgJG9sZGhlYWQKICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJG9sZGhlYWQpICRuZXdoZWFkCiAgICBzZXQgZGVzY19oZWFkcygkbmV3aGVhZCkgJG1haW5oZWFkCiAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRvbGRoZWFkKV19IHsKCXNldCBhbmNfdGFncygkbmV3aGVhZCkgJGFuY190YWdzKCRvbGRoZWFkKQogICAgfQogICAgc2V0IGRlc2NfdGFncygkbmV3aGVhZCkge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRvbGRoZWFkKV19IHsKCWluc2VydHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRvbGRoZWFkKSAkbmV3aGVhZAoJaWYgeyRtYWluaGVhZCBuZSB7fX0gewoJICAgIG1vdmVkaGVhZCAkbmV3aGVhZCAkbWFpbmhlYWQKCX0KCXJlZHJhd3RhZ3MgJG9sZGhlYWQKCXJlZHJhd3RhZ3MgJG5ld2hlYWQKICAgIH0KICAgIG5vdGJ1c3kgY2hlcnJ5cGljawp9CgojIGNvbnRleHQgbWVudSBmb3IgYSBoZWFkCnByb2MgaGVhZG1lbnUge3ggeSBpZCBoZWFkfSB7CiAgICBnbG9iYWwgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgaGVhZGN0eG1lbnUKCiAgICBzZXQgaGVhZG1lbnVpZCAkaWQKICAgIHNldCBoZWFkbWVudWhlYWQgJGhlYWQKICAgIHRrX3BvcHVwICRoZWFkY3R4bWVudSAkeCAkeQp9Cgpwcm9jIGNvYnJhbmNoIHt9IHsKICAgIGdsb2JhbCBoZWFkbWVudWlkIGhlYWRtZW51aGVhZCBtYWluaGVhZCBoZWFkaWRzCgogICAgIyBjaGVjayB0aGUgdHJlZSBpcyBjbGVhbiBmaXJzdD8/CiAgICBzZXQgb2xkbWFpbmhlYWQgJG1haW5oZWFkCiAgICBub3didXN5IGNoZWNrb3V0CiAgICB1cGRhdGUKICAgIGlmIHtbY2F0Y2ggewoJZXhlYyBnaXQgY2hlY2tvdXQgJGhlYWRtZW51aGVhZAogICAgfSBlcnJdfSB7Cglub3RidXN5IGNoZWNrb3V0CgllcnJvcl9wb3B1cCAkZXJyCiAgICB9IGVsc2UgewoJbm90YnVzeSBjaGVja291dAoJc2V0IG1haW5oZWFkICRoZWFkbWVudWhlYWQKCWlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkb2xkbWFpbmhlYWQpXX0gewoJICAgIHJlZHJhd3RhZ3MgJGhlYWRpZHMoJG9sZG1haW5oZWFkKQoJfQoJcmVkcmF3dGFncyAkaGVhZG1lbnVpZAogICAgfQp9Cgpwcm9jIHJtYnJhbmNoIHt9IHsKICAgIGdsb2JhbCBkZXNjX2hlYWRzIGhlYWRtZW51aWQgaGVhZG1lbnVoZWFkIG1haW5oZWFkCiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IGhlYWQgJGhlYWRtZW51aGVhZAogICAgc2V0IGlkICRoZWFkbWVudWlkCiAgICBpZiB7JGhlYWQgZXEgJG1haW5oZWFkfSB7CgllcnJvcl9wb3B1cCAiQ2Fubm90IGRlbGV0ZSB0aGUgY3VycmVudGx5IGNoZWNrZWQtb3V0IGJyYW5jaCIKCXJldHVybgogICAgfQogICAgaWYgeyRkZXNjX2hlYWRzKCRpZCkgZXEgJGhlYWR9IHsKCSMgdGhlIHN0dWZmIG9uIHRoaXMgYnJhbmNoIGlzbid0IG9uIGFueSBvdGhlciBicmFuY2gKCWlmIHshW2NvbmZpcm1fcG9wdXAgIlRoZSBjb21taXRzIG9uIGJyYW5jaCAkaGVhZCBhcmVuJ3Qgb24gYW55IG90aGVyXAoJCQlicmFuY2guXG5SZWFsbHkgZGVsZXRlIGJyYW5jaCAkaGVhZD8iXX0gcmV0dXJuCiAgICB9CiAgICBub3didXN5IHJtYnJhbmNoCiAgICB1cGRhdGUKICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0IGJyYW5jaCAtRCAkaGVhZH0gZXJyXX0gewoJbm90YnVzeSBybWJyYW5jaAoJZXJyb3JfcG9wdXAgJGVycgoJcmV0dXJuCiAgICB9CiAgICByZW1vdmVkaGVhZCAkaWQgJGhlYWQKICAgIHJlZHJhd3RhZ3MgJGlkCiAgICBub3RidXN5IHJtYnJhbmNoCn0KCiMgU3R1ZmYgZm9yIGZpbmRpbmcgbmVhcmJ5IHRhZ3MKcHJvYyBnZXRhbGxjb21taXRzIHt9IHsKICAgIGdsb2JhbCBhbGxjc3RhcnQgYWxsY29tbWl0cyBhbGxjZmQgYWxsaWRzCgogICAgc2V0IGFsbGlkcyB7fQogICAgc2V0IGZkIFtvcGVuIFtjb25jYXQgfCBnaXQgcmV2LWxpc3QgLS1hbGwgLS10b3BvLW9yZGVyIC0tcGFyZW50c10gcl0KICAgIHNldCBhbGxjZmQgJGZkCiAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMAogICAgc2V0IGFsbGNvbW1pdHMgInJlYWRpbmciCiAgICBub3didXN5IGFsbGNvbW1pdHMKICAgIHJlc3RhcnRnZXRhbGwgJGZkCn0KCnByb2MgZGlzY2FyZGFsbGNvbW1pdHMge30gewogICAgZ2xvYmFsIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cyBhbGxjZmQKICAgIGdsb2JhbCBkZXNjX3RhZ3MgYW5jX3RhZ3MgYWxsZHRhZ3MgdGFnaXNkZXNjIGFsbGlkcyBkZXNjX2hlYWRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHJldHVybgogICAgaWYgeyRhbGxjb21taXRzIGVxICJyZWFkaW5nIn0gewoJY2F0Y2gge2Nsb3NlICRhbGxjZmR9CiAgICB9CiAgICBmb3JlYWNoIHYge2FsbGNvbW1pdHMgYWxsY2hpbGRyZW4gYWxscGFyZW50cyBhbGxpZHMgZGVzY190YWdzIGFuY190YWdzCgkJYWxsZHRhZ3MgdGFnaXNkZXNjIGRlc2NfaGVhZHN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KfQoKcHJvYyByZXN0YXJ0Z2V0YWxsIHtmZH0gewogICAgZ2xvYmFsIGFsbGNzdGFydAoKICAgIGZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgZ2V0YWxsY2xpbmVzICRmZF0KICAgIHNldCBhbGxjc3RhcnQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQp9Cgpwcm9jIGNvbWJpbmVfZHRhZ3Mge2wxIGwyfSB7CiAgICBnbG9iYWwgdGFnaXNkZXNjIG5vdGZpcnN0ZAoKICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKCXNldCB4IFtsaW5kZXggJHJlcyAkaV0KCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpc2Rlc2MoJHgsJHkpXX0gewoJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA+IDB9IHsKCQkgICAgIyB4IGlzIGEgZGVzY2VuZGVudCBvZiB5LCBleGNsdWRlIHgKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaSAkaV0KCQkgICAgaW5jciBpIC0xCgkJICAgIGJyZWFrCgkJfSBlbHNlIHsKCQkgICAgIyB5IGlzIGEgZGVzY2VuZGVudCBvZiB4LCBleGNsdWRlIHkKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaiAkal0KCQl9CgkgICAgfSBlbHNlIHsKCQkjIG5vIHJlbGF0aW9uLCBrZWVwIGdvaW5nCgkJaW5jciBqCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBjb21iaW5lX2F0YWdzIHtsMSBsMn0gewogICAgZ2xvYmFsIHRhZ2lzZGVzYwoKICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKCXNldCB4IFtsaW5kZXggJHJlcyAkaV0KCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpc2Rlc2MoJHgsJHkpXX0gewoJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA8IDB9IHsKCQkgICAgIyB4IGlzIGFuIGFuY2VzdG9yIG9mIHksIGV4Y2x1ZGUgeAoJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRpICRpXQoJCSAgICBpbmNyIGkgLTEKCQkgICAgYnJlYWsKCQl9IGVsc2UgewoJCSAgICAjIHkgaXMgYW4gYW5jZXN0b3Igb2YgeCwgZXhjbHVkZSB5CgkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGogJGpdCgkJfQoJICAgIH0gZWxzZSB7CgkJIyBubyByZWxhdGlvbiwga2VlcCBnb2luZwoJCWluY3IgagoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkcmVzCn0KCnByb2MgZm9yd2FyZF9wYXNzIHtpZCBjaGlsZHJlbn0gewogICAgZ2xvYmFsIGlkdGFncyBkZXNjX3RhZ3MgaWRoZWFkcyBkZXNjX2hlYWRzIGFsbGR0YWdzIHRhZ2lzZGVzYwoKICAgIHNldCBkdGFncyB7fQogICAgc2V0IGRoZWFkcyB7fQogICAgZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4gewoJaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGNoaWxkKV19IHsKCSAgICBzZXQgY3RhZ3MgW2xpc3QgJGNoaWxkXQoJfSBlbHNlIHsKCSAgICBzZXQgY3RhZ3MgJGRlc2NfdGFncygkY2hpbGQpCgl9CglpZiB7JGR0YWdzIGVxIHt9fSB7CgkgICAgc2V0IGR0YWdzICRjdGFncwoJfSBlbHNlaWYgeyRjdGFncyBuZSAkZHRhZ3N9IHsKCSAgICBzZXQgZHRhZ3MgW2NvbWJpbmVfZHRhZ3MgJGR0YWdzICRjdGFnc10KCX0KCXNldCBjaGVhZHMgJGRlc2NfaGVhZHMoJGNoaWxkKQoJaWYgeyRkaGVhZHMgZXEge319IHsKCSAgICBzZXQgZGhlYWRzICRjaGVhZHMKCX0gZWxzZWlmIHskY2hlYWRzIG5lICRkaGVhZHN9IHsKCSAgICBzZXQgZGhlYWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJGRoZWFkcyAkY2hlYWRzXV0KCX0KICAgIH0KICAgIHNldCBkZXNjX3RhZ3MoJGlkKSAkZHRhZ3MKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgYWR0ICRkdGFncwoJZm9yZWFjaCB0YWcgJGR0YWdzIHsKCSAgICBzZXQgYWR0IFtjb25jYXQgJGFkdCAkYWxsZHRhZ3MoJHRhZyldCgl9CglzZXQgYWR0IFtsc29ydCAtdW5pcXVlICRhZHRdCglzZXQgYWxsZHRhZ3MoJGlkKSAkYWR0Cglmb3JlYWNoIHRhZyAkYWR0IHsKCSAgICBzZXQgdGFnaXNkZXNjKCRpZCwkdGFnKSAtMQoJICAgIHNldCB0YWdpc2Rlc2MoJHRhZywkaWQpIDEKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IGRoZWFkcyBbY29uY2F0ICRkaGVhZHMgJGlkaGVhZHMoJGlkKV0KICAgIH0KICAgIHNldCBkZXNjX2hlYWRzKCRpZCkgJGRoZWFkcwp9Cgpwcm9jIGdldGFsbGNsaW5lcyB7ZmR9IHsKICAgIGdsb2JhbCBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMgYWxsY3N0YXJ0CiAgICBnbG9iYWwgZGVzY190YWdzIGFuY190YWdzIGlkdGFncyB0YWdpc2Rlc2MgYWxsaWRzCiAgICBnbG9iYWwgaWRoZWFkcyB0cmF2aW5kZXgKCiAgICB3aGlsZSB7W2dldHMgJGZkIGxpbmVdID49IDB9IHsKCXNldCBpZCBbbGluZGV4ICRsaW5lIDBdCglsYXBwZW5kIGFsbGlkcyAkaWQKCXNldCBvbGRzIFtscmFuZ2UgJGxpbmUgMSBlbmRdCglzZXQgYWxscGFyZW50cygkaWQpICRvbGRzCglpZiB7IVtpbmZvIGV4aXN0cyBhbGxjaGlsZHJlbigkaWQpXX0gewoJICAgIHNldCBhbGxjaGlsZHJlbigkaWQpIHt9Cgl9Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJHApICRpZAoJfQoJIyBjb21wdXRlIG5lYXJlc3QgdGFnZ2VkIGRlc2NlbmRlbnRzIGFzIHdlIGdvCgkjIGFsc28gY29tcHV0ZSBkZXNjZW5kZW50IGhlYWRzCglmb3J3YXJkX3Bhc3MgJGlkICRhbGxjaGlsZHJlbigkaWQpCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRhbGxjc3RhcnQgPj0gNTB9IHsKCSAgICBmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIHt9CgkgICAgYWZ0ZXIgaWRsZSByZXN0YXJ0Z2V0YWxsICRmZAoJICAgIHJldHVybgoJfQogICAgfQogICAgaWYge1tlb2YgJGZkXX0gewoJc2V0IHRyYXZpbmRleCBbbGxlbmd0aCAkYWxsaWRzXQoJc2V0IGFsbGNvbW1pdHMgInRyYXZlcnNpbmciCglhZnRlciBpZGxlIHJlc3RhcnRhdGFncwoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIHJlYWRpbmcgZnVsbCBjb21taXQgZ3JhcGg6ICRlcnIuXG5cCgkJCSBSZXN1bHRzIG1heSBiZSBpbmNvbXBsZXRlLiIKCX0KICAgIH0KfQoKIyB3YWxrIGJhY2t3YXJkIHRocm91Z2ggdGhlIHRyZWUgYW5kIGNvbXB1dGUgbmVhcmVzdCB0YWdnZWQgYW5jZXN0b3JzCnByb2MgcmVzdGFydGF0YWdzIHt9IHsKICAgIGdsb2JhbCBhbGxpZHMgYWxscGFyZW50cyBpZHRhZ3MgYW5jX3RhZ3MgdHJhdmluZGV4CgogICAgc2V0IHQwIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBpICR0cmF2aW5kZXgKICAgIHdoaWxlIHtbaW5jciBpIC0xXSA+PSAwfSB7CglzZXQgaWQgW2xpbmRleCAkYWxsaWRzICRpXQoJc2V0IGF0YWdzIHt9Cglmb3JlYWNoIHAgJGFsbHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJHApXX0gewoJCXNldCBwdGFncyBbbGlzdCAkcF0KCSAgICB9IGVsc2UgewoJCXNldCBwdGFncyAkYW5jX3RhZ3MoJHApCgkgICAgfQoJICAgIGlmIHskYXRhZ3MgZXEge319IHsKCQlzZXQgYXRhZ3MgJHB0YWdzCgkgICAgfSBlbHNlaWYgeyRwdGFncyBuZSAkYXRhZ3N9IHsKCQlzZXQgYXRhZ3MgW2NvbWJpbmVfYXRhZ3MgJGF0YWdzICRwdGFnc10KCSAgICB9Cgl9CglzZXQgYW5jX3RhZ3MoJGlkKSAkYXRhZ3MKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHQwID49IDUwfSB7CgkgICAgc2V0IHRyYXZpbmRleCAkaQoJICAgIGFmdGVyIGlkbGUgcmVzdGFydGF0YWdzCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYWxsY29tbWl0cyAiZG9uZSIKICAgIHNldCB0cmF2aW5kZXggMAogICAgbm90YnVzeSBhbGxjb21taXRzCiAgICBkaXNwbmVhcnRhZ3MKfQoKIyB1cGRhdGUgdGhlIGRlc2NfdGFncyBhbmQgYW5jX3RhZ3MgYXJyYXlzIGZvciBhIG5ldyB0YWcganVzdCBhZGRlZApwcm9jIGFkZGVkdGFnIHtpZH0gewogICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMKICAgIGdsb2JhbCBpZHRhZ3MgdGFnaXNkZXNjIGFsbGR0YWdzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSByZXR1cm4KICAgIHNldCBhZHQgJGRlc2NfdGFncygkaWQpCiAgICBmb3JlYWNoIHQgJGRlc2NfdGFncygkaWQpIHsKCXNldCBhZHQgW2NvbmNhdCAkYWR0ICRhbGxkdGFncygkdCldCiAgICB9CiAgICBzZXQgYWR0IFtsc29ydCAtdW5pcXVlICRhZHRdCiAgICBzZXQgYWxsZHRhZ3MoJGlkKSAkYWR0CiAgICBmb3JlYWNoIHQgJGFkdCB7CglzZXQgdGFnaXNkZXNjKCRpZCwkdCkgLTEKCXNldCB0YWdpc2Rlc2MoJHQsJGlkKSAxCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSB7CglzZXQgdG9kbyAkYW5jX3RhZ3MoJGlkKQoJd2hpbGUgeyR0b2RvIG5lIHt9fSB7CgkgICAgc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCSAgICBzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCRpZCwkZG8pXX0gY29udGludWUKCSAgICBzZXQgdGFnaXNkZXNjKCRkbywkaWQpIC0xCgkgICAgc2V0IHRhZ2lzZGVzYygkaWQsJGRvKSAxCgkgICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkZG8pXX0gewoJCXNldCB0b2RvIFtjb25jYXQgJHRvZG8gJGFuY190YWdzKCRkbyldCgkgICAgfQoJfQogICAgfQoKICAgIHNldCBsYXN0b2xkICRkZXNjX3RhZ3MoJGlkKQogICAgc2V0IGxhc3RuZXcgW2xpc3QgJGlkXQogICAgc2V0IG51cCAwCiAgICBzZXQgbmNoIDAKICAgIHNldCB0b2RvICRhbGxwYXJlbnRzKCRpZCkKICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGRvKV19IGNvbnRpbnVlCglpZiB7JGRlc2NfdGFncygkZG8pIG5lICRsYXN0b2xkfSB7CgkgICAgc2V0IGxhc3RvbGQgJGRlc2NfdGFncygkZG8pCgkgICAgc2V0IGxhc3RuZXcgW2NvbWJpbmVfZHRhZ3MgJGxhc3RvbGQgW2xpc3QgJGlkXV0KCSAgICBpbmNyIG5jaAoJfQoJaWYgeyRsYXN0b2xkIGVxICRsYXN0bmV3fSBjb250aW51ZQoJc2V0IGRlc2NfdGFncygkZG8pICRsYXN0bmV3CglpbmNyIG51cAoJaWYgeyFbaW5mbyBleGlzdHMgaWR0YWdzKCRkbyldfSB7CgkgICAgc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkYWxscGFyZW50cygkZG8pXQoJfQogICAgfQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSByZXR1cm4KICAgIHNldCBsYXN0b2xkICRhbmNfdGFncygkaWQpCiAgICBzZXQgbGFzdG5ldyBbbGlzdCAkaWRdCiAgICBzZXQgbnVwIDAKICAgIHNldCBuY2ggMAogICAgc2V0IHRvZG8gJGFsbGNoaWxkcmVuKCRpZCkKICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBhbmNfdGFncygkZG8pXX0gY29udGludWUKCWlmIHskYW5jX3RhZ3MoJGRvKSBuZSAkbGFzdG9sZH0gewoJICAgIHNldCBsYXN0b2xkICRhbmNfdGFncygkZG8pCgkgICAgc2V0IGxhc3RuZXcgW2NvbWJpbmVfYXRhZ3MgJGxhc3RvbGQgW2xpc3QgJGlkXV0KCSAgICBpbmNyIG5jaAoJfQoJaWYgeyRsYXN0b2xkIGVxICRsYXN0bmV3fSBjb250aW51ZQoJc2V0IGFuY190YWdzKCRkbykgJGxhc3RuZXcKCWluY3IgbnVwCglpZiB7IVtpbmZvIGV4aXN0cyBpZHRhZ3MoJGRvKV19IHsKCSAgICBzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRhbGxjaGlsZHJlbigkZG8pXQoJfQogICAgfQp9CgojIHVwZGF0ZSB0aGUgZGVzY19oZWFkcyBhcnJheSBmb3IgYSBuZXcgaGVhZCBqdXN0IGFkZGVkCnByb2MgYWRkZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgaGVhZGlkcygkaGVhZCkgJGhpZAogICAgbGFwcGVuZCBpZGhlYWRzKCRoaWQpICRoZWFkCgogICAgc2V0IHRvZG8gW2xpc3QgJGhpZF0KICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRkbyldIHx8CgkgICAgW2xzZWFyY2ggLWV4YWN0ICRkZXNjX2hlYWRzKCRkbykgJGhlYWRdID49IDB9IGNvbnRpbnVlCglzZXQgb2xkaGVhZHMgJGRlc2NfaGVhZHMoJGRvKQoJbGFwcGVuZCBkZXNjX2hlYWRzKCRkbykgJGhlYWQKCXNldCBoZWFkcyAkZGVzY19oZWFkcygkZG8pCgl3aGlsZSB7MX0gewoJICAgIHNldCBwICRhbGxwYXJlbnRzKCRkbykKCSAgICBpZiB7W2xsZW5ndGggJHBdICE9IDEgfHwgIVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRwKV0gfHwKCQkkZGVzY19oZWFkcygkcCkgbmUgJG9sZGhlYWRzfSBicmVhawoJICAgIHNldCBkbyAkcAoJICAgIHNldCBkZXNjX2hlYWRzKCRkbykgJGhlYWRzCgl9CglzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRwXQogICAgfQp9CgojIHVwZGF0ZSB0aGUgZGVzY19oZWFkcyBhcnJheSBmb3IgYSBoZWFkIGp1c3QgcmVtb3ZlZApwcm9jIHJlbW92ZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKCiAgICB1bnNldCBoZWFkaWRzKCRoZWFkKQogICAgaWYgeyRpZGhlYWRzKCRoaWQpIGVxICRoZWFkfSB7Cgl1bnNldCBpZGhlYWRzKCRoaWQpCiAgICB9IGVsc2UgewoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZGhlYWRzKCRoaWQpICRoZWFkXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkaGlkKSBbbHJlcGxhY2UgJGlkaGVhZHMoJGhpZCkgJGkgJGldCgl9CiAgICB9CgogICAgc2V0IHRvZG8gW2xpc3QgJGhpZF0KICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRkbyldfSBjb250aW51ZQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRkZXNjX2hlYWRzKCRkbykgJGhlYWRdCglpZiB7JGkgPCAwfSBjb250aW51ZQoJc2V0IG9sZGhlYWRzICRkZXNjX2hlYWRzKCRkbykKCXNldCBoZWFkcyBbbHJlcGxhY2UgJGRlc2NfaGVhZHMoJGRvKSAkaSAkaV0KCXdoaWxlIHsxfSB7CgkgICAgc2V0IGRlc2NfaGVhZHMoJGRvKSAkaGVhZHMKCSAgICBzZXQgcCAkYWxscGFyZW50cygkZG8pCgkgICAgaWYge1tsbGVuZ3RoICRwXSAhPSAxIHx8ICFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcCldIHx8CgkJJGRlc2NfaGVhZHMoJHApIG5lICRvbGRoZWFkc30gYnJlYWsKCSAgICBzZXQgZG8gJHAKCX0KCXNldCB0b2RvIFtjb25jYXQgJHRvZG8gJHBdCiAgICB9Cn0KCiMgdXBkYXRlIHRoaW5ncyBmb3IgYSBoZWFkIG1vdmVkIHRvIGEgY2hpbGQgb2YgaXRzIHByZXZpb3VzIGxvY2F0aW9uCnByb2MgbW92ZWRoZWFkIHtpZCBuYW1lfSB7CiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IG9sZGlkICRoZWFkaWRzKCRuYW1lKQogICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAogICAgaWYgeyRpZGhlYWRzKCRvbGRpZCkgZXEgJG5hbWV9IHsKCXVuc2V0IGlkaGVhZHMoJG9sZGlkKQogICAgfSBlbHNlIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRoZWFkcygkb2xkaWQpICRuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkb2xkaWQpIFtscmVwbGFjZSAkaWRoZWFkcygkb2xkaWQpICRpICRpXQoJfQogICAgfQogICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKfQoKcHJvYyBjaGFuZ2VkcmVmcyB7fSB7CiAgICBnbG9iYWwgZGVzY19oZWFkcyBkZXNjX3RhZ3MgYW5jX3RhZ3MgYWxsY29tbWl0cyBhbGxpZHMKICAgIGdsb2JhbCBhbGxjaGlsZHJlbiBhbGxwYXJlbnRzIGlkdGFncyB0cmF2aW5kZXgKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gcmV0dXJuCiAgICBjYXRjaCB7dW5zZXQgZGVzY19oZWFkc30KICAgIGNhdGNoIHt1bnNldCBkZXNjX3RhZ3N9CiAgICBjYXRjaCB7dW5zZXQgYW5jX3RhZ3N9CiAgICBjYXRjaCB7dW5zZXQgYWxsZHRhZ3N9CiAgICBjYXRjaCB7dW5zZXQgdGFnaXNkZXNjfQogICAgZm9yZWFjaCBpZCAkYWxsaWRzIHsKCWZvcndhcmRfcGFzcyAkaWQgJGFsbGNoaWxkcmVuKCRpZCkKICAgIH0KICAgIGlmIHskYWxsY29tbWl0cyBuZSAicmVhZGluZyJ9IHsKCXNldCB0cmF2aW5kZXggW2xsZW5ndGggJGFsbGlkc10KCWlmIHskYWxsY29tbWl0cyBuZSAidHJhdmVyc2luZyJ9IHsKCSAgICBzZXQgYWxsY29tbWl0cyAidHJhdmVyc2luZyIKCSAgICBhZnRlciBpZGxlIHJlc3RhcnRhdGFncwoJfQogICAgfQp9Cgpwcm9jIHJlcmVhZHJlZnMge30gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICBzZXQgb2xkbWFpbmhlYWQgJG1haW5oZWFkCiAgICByZWFkcmVmcwogICAgY2hhbmdlZHJlZnMKICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkJW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCXNldCB2IFtsaXN0cmVmcyAkaWRdCglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV0gfHwgJHJlZigkaWQpICE9ICR2IHx8CgkgICAgKCRpZCBlcSAkb2xkbWFpbmhlYWQgJiYgJGlkIG5lICRtYWluaGVhZCkgfHwKCSAgICAoJGlkIGVxICRtYWluaGVhZCAmJiAkaWQgbmUgJG9sZG1haW5oZWFkKX0gewoJICAgIHJlZHJhd3RhZ3MgJGlkCgl9CiAgICB9Cn0KCnByb2MgbGlzdHJlZnMge2lkfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKCiAgICBzZXQgeCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCB4ICRpZHRhZ3MoJGlkKQogICAgfQogICAgc2V0IHkge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IHkgJGlkaGVhZHMoJGlkKQogICAgfQogICAgc2V0IHoge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB6ICRpZG90aGVycmVmcygkaWQpCiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHggJHkgJHpdCn0KCnByb2Mgc2hvd3RhZyB7dGFnIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgdGFnY29udGVudHMgdGFnaWRzIGxpbmtudW0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2hvd3RhZyAkdGFnIDBdCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgc2V0IGxpbmtudW0gMAogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCXNldCB0ZXh0ICR0YWdjb250ZW50cygkdGFnKQogICAgfSBlbHNlIHsKCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dCB7fQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpbml0X2ZsaXN0IHt9Cn0KCnByb2MgZG9xdWl0IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkCiAgICBzZXQgc3RvcHBlZCAxMDAKICAgIGRlc3Ryb3kgLgp9Cgpwcm9jIGRvcHJlZnMge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgYmdjb2xvciBmZ2NvbG9yIGN0ZXh0IGRpZmZjb2xvcnMKCiAgICBzZXQgdG9wIC5naXRrcHJlZnMKICAgIHNldCBwcmVmc3RvcCAkdG9wCiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFnc30gewoJc2V0IG9sZHByZWZzKCR2KSBbc2V0ICR2XQogICAgfQogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAiR2l0ayBwcmVmZXJlbmNlcyIKICAgIGxhYmVsICR0b3AubGRpc3AgLXRleHQgIkNvbW1pdCBsaXN0IGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5sZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5zcGFjZXIgLXRleHQgIiAiCiAgICBsYWJlbCAkdG9wLm1heHdpZHRobCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAobGluZXMpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4d2lkdGggLWZyb20gMCAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4d2lkdGgKICAgIGdyaWQgJHRvcC5zcGFjZXIgJHRvcC5tYXh3aWR0aGwgJHRvcC5tYXh3aWR0aCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AubWF4cGN0bCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAoJSBvZiBwYW5lKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHBjdCAtZnJvbSAxIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXhncmFwaHBjdAogICAgZ3JpZCB4ICR0b3AubWF4cGN0bCAkdG9wLm1heHBjdCAtc3RpY2t5IHcKCiAgICBsYWJlbCAkdG9wLmRkaXNwIC10ZXh0ICJEaWZmIGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5kZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5kaWZmb3B0bCAtdGV4dCAiT3B0aW9ucyBmb3IgZGlmZiBwcm9ncmFtIiBcCgktZm9udCBvcHRpb25mb250CiAgICBlbnRyeSAkdG9wLmRpZmZvcHQgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgZGlmZm9wdHMKICAgIGdyaWQgeCAkdG9wLmRpZmZvcHRsICR0b3AuZGlmZm9wdCAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AubnRhZwogICAgbGFiZWwgJHRvcC5udGFnLmwgLXRleHQgIkRpc3BsYXkgbmVhcmJ5IHRhZ3MiIC1mb250IG9wdGlvbmZvbnQKICAgIGNoZWNrYnV0dG9uICR0b3AubnRhZy5iIC12YXJpYWJsZSBzaG93bmVhcnRhZ3MKICAgIHBhY2sgJHRvcC5udGFnLmIgJHRvcC5udGFnLmwgLXNpZGUgbGVmdAogICAgZ3JpZCB4ICR0b3AubnRhZyAtc3RpY2t5IHcKCiAgICBsYWJlbCAkdG9wLmNkaXNwIC10ZXh0ICJDb2xvcnM6IHByZXNzIHRvIGNob29zZSIKICAgIGdyaWQgJHRvcC5jZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5iZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGJnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmJnYnV0IC10ZXh0ICJCYWNrZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGJnY29sb3IgMCAkdG9wLmJnIGJhY2tncm91bmQgc2V0YmddCiAgICBncmlkIHggJHRvcC5iZ2J1dCAkdG9wLmJnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5mZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGZnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmZnYnV0IC10ZXh0ICJGb3JlZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGZnY29sb3IgMCAkdG9wLmZnIGZvcmVncm91bmQgc2V0ZmddCiAgICBncmlkIHggJHRvcC5mZ2J1dCAkdG9wLmZnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kaWZmb2xkIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDBdCiAgICBidXR0b24gJHRvcC5kaWZmb2xkYnV0IC10ZXh0ICJEaWZmOiBvbGQgbGluZXMiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAwICR0b3AuZGlmZm9sZCAiZGlmZiBvbGQgbGluZXMiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuZGlmZm9sZGJ1dCAkdG9wLmRpZmZvbGQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmRpZmZuZXcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMV0KICAgIGJ1dHRvbiAkdG9wLmRpZmZuZXdidXQgLXRleHQgIkRpZmY6IG5ldyBsaW5lcyIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBkaWZmY29sb3JzIDEgJHRvcC5kaWZmbmV3ICJkaWZmIG5ldyBsaW5lcyIgXAoJCSAgICAgIFtsaXN0ICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5kaWZmbmV3YnV0ICR0b3AuZGlmZm5ldyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuaHVua3NlcCAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAyXQogICAgYnV0dG9uICR0b3AuaHVua3NlcGJ1dCAtdGV4dCAiRGlmZjogaHVuayBoZWFkZXIiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAyICR0b3AuaHVua3NlcCBcCgkJICAgICAgImRpZmYgaHVuayBoZWFkZXIiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5odW5rc2VwYnV0ICR0b3AuaHVua3NlcCAtc3RpY2t5IHcKCiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBwcmVmc29rCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBwcmVmc2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC0gLXBhZHkgMTAgLXN0aWNreSBldwp9Cgpwcm9jIGNob29zZWNvbG9yIHt2IHZpIHcgeCBjbWR9IHsKICAgIGdsb2JhbCAkdgoKICAgIHNldCBjIFt0a19jaG9vc2VDb2xvciAtaW5pdGlhbGNvbG9yIFtsaW5kZXggW3NldCAkdl0gJHZpXSBcCgkgICAgICAgLXRpdGxlICJHaXRrOiBjaG9vc2UgY29sb3IgZm9yICR4Il0KICAgIGlmIHskYyBlcSB7fX0gcmV0dXJuCiAgICAkdyBjb25mIC1iYWNrZ3JvdW5kICRjCiAgICBsc2V0ICR2ICR2aSAkYwogICAgZXZhbCAkY21kICRjCn0KCnByb2Mgc2V0Ymcge2N9IHsKICAgIGdsb2JhbCBiZ2xpc3QKCiAgICBmb3JlYWNoIHcgJGJnbGlzdCB7CgkkdyBjb25mIC1iYWNrZ3JvdW5kICRjCiAgICB9Cn0KCnByb2Mgc2V0Zmcge2N9IHsKICAgIGdsb2JhbCBmZ2xpc3QgY2FudgoKICAgIGZvcmVhY2ggdyAkZmdsaXN0IHsKCSR3IGNvbmYgLWZvcmVncm91bmQgJGMKICAgIH0KICAgIGFsbGNhbnZzIGl0ZW1jb25mIHRleHQgLWZpbGwgJGMKICAgICRjYW52IGl0ZW1jb25mIGNpcmNsZSAtb3V0bGluZSAkYwp9Cgpwcm9jIHByZWZzY2FuIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwoKICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzfSB7CglzZXQgJHYgJG9sZHByZWZzKCR2KQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKfQoKcHJvYyBwcmVmc29rIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwoKICAgIGNhdGNoIHtkZXN0cm95ICRwcmVmc3RvcH0KICAgIHVuc2V0IHByZWZzdG9wCiAgICBpZiB7JG1heHdpZHRoICE9ICRvbGRwcmVmcyhtYXh3aWR0aCkKCXx8ICRtYXhncmFwaHBjdCAhPSAkb2xkcHJlZnMobWF4Z3JhcGhwY3QpfSB7CglyZWRpc3BsYXkKICAgIH0gZWxzZWlmIHskc2hvd25lYXJ0YWdzICE9ICRvbGRwcmVmcyhzaG93bmVhcnRhZ3MpfSB7CglyZXNlbGVjdGxpbmUKICAgIH0KfQoKcHJvYyBmb3JtYXRkYXRlIHtkfSB7CiAgICByZXR1cm4gW2Nsb2NrIGZvcm1hdCAkZCAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCn0KCiMgVGhpcyBsaXN0IG9mIGVuY29kaW5nIG5hbWVzIGFuZCBhbGlhc2VzIGlzIGRpc3RpbGxlZCBmcm9tCiMgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cy4KIyBOb3QgYWxsIG9mIHRoZW0gYXJlIHN1cHBvcnRlZCBieSBUY2wuCnNldCBlbmNvZGluZ19hbGlhc2VzIHsKICAgIHsgQU5TSV9YMy40LTE5NjggaXNvLWlyLTYgQU5TSV9YMy40LTE5ODYgSVNPXzY0Ni5pcnY6MTk5MSBBU0NJSQogICAgICBJU082NDYtVVMgVVMtQVNDSUkgdXMgSUJNMzY3IGNwMzY3IGNzQVNDSUkgfQogICAgeyBJU08tMTA2NDYtVVRGLTEgY3NJU08xMDY0NlVURjEgfQogICAgeyBJU09fNjQ2LmJhc2ljOjE5ODMgcmVmIGNzSVNPNjQ2YmFzaWMxOTgzIH0KICAgIHsgSU5WQVJJQU5UIGNzSU5WQVJJQU5UIH0KICAgIHsgSVNPXzY0Ni5pcnY6MTk4MyBpc28taXItMiBpcnYgY3NJU08ySW50bFJlZlZlcnNpb24gfQogICAgeyBCU180NzMwIGlzby1pci00IElTTzY0Ni1HQiBnYiB1ayBjc0lTTzRVbml0ZWRLaW5nZG9tIH0KICAgIHsgTkFUUy1TRUZJIGlzby1pci04LTEgY3NOQVRTU0VGSSB9CiAgICB7IE5BVFMtU0VGSS1BREQgaXNvLWlyLTgtMiBjc05BVFNTRUZJQUREIH0KICAgIHsgTkFUUy1EQU5PIGlzby1pci05LTEgY3NOQVRTREFOTyB9CiAgICB7IE5BVFMtREFOTy1BREQgaXNvLWlyLTktMiBjc05BVFNEQU5PQUREIH0KICAgIHsgU0VOXzg1MDIwMF9CIGlzby1pci0xMCBGSSBJU082NDYtRkkgSVNPNjQ2LVNFIHNlIGNzSVNPMTBTd2VkaXNoIH0KICAgIHsgU0VOXzg1MDIwMF9DIGlzby1pci0xMSBJU082NDYtU0UyIHNlMiBjc0lTTzExU3dlZGlzaEZvck5hbWVzIH0KICAgIHsgS1NfQ181NjAxLTE5ODcgaXNvLWlyLTE0OSBLU19DXzU2MDEtMTk4OSBLU0NfNTYwMSBrb3JlYW4gY3NLU0M1NjAxMTk4NyB9CiAgICB7IElTTy0yMDIyLUtSIGNzSVNPMjAyMktSIH0KICAgIHsgRVVDLUtSIGNzRVVDS1IgfQogICAgeyBJU08tMjAyMi1KUCBjc0lTTzIwMjJKUCB9CiAgICB7IElTTy0yMDIyLUpQLTIgY3NJU08yMDIySlAyIH0KICAgIHsgSklTX0M2MjIwLTE5NjktanAgSklTX0M2MjIwLTE5NjkgaXNvLWlyLTEzIGthdGFrYW5hIHgwMjAxLTcKICAgICAgY3NJU08xM0pJU0M2MjIwanAgfQogICAgeyBKSVNfQzYyMjAtMTk2OS1ybyBpc28taXItMTQganAgSVNPNjQ2LUpQIGNzSVNPMTRKSVNDNjIyMHJvIH0KICAgIHsgSVQgaXNvLWlyLTE1IElTTzY0Ni1JVCBjc0lTTzE1SXRhbGlhbiB9CiAgICB7IFBUIGlzby1pci0xNiBJU082NDYtUFQgY3NJU08xNlBvcnR1Z3Vlc2UgfQogICAgeyBFUyBpc28taXItMTcgSVNPNjQ2LUVTIGNzSVNPMTdTcGFuaXNoIH0KICAgIHsgZ3JlZWs3LW9sZCBpc28taXItMTggY3NJU08xOEdyZWVrN09sZCB9CiAgICB7IGxhdGluLWdyZWVrIGlzby1pci0xOSBjc0lTTzE5TGF0aW5HcmVlayB9CiAgICB7IERJTl82NjAwMyBpc28taXItMjEgZGUgSVNPNjQ2LURFIGNzSVNPMjFHZXJtYW4gfQogICAgeyBORl9aXzYyLTAxMF8oMTk3MykgaXNvLWlyLTI1IElTTzY0Ni1GUjEgY3NJU08yNUZyZW5jaCB9CiAgICB7IExhdGluLWdyZWVrLTEgaXNvLWlyLTI3IGNzSVNPMjdMYXRpbkdyZWVrMSB9CiAgICB7IElTT181NDI3IGlzby1pci0zNyBjc0lTTzU0MjdDeXJpbGxpYyB9CiAgICB7IEpJU19DNjIyNi0xOTc4IGlzby1pci00MiBjc0lTTzQySklTQzYyMjYxOTc4IH0KICAgIHsgQlNfdmlld2RhdGEgaXNvLWlyLTQ3IGNzSVNPNDdCU1ZpZXdkYXRhIH0KICAgIHsgSU5JUyBpc28taXItNDkgY3NJU080OUlOSVMgfQogICAgeyBJTklTLTggaXNvLWlyLTUwIGNzSVNPNTBJTklTOCB9CiAgICB7IElOSVMtY3lyaWxsaWMgaXNvLWlyLTUxIGNzSVNPNTFJTklTQ3lyaWxsaWMgfQogICAgeyBJU09fNTQyNzoxOTgxIGlzby1pci01NCBJU081NDI3Q3lyaWxsaWMxOTgxIH0KICAgIHsgSVNPXzU0Mjg6MTk4MCBpc28taXItNTUgY3NJU081NDI4R3JlZWsgfQogICAgeyBHQl8xOTg4LTgwIGlzby1pci01NyBjbiBJU082NDYtQ04gY3NJU081N0dCMTk4OCB9CiAgICB7IEdCXzIzMTItODAgaXNvLWlyLTU4IGNoaW5lc2UgY3NJU081OEdCMjMxMjgwIH0KICAgIHsgTlNfNDU1MS0xIGlzby1pci02MCBJU082NDYtTk8gbm8gY3NJU082MERhbmlzaE5vcndlZ2lhbgogICAgICBjc0lTTzYwTm9yd2VnaWFuMSB9CiAgICB7IE5TXzQ1NTEtMiBJU082NDYtTk8yIGlzby1pci02MSBubzIgY3NJU082MU5vcndlZ2lhbjIgfQogICAgeyBORl9aXzYyLTAxMCBpc28taXItNjkgSVNPNjQ2LUZSIGZyIGNzSVNPNjlGcmVuY2ggfQogICAgeyB2aWRlb3RleC1zdXBwbCBpc28taXItNzAgY3NJU083MFZpZGVvdGV4U3VwcDEgfQogICAgeyBQVDIgaXNvLWlyLTg0IElTTzY0Ni1QVDIgY3NJU084NFBvcnR1Z3Vlc2UyIH0KICAgIHsgRVMyIGlzby1pci04NSBJU082NDYtRVMyIGNzSVNPODVTcGFuaXNoMiB9CiAgICB7IE1TWl83Nzk1LjMgaXNvLWlyLTg2IElTTzY0Ni1IVSBodSBjc0lTTzg2SHVuZ2FyaWFuIH0KICAgIHsgSklTX0M2MjI2LTE5ODMgaXNvLWlyLTg3IHgwMjA4IEpJU19YMDIwOC0xOTgzIGNzSVNPODdKSVNYMDIwOCB9CiAgICB7IGdyZWVrNyBpc28taXItODggY3NJU084OEdyZWVrNyB9CiAgICB7IEFTTU9fNDQ5IElTT185MDM2IGFyYWJpYzcgaXNvLWlyLTg5IGNzSVNPODlBU01PNDQ5IH0KICAgIHsgaXNvLWlyLTkwIGNzSVNPOTAgfQogICAgeyBKSVNfQzYyMjktMTk4NC1hIGlzby1pci05MSBqcC1vY3ItYSBjc0lTTzkxSklTQzYyMjkxOTg0YSB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWIgaXNvLWlyLTkyIElTTzY0Ni1KUC1PQ1ItQiBqcC1vY3ItYgogICAgICBjc0lTTzkySklTQzYyOTkxOTg0YiB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWItYWRkIGlzby1pci05MyBqcC1vY3ItYi1hZGQgY3NJU085M0pJUzYyMjkxOTg0YmFkZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQgaXNvLWlyLTk0IGpwLW9jci1oYW5kIGNzSVNPOTRKSVM2MjI5MTk4NGhhbmQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kLWFkZCBpc28taXItOTUganAtb2NyLWhhbmQtYWRkCiAgICAgIGNzSVNPOTVKSVM2MjI5MTk4NGhhbmRhZGQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1rYW5hIGlzby1pci05NiBjc0lTTzk2SklTQzYyMjkxOTg0a2FuYSB9CiAgICB7IElTT18yMDMzLTE5ODMgaXNvLWlyLTk4IGUxM2IgY3NJU08yMDMzIH0KICAgIHsgQU5TSV9YMy4xMTAtMTk4MyBpc28taXItOTkgQ1NBX1Q1MDAtMTk4MyBOQVBMUFMgY3NJU085OU5BUExQUyB9CiAgICB7IElTT184ODU5LTE6MTk4NyBpc28taXItMTAwIElTT184ODU5LTEgSVNPLTg4NTktMSBsYXRpbjEgbDEgSUJNODE5CiAgICAgIENQODE5IGNzSVNPTGF0aW4xIH0KICAgIHsgSVNPXzg4NTktMjoxOTg3IGlzby1pci0xMDEgSVNPXzg4NTktMiBJU08tODg1OS0yIGxhdGluMiBsMiBjc0lTT0xhdGluMiB9CiAgICB7IFQuNjEtN2JpdCBpc28taXItMTAyIGNzSVNPMTAyVDYxN2JpdCB9CiAgICB7IFQuNjEtOGJpdCBULjYxIGlzby1pci0xMDMgY3NJU08xMDNUNjE4Yml0IH0KICAgIHsgSVNPXzg4NTktMzoxOTg4IGlzby1pci0xMDkgSVNPXzg4NTktMyBJU08tODg1OS0zIGxhdGluMyBsMyBjc0lTT0xhdGluMyB9CiAgICB7IElTT184ODU5LTQ6MTk4OCBpc28taXItMTEwIElTT184ODU5LTQgSVNPLTg4NTktNCBsYXRpbjQgbDQgY3NJU09MYXRpbjQgfQogICAgeyBFQ01BLWN5cmlsbGljIGlzby1pci0xMTEgS09JOC1FIGNzSVNPMTExRUNNQUN5cmlsbGljIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTEgaXNvLWlyLTEyMSBJU082NDYtQ0EgY3NhNy0xIGNhIGNzSVNPMTIxQ2FuYWRpYW4xIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTIgaXNvLWlyLTEyMiBJU082NDYtQ0EyIGNzYTctMiBjc0lTTzEyMkNhbmFkaWFuMiB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS1nciBpc28taXItMTIzIGNzSVNPMTIzQ1NBWjI0MzQxOTg1Z3IgfQogICAgeyBJU09fODg1OS02OjE5ODcgaXNvLWlyLTEyNyBJU09fODg1OS02IElTTy04ODU5LTYgRUNNQS0xMTQgQVNNTy03MDgKICAgICAgYXJhYmljIGNzSVNPTGF0aW5BcmFiaWMgfQogICAgeyBJU09fODg1OS02LUUgY3NJU084ODU5NkUgSVNPLTg4NTktNi1FIH0KICAgIHsgSVNPXzg4NTktNi1JIGNzSVNPODg1OTZJIElTTy04ODU5LTYtSSB9CiAgICB7IElTT184ODU5LTc6MTk4NyBpc28taXItMTI2IElTT184ODU5LTcgSVNPLTg4NTktNyBFTE9UXzkyOCBFQ01BLTExOAogICAgICBncmVlayBncmVlazggY3NJU09MYXRpbkdyZWVrIH0KICAgIHsgVC4xMDEtRzIgaXNvLWlyLTEyOCBjc0lTTzEyOFQxMDFHMiB9CiAgICB7IElTT184ODU5LTg6MTk4OCBpc28taXItMTM4IElTT184ODU5LTggSVNPLTg4NTktOCBoZWJyZXcKICAgICAgY3NJU09MYXRpbkhlYnJldyB9CiAgICB7IElTT184ODU5LTgtRSBjc0lTTzg4NTk4RSBJU08tODg1OS04LUUgfQogICAgeyBJU09fODg1OS04LUkgY3NJU084ODU5OEkgSVNPLTg4NTktOC1JIH0KICAgIHsgQ1NOXzM2OTEwMyBpc28taXItMTM5IGNzSVNPMTM5Q1NOMzY5MTAzIH0KICAgIHsgSlVTX0kuQjEuMDAyIGlzby1pci0xNDEgSVNPNjQ2LVlVIGpzIHl1IGNzSVNPMTQxSlVTSUIxMDAyIH0KICAgIHsgSVNPXzY5MzctMi1hZGQgaXNvLWlyLTE0MiBjc0lTT1RleHRDb21tIH0KICAgIHsgSUVDX1AyNy0xIGlzby1pci0xNDMgY3NJU08xNDNJRUNQMjcxIH0KICAgIHsgSVNPXzg4NTktNToxOTg4IGlzby1pci0xNDQgSVNPXzg4NTktNSBJU08tODg1OS01IGN5cmlsbGljCiAgICAgIGNzSVNPTGF0aW5DeXJpbGxpYyB9CiAgICB7IEpVU19JLkIxLjAwMy1zZXJiIGlzby1pci0xNDYgc2VyYmlhbiBjc0lTTzE0NlNlcmJpYW4gfQogICAgeyBKVVNfSS5CMS4wMDMtbWFjIG1hY2Vkb25pYW4gaXNvLWlyLTE0NyBjc0lTTzE0N01hY2Vkb25pYW4gfQogICAgeyBJU09fODg1OS05OjE5ODkgaXNvLWlyLTE0OCBJU09fODg1OS05IElTTy04ODU5LTkgbGF0aW41IGw1IGNzSVNPTGF0aW41IH0KICAgIHsgZ3JlZWstY2NpdHQgaXNvLWlyLTE1MCBjc0lTTzE1MCBjc0lTTzE1MEdyZWVrQ0NJVFQgfQogICAgeyBOQ19OQzAwLTEwOjgxIGN1YmEgaXNvLWlyLTE1MSBJU082NDYtQ1UgY3NJU08xNTFDdWJhIH0KICAgIHsgSVNPXzY5MzctMi0yNSBpc28taXItMTUyIGNzSVNPNjkzN0FkZCB9CiAgICB7IEdPU1RfMTk3NjgtNzQgU1RfU0VWXzM1OC04OCBpc28taXItMTUzIGNzSVNPMTUzR09TVDE5NzY4NzQgfQogICAgeyBJU09fODg1OS1zdXBwIGlzby1pci0xNTQgbGF0aW4xLTItNSBjc0lTTzg4NTlTdXBwIH0KICAgIHsgSVNPXzEwMzY3LWJveCBpc28taXItMTU1IGNzSVNPMTAzNjdCb3ggfQogICAgeyBJU08tODg1OS0xMCBpc28taXItMTU3IGw2IElTT184ODU5LTEwOjE5OTIgY3NJU09MYXRpbjYgbGF0aW42IH0KICAgIHsgbGF0aW4tbGFwIGxhcCBpc28taXItMTU4IGNzSVNPMTU4TGFwIH0KICAgIHsgSklTX1gwMjEyLTE5OTAgeDAyMTIgaXNvLWlyLTE1OSBjc0lTTzE1OUpJU1gwMjEyMTk5MCB9CiAgICB7IERTXzIwODkgRFMyMDg5IElTTzY0Ni1ESyBkayBjc0lTTzY0NkRhbmlzaCB9CiAgICB7IHVzLWRrIGNzVVNESyB9CiAgICB7IGRrLXVzIGNzREtVUyB9CiAgICB7IEpJU19YMDIwMSBYMDIwMSBjc0hhbGZXaWR0aEthdGFrYW5hIH0KICAgIHsgS1NDNTYzNiBJU082NDYtS1IgY3NLU0M1NjM2IH0KICAgIHsgSVNPLTEwNjQ2LVVDUy0yIGNzVW5pY29kZSB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtNCBjc1VDUzQgfQogICAgeyBERUMtTUNTIGRlYyBjc0RFQ01DUyB9CiAgICB7IGhwLXJvbWFuOCByb21hbjggcjggY3NIUFJvbWFuOCB9CiAgICB7IG1hY2ludG9zaCBtYWMgY3NNYWNpbnRvc2ggfQogICAgeyBJQk0wMzcgY3AwMzcgZWJjZGljLWNwLXVzIGViY2RpYy1jcC1jYSBlYmNkaWMtY3Atd3QgZWJjZGljLWNwLW5sCiAgICAgIGNzSUJNMDM3IH0KICAgIHsgSUJNMDM4IEVCQ0RJQy1JTlQgY3AwMzggY3NJQk0wMzggfQogICAgeyBJQk0yNzMgQ1AyNzMgY3NJQk0yNzMgfQogICAgeyBJQk0yNzQgRUJDRElDLUJFIENQMjc0IGNzSUJNMjc0IH0KICAgIHsgSUJNMjc1IEVCQ0RJQy1CUiBjcDI3NSBjc0lCTTI3NSB9CiAgICB7IElCTTI3NyBFQkNESUMtQ1AtREsgRUJDRElDLUNQLU5PIGNzSUJNMjc3IH0KICAgIHsgSUJNMjc4IENQMjc4IGViY2RpYy1jcC1maSBlYmNkaWMtY3Atc2UgY3NJQk0yNzggfQogICAgeyBJQk0yODAgQ1AyODAgZWJjZGljLWNwLWl0IGNzSUJNMjgwIH0KICAgIHsgSUJNMjgxIEVCQ0RJQy1KUC1FIGNwMjgxIGNzSUJNMjgxIH0KICAgIHsgSUJNMjg0IENQMjg0IGViY2RpYy1jcC1lcyBjc0lCTTI4NCB9CiAgICB7IElCTTI4NSBDUDI4NSBlYmNkaWMtY3AtZ2IgY3NJQk0yODUgfQogICAgeyBJQk0yOTAgY3AyOTAgRUJDRElDLUpQLWthbmEgY3NJQk0yOTAgfQogICAgeyBJQk0yOTcgY3AyOTcgZWJjZGljLWNwLWZyIGNzSUJNMjk3IH0KICAgIHsgSUJNNDIwIGNwNDIwIGViY2RpYy1jcC1hcjEgY3NJQk00MjAgfQogICAgeyBJQk00MjMgY3A0MjMgZWJjZGljLWNwLWdyIGNzSUJNNDIzIH0KICAgIHsgSUJNNDI0IGNwNDI0IGViY2RpYy1jcC1oZSBjc0lCTTQyNCB9CiAgICB7IElCTTQzNyBjcDQzNyA0MzcgY3NQQzhDb2RlUGFnZTQzNyB9CiAgICB7IElCTTUwMCBDUDUwMCBlYmNkaWMtY3AtYmUgZWJjZGljLWNwLWNoIGNzSUJNNTAwIH0KICAgIHsgSUJNNzc1IGNwNzc1IGNzUEM3NzVCYWx0aWMgfQogICAgeyBJQk04NTAgY3A4NTAgODUwIGNzUEM4NTBNdWx0aWxpbmd1YWwgfQogICAgeyBJQk04NTEgY3A4NTEgODUxIGNzSUJNODUxIH0KICAgIHsgSUJNODUyIGNwODUyIDg1MiBjc1BDcDg1MiB9CiAgICB7IElCTTg1NSBjcDg1NSA4NTUgY3NJQk04NTUgfQogICAgeyBJQk04NTcgY3A4NTcgODU3IGNzSUJNODU3IH0KICAgIHsgSUJNODYwIGNwODYwIDg2MCBjc0lCTTg2MCB9CiAgICB7IElCTTg2MSBjcDg2MSA4NjEgY3AtaXMgY3NJQk04NjEgfQogICAgeyBJQk04NjIgY3A4NjIgODYyIGNzUEM4NjJMYXRpbkhlYnJldyB9CiAgICB7IElCTTg2MyBjcDg2MyA4NjMgY3NJQk04NjMgfQogICAgeyBJQk04NjQgY3A4NjQgY3NJQk04NjQgfQogICAgeyBJQk04NjUgY3A4NjUgODY1IGNzSUJNODY1IH0KICAgIHsgSUJNODY2IGNwODY2IDg2NiBjc0lCTTg2NiB9CiAgICB7IElCTTg2OCBDUDg2OCBjcC1hciBjc0lCTTg2OCB9CiAgICB7IElCTTg2OSBjcDg2OSA4NjkgY3AtZ3IgY3NJQk04NjkgfQogICAgeyBJQk04NzAgQ1A4NzAgZWJjZGljLWNwLXJvZWNlIGViY2RpYy1jcC15dSBjc0lCTTg3MCB9CiAgICB7IElCTTg3MSBDUDg3MSBlYmNkaWMtY3AtaXMgY3NJQk04NzEgfQogICAgeyBJQk04ODAgY3A4ODAgRUJDRElDLUN5cmlsbGljIGNzSUJNODgwIH0KICAgIHsgSUJNODkxIGNwODkxIGNzSUJNODkxIH0KICAgIHsgSUJNOTAzIGNwOTAzIGNzSUJNOTAzIH0KICAgIHsgSUJNOTA0IGNwOTA0IDkwNCBjc0lCQk05MDQgfQogICAgeyBJQk05MDUgQ1A5MDUgZWJjZGljLWNwLXRyIGNzSUJNOTA1IH0KICAgIHsgSUJNOTE4IENQOTE4IGViY2RpYy1jcC1hcjIgY3NJQk05MTggfQogICAgeyBJQk0xMDI2IENQMTAyNiBjc0lCTTEwMjYgfQogICAgeyBFQkNESUMtQVQtREUgY3NJQk1FQkNESUNBVERFIH0KICAgIHsgRUJDRElDLUFULURFLUEgY3NFQkNESUNBVERFQSB9CiAgICB7IEVCQ0RJQy1DQS1GUiBjc0VCQ0RJQ0NBRlIgfQogICAgeyBFQkNESUMtREstTk8gY3NFQkNESUNES05PIH0KICAgIHsgRUJDRElDLURLLU5PLUEgY3NFQkNESUNES05PQSB9CiAgICB7IEVCQ0RJQy1GSS1TRSBjc0VCQ0RJQ0ZJU0UgfQogICAgeyBFQkNESUMtRkktU0UtQSBjc0VCQ0RJQ0ZJU0VBIH0KICAgIHsgRUJDRElDLUZSIGNzRUJDRElDRlIgfQogICAgeyBFQkNESUMtSVQgY3NFQkNESUNJVCB9CiAgICB7IEVCQ0RJQy1QVCBjc0VCQ0RJQ1BUIH0KICAgIHsgRUJDRElDLUVTIGNzRUJDRElDRVMgfQogICAgeyBFQkNESUMtRVMtQSBjc0VCQ0RJQ0VTQSB9CiAgICB7IEVCQ0RJQy1FUy1TIGNzRUJDRElDRVNTIH0KICAgIHsgRUJDRElDLVVLIGNzRUJDRElDVUsgfQogICAgeyBFQkNESUMtVVMgY3NFQkNESUNVUyB9CiAgICB7IFVOS05PV04tOEJJVCBjc1Vua25vd244QmlUIH0KICAgIHsgTU5FTU9OSUMgY3NNbmVtb25pYyB9CiAgICB7IE1ORU0gY3NNbmVtIH0KICAgIHsgVklTQ0lJIGNzVklTQ0lJIH0KICAgIHsgVklRUiBjc1ZJUVIgfQogICAgeyBLT0k4LVIgY3NLT0k4UiB9CiAgICB7IElCTTAwODU4IENDU0lEMDA4NTggQ1AwMDg1OCBQQy1NdWx0aWxpbmd1YWwtODUwK2V1cm8gfQogICAgeyBJQk0wMDkyNCBDQ1NJRDAwOTI0IENQMDA5MjQgZWJjZGljLUxhdGluOS0tZXVybyB9CiAgICB7IElCTTAxMTQwIENDU0lEMDExNDAgQ1AwMTE0MCBlYmNkaWMtdXMtMzcrZXVybyB9CiAgICB7IElCTTAxMTQxIENDU0lEMDExNDEgQ1AwMTE0MSBlYmNkaWMtZGUtMjczK2V1cm8gfQogICAgeyBJQk0wMTE0MiBDQ1NJRDAxMTQyIENQMDExNDIgZWJjZGljLWRrLTI3NytldXJvIGViY2RpYy1uby0yNzcrZXVybyB9CiAgICB7IElCTTAxMTQzIENDU0lEMDExNDMgQ1AwMTE0MyBlYmNkaWMtZmktMjc4K2V1cm8gZWJjZGljLXNlLTI3OCtldXJvIH0KICAgIHsgSUJNMDExNDQgQ0NTSUQwMTE0NCBDUDAxMTQ0IGViY2RpYy1pdC0yODArZXVybyB9CiAgICB7IElCTTAxMTQ1IENDU0lEMDExNDUgQ1AwMTE0NSBlYmNkaWMtZXMtMjg0K2V1cm8gfQogICAgeyBJQk0wMTE0NiBDQ1NJRDAxMTQ2IENQMDExNDYgZWJjZGljLWdiLTI4NStldXJvIH0KICAgIHsgSUJNMDExNDcgQ0NTSUQwMTE0NyBDUDAxMTQ3IGViY2RpYy1mci0yOTcrZXVybyB9CiAgICB7IElCTTAxMTQ4IENDU0lEMDExNDggQ1AwMTE0OCBlYmNkaWMtaW50ZXJuYXRpb25hbC01MDArZXVybyB9CiAgICB7IElCTTAxMTQ5IENDU0lEMDExNDkgQ1AwMTE0OSBlYmNkaWMtaXMtODcxK2V1cm8gfQogICAgeyBJQk0xMDQ3IElCTS0xMDQ3IH0KICAgIHsgUFRDUDE1NCBjc1BUQ1AxNTQgUFQxNTQgQ1AxNTQgQ3lyaWxsaWMtQXNpYW4gfQogICAgeyBBbWlnYS0xMjUxIEFtaTEyNTEgQW1pZ2ExMjUxIEFtaS0xMjUxIH0KICAgIHsgVU5JQ09ERS0xLTEgY3NVbmljb2RlMTEgfQogICAgeyBDRVNVLTggY3NDRVNVLTggfQogICAgeyBCT0NVLTEgY3NCT0NVLTEgfQogICAgeyBVTklDT0RFLTEtMS1VVEYtNyBjc1VuaWNvZGUxMVVURjcgfQogICAgeyBJU08tODg1OS0xNCBpc28taXItMTk5IElTT184ODU5LTE0OjE5OTggSVNPXzg4NTktMTQgbGF0aW44IGlzby1jZWx0aWMKICAgICAgbDggfQogICAgeyBJU08tODg1OS0xNSBJU09fODg1OS0xNSBMYXRpbi05IH0KICAgIHsgSVNPLTg4NTktMTYgaXNvLWlyLTIyNiBJU09fODg1OS0xNjoyMDAxIElTT184ODU5LTE2IGxhdGluMTAgbDEwIH0KICAgIHsgR0JLIENQOTM2IE1TOTM2IHdpbmRvd3MtOTM2IH0KICAgIHsgSklTX0VuY29kaW5nIGNzSklTRW5jb2RpbmcgfQogICAgeyBTaGlmdF9KSVMgTVNfS2FuamkgY3NTaGlmdEpJUyB9CiAgICB7IEV4dGVuZGVkX1VOSVhfQ29kZV9QYWNrZWRfRm9ybWF0X2Zvcl9KYXBhbmVzZSBjc0VVQ1BrZEZtdEphcGFuZXNlCiAgICAgIEVVQy1KUCB9CiAgICB7IEV4dGVuZGVkX1VOSVhfQ29kZV9GaXhlZF9XaWR0aF9mb3JfSmFwYW5lc2UgY3NFVUNGaXhXaWRKYXBhbmVzZSB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtQmFzaWMgY3NVbmljb2RlQVNDSUkgfQogICAgeyBJU08tMTA2NDYtVW5pY29kZS1MYXRpbjEgY3NVbmljb2RlTGF0aW4xIElTTy0xMDY0NiB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjYxIGNzVW5pY29kZUlCTTEyNjEgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2OCBjc1VuaWNvZGVJQk0xMjY4IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNzYgY3NVbmljb2RlSUJNMTI3NiB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY0IGNzVW5pY29kZUlCTTEyNjQgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NSBjc1VuaWNvZGVJQk0xMjY1IH0KICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMC1MYXRpbi0xIGNzV2luZG93czMwTGF0aW4xIH0KICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xIGNzV2luZG93czMxTGF0aW4xIH0KICAgIHsgSVNPLTg4NTktMi1XaW5kb3dzLUxhdGluLTIgY3NXaW5kb3dzMzFMYXRpbjIgfQogICAgeyBJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNSBjc1dpbmRvd3MzMUxhdGluNSB9CiAgICB7IEFkb2JlLVN0YW5kYXJkLUVuY29kaW5nIGNzQWRvYmVTdGFuZGFyZEVuY29kaW5nIH0KICAgIHsgVmVudHVyYS1VUyBjc1ZlbnR1cmFVUyB9CiAgICB7IFZlbnR1cmEtSW50ZXJuYXRpb25hbCBjc1ZlbnR1cmFJbnRlcm5hdGlvbmFsIH0KICAgIHsgUEM4LURhbmlzaC1Ob3J3ZWdpYW4gY3NQQzhEYW5pc2hOb3J3ZWdpYW4gfQogICAgeyBQQzgtVHVya2lzaCBjc1BDOFR1cmtpc2ggfQogICAgeyBJQk0tU3ltYm9scyBjc0lCTVN5bWJvbHMgfQogICAgeyBJQk0tVGhhaSBjc0lCTVRoYWkgfQogICAgeyBIUC1MZWdhbCBjc0hQTGVnYWwgfQogICAgeyBIUC1QaS1mb250IGNzSFBQaUZvbnQgfQogICAgeyBIUC1NYXRoOCBjc0hQTWF0aDggfQogICAgeyBBZG9iZS1TeW1ib2wtRW5jb2RpbmcgY3NIUFBTTWF0aCB9CiAgICB7IEhQLURlc2tUb3AgY3NIUERlc2t0b3AgfQogICAgeyBWZW50dXJhLU1hdGggY3NWZW50dXJhTWF0aCB9CiAgICB7IE1pY3Jvc29mdC1QdWJsaXNoaW5nIGNzTWljcm9zb2Z0UHVibGlzaGluZyB9CiAgICB7IFdpbmRvd3MtMzFKIGNzV2luZG93czMxSiB9CiAgICB7IEdCMjMxMiBjc0dCMjMxMiB9CiAgICB7IEJpZzUgY3NCaWc1IH0KfQoKcHJvYyB0Y2xfZW5jb2Rpbmcge2VuY30gewogICAgZ2xvYmFsIGVuY29kaW5nX2FsaWFzZXMKICAgIHNldCBuYW1lcyBbZW5jb2RpbmcgbmFtZXNdCiAgICBzZXQgbGNuYW1lcyBbc3RyaW5nIHRvbG93ZXIgJG5hbWVzXQogICAgc2V0IGVuYyBbc3RyaW5nIHRvbG93ZXIgJGVuY10KICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jXQogICAgaWYgeyRpIDwgMH0gewoJIyBsb29rIGZvciAiaXNvbm5uIiBpbnN0ZWFkIG9mICJpc28tbm5uIiBvciAiaXNvX25ubiIKCWlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGVuYyBpc28gZW5jeF19IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY3hdCgl9CiAgICB9CiAgICBpZiB7JGkgPCAwfSB7Cglmb3JlYWNoIGwgJGVuY29kaW5nX2FsaWFzZXMgewoJICAgIHNldCBsbCBbc3RyaW5nIHRvbG93ZXIgJGxdCgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkbGwgJGVuY10gPCAwfSBjb250aW51ZQoJICAgICMgbG9vayB0aHJvdWdoIHRoZSBhbGlhc2VzIGZvciBvbmUgdGhhdCB0Y2wga25vd3MgYWJvdXQKCSAgICBmb3JlYWNoIGUgJGxsIHsKCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVdCgkJaWYgeyRpIDwgMH0gewoJCSAgICBpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlIGlzbyBleF19IHsKCQkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRleF0KCQkgICAgfQoJCX0KCQlpZiB7JGkgPj0gMH0gYnJlYWsKCSAgICB9CgkgICAgYnJlYWsKCX0KICAgIH0KICAgIGlmIHskaSA+PSAwfSB7CglyZXR1cm4gW2xpbmRleCAkbmFtZXMgJGldCiAgICB9CiAgICByZXR1cm4ge30KfQoKIyBkZWZhdWx0cy4uLgpzZXQgZGF0ZW1vZGUgMApzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCnNldCB3cmNvbWNtZCAiZ2l0IGRpZmYtdHJlZSAtLXN0ZGluIC1wIC0tcHJldHR5IgoKc2V0IGdpdGVuY29kaW5nIHt9CmNhdGNoIHsKICAgIHNldCBnaXRlbmNvZGluZyBbZXhlYyBnaXQgY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmddCn0KaWYgeyRnaXRlbmNvZGluZyA9PSAiIn0gewogICAgc2V0IGdpdGVuY29kaW5nICJ1dGYtOCIKfQpzZXQgdGNsZW5jb2RpbmcgW3RjbF9lbmNvZGluZyAkZ2l0ZW5jb2RpbmddCmlmIHskdGNsZW5jb2RpbmcgPT0ge319IHsKICAgIHB1dHMgc3RkZXJyICJXYXJuaW5nOiBlbmNvZGluZyAkZ2l0ZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSBUY2wvVGsiCn0KCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQpzZXQgdWlmb250IHtIZWx2ZXRpY2EgOSBib2xkfQpzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CnNldCByZXZsaXN0b3JkZXIgMApzZXQgZmFzdGRhdGUgMApzZXQgdXBhcnJvd2xlbiA3CnNldCBkb3duYXJyb3dsZW4gNwpzZXQgbWluZ2FwbGVuIDMwCnNldCBjbWl0bW9kZSAicGF0Y2giCnNldCB3cmFwY29tbWVudCAibm9uZSIKc2V0IHNob3duZWFydGFncyAxCgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0Kc2V0IGJnY29sb3Igd2hpdGUKc2V0IGZnY29sb3IgYmxhY2sKc2V0IGRpZmZjb2xvcnMge3JlZCAiIzAwYTAwMCIgYmx1ZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCmZvbnQgY3JlYXRlIG9wdGlvbmZvbnQgLWZhbWlseSBzYW5zLXNlcmlmIC1zaXplIC0xMgoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCiMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgpzZXQgZ2l0ZGlyIFtnaXRkaXJdCmlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKICAgIHNob3dfZXJyb3Ige30gLiAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgogICAgZXhpdCAxCn0KCnNldCBjbWRsaW5lX2ZpbGVzIHt9CnNldCBpIFtsc2VhcmNoIC1leGFjdCAkcmV2dHJlZWFyZ3MgIi0tIl0KaWYgeyRpID49IDB9IHsKICAgIHNldCBjbWRsaW5lX2ZpbGVzIFtscmFuZ2UgJHJldnRyZWVhcmdzIFtleHByIHskaSArIDF9XSBlbmRdCiAgICBzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBbZXhwciB7JGkgLSAxfV1dCn0gZWxzZWlmIHskcmV2dHJlZWFyZ3MgbmUge319IHsKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGYgW2V2YWwgZXhlYyBnaXQgcmV2LXBhcnNlIC0tbm8tcmV2cyAtLW5vLWZsYWdzICRyZXZ0cmVlYXJnc10KCXNldCBjbWRsaW5lX2ZpbGVzIFtzcGxpdCAkZiAiXG4iXQoJc2V0IG4gW2xsZW5ndGggJGNtZGxpbmVfZmlsZXNdCglzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBlbmQtJG5dCiAgICB9IGVycl19IHsKCSMgdW5mb3J0dW5hdGVseSB3ZSBnZXQgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBpbiAkZXJyLAoJIyBzbyBsb29rIGZvciAiZmF0YWw6Ii4KCXNldCBpIFtzdHJpbmcgZmlyc3QgImZhdGFsOiIgJGVycl0KCWlmIHskaSA+IDB9IHsKCSAgICBzZXQgZXJyIFtzdHJpbmcgcmFuZ2UgJGVyciBbZXhwciB7JGkgKyA2fV0gZW5kXQoJfQoJc2hvd19lcnJvciB7fSAuICJCYWQgYXJndW1lbnRzIHRvIGdpdGs6XG4kZXJyIgoJZXhpdCAxCiAgICB9Cn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMApzZXQgZmhfc2VyaWFsIDAKc2V0IG5obF9uYW1lcyB7fQpzZXQgaGlnaGxpZ2h0X3BhdGhzIHt9CnNldCBzZWFyY2hkaXJuIC1mb3J3YXJkcwpzZXQgYm9sZHJvd3Mge30Kc2V0IGJvbGRuYW1lcm93cyB7fQoKc2V0IG9wdGltX2RlbGF5IDE2CgpzZXQgbmV4dHZpZXdudW0gMQpzZXQgY3VydmlldyAwCnNldCBzZWxlY3RlZHZpZXcgMApzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQpzZXQgdmlld2ZpbGVzKDApIHt9CnNldCB2aWV3cGVybSgwKSAwCnNldCB2aWV3YXJncygwKSB7fQoKc2V0IGNtZGxpbmVvayAwCnNldCBzdG9wcGVkIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwp3bSB0aXRsZSAuICJbZmlsZSB0YWlsICRhcmd2MF06IFtmaWxlIHRhaWwgW3B3ZF1dIgpyZWFkcmVmcwoKaWYgeyRjbWRsaW5lX2ZpbGVzIG5lIHt9IHx8ICRyZXZ0cmVlYXJncyBuZSB7fX0gewogICAgIyBjcmVhdGUgYSB2aWV3IGZvciB0aGUgZmlsZXMvZGlycyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQogICAgc2V0IGN1cnZpZXcgMQogICAgc2V0IHNlbGVjdGVkdmlldyAxCiAgICBzZXQgbmV4dHZpZXdudW0gMgogICAgc2V0IHZpZXduYW1lKDEpICJDb21tYW5kIGxpbmUiCiAgICBzZXQgdmlld2ZpbGVzKDEpICRjbWRsaW5lX2ZpbGVzCiAgICBzZXQgdmlld2FyZ3MoMSkgJHJldnRyZWVhcmdzCiAgICBzZXQgdmlld3Blcm0oMSkgMAogICAgYWRkdmlld21lbnUgMQogICAgLmJhci52aWV3IGVudHJ5Y29uZiBFZGl0KiAtc3RhdGUgbm9ybWFsCiAgICAuYmFyLnZpZXcgZW50cnljb25mIERlbGV0ZSogLXN0YXRlIG5vcm1hbAp9CgppZiB7W2luZm8gZXhpc3RzIHBlcm12aWV3c119IHsKICAgIGZvcmVhY2ggdiAkcGVybXZpZXdzIHsKCXNldCBuICRuZXh0dmlld251bQoJaW5jciBuZXh0dmlld251bQoJc2V0IHZpZXduYW1lKCRuKSBbbGluZGV4ICR2IDBdCglzZXQgdmlld2ZpbGVzKCRuKSBbbGluZGV4ICR2IDFdCglzZXQgdmlld2FyZ3MoJG4pIFtsaW5kZXggJHYgMl0KCXNldCB2aWV3cGVybSgkbikgMQoJYWRkdmlld21lbnUgJG4KICAgIH0KfQpnZXRjb21taXRzCg==