IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXQogICAgfQp9Cgpwcm9jIHN0YXJ0X3Jldl9saXN0IHt2aWV3fSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlCiAgICBnbG9iYWwgY29tbWZkIGxlZnRvdmVyIHRjbGVuY29kaW5nIGRhdGVtb2RlCiAgICBnbG9iYWwgdmlld2FyZ3Mgdmlld2ZpbGVzIGNvbW1pdGlkeAoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgY29tbWl0aWR4KCR2aWV3KSAwCiAgICBzZXQgYXJncyAkdmlld2FyZ3MoJHZpZXcpCiAgICBpZiB7JHZpZXdmaWxlcygkdmlldykgbmUge319IHsKCXNldCBhcmdzIFtjb25jYXQgJGFyZ3MgIi0tIiAkdmlld2ZpbGVzKCR2aWV3KV0KICAgIH0KICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0taGVhZGVyICRvcmRlciBcCgkJCSAgLS1wYXJlbnRzIC0tYm91bmRhcnkgLS1kZWZhdWx0IEhFQUQgJGFyZ3NdIHJdCiAgICB9IGVycl19IHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0IHJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgY29tbWZkKCR2aWV3KSAkZmQKICAgIHNldCBsZWZ0b3Zlcigkdmlldykge30KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZgogICAgaWYgeyR0Y2xlbmNvZGluZyAhPSB7fX0gewoJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nICR0Y2xlbmNvZGluZwogICAgfQogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZpZXddCiAgICBub3didXN5ICR2aWV3Cn0KCnByb2Mgc3RvcF9yZXZfbGlzdCB7fSB7CiAgICBnbG9iYWwgY29tbWZkIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21tZmQoJGN1cnZpZXcpXX0gcmV0dXJuCiAgICBzZXQgZmQgJGNvbW1mZCgkY3VydmlldykKICAgIGNhdGNoIHsKCXNldCBwaWQgW3BpZCAkZmRdCglleGVjIGtpbGwgJHBpZAogICAgfQogICAgY2F0Y2gge2Nsb3NlICRmZH0KICAgIHVuc2V0IGNvbW1mZCgkY3VydmlldykKfQoKcHJvYyBnZXRjb21taXRzIHt9IHsKICAgIGdsb2JhbCBwaGFzZSBjYW52IG1haW5mb250IGN1cnZpZXcKCiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgaW5pdGxheW91dAogICAgc3RhcnRfcmV2X2xpc3QgJGN1cnZpZXcKICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2ZkIHZpZXd9ICB7CiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIG5leHR1cGRhdGUKICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldyBobHZpZXcKICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCWdsb2JhbCB2aWV3bmFtZQoJdW5zZXQgY29tbWZkKCR2aWV3KQoJbm90YnVzeSAkdmlldwoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgc2V0IGZ2IHt9CgkgICAgaWYgeyR2aWV3ICE9ICRjdXJ2aWV3fSB7CgkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgoJICAgIH0KCSAgICBpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCgkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKCQlpZiB7JHZpZXduYW1lKCR2aWV3KSBlcSAiQ29tbWFuZCBsaW5lIn0gewoJCSAgICBhcHBlbmQgZXJyIFwKCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAoJCQkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OiAkZXJyIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAkZXJyCgl9CglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIGJyZWFrCgl9CglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAkbGVmdG92ZXIoJHZpZXcpCgkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCgkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCXNldCBsaXN0ZWQgMQoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGlkcyAwIDBdID09ICItIn0gewoJCXNldCBsaXN0ZWQgMAoJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQoJICAgIH0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYge1tzdHJpbmcgbGVuZ3RoICRpZF0gIT0gNDB9IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglpZiB7JGxpc3RlZH0gewoJICAgIHNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCSAgICBzZXQgaSAwCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlpZiB7JGkgPT0gMCB8fCBbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdID49ICRpfSB7CgkJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHZpZXcsJHApICRpZAoJCX0KCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBvbGRzIHt9Cgl9CglpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkdmlldywkaWQpXX0gewoJICAgIHNldCBjaGlsZHJlbigkdmlldywkaWQpIHt9Cgl9CglzZXQgY29tbWl0ZGF0YSgkaWQpIFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCXNldCBjb21taXRyb3coJHZpZXcsJGlkKSAkY29tbWl0aWR4KCR2aWV3KQoJaW5jciBjb21taXRpZHgoJHZpZXcpCglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBsYXBwZW5kIHBhcmVudGxpc3QgJG9sZHMKCSAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJHZpZXcsJGlkKQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCB2cGFyZW50bGlzdCgkdmlldykgJG9sZHMKCSAgICBsYXBwZW5kIHZjaGlsZGxpc3QoJHZpZXcpICRjaGlsZHJlbigkdmlldywkaWQpCgkgICAgbGFwcGVuZCB2ZGlzcG9yZGVyKCR2aWV3KSAkaWQKCSAgICBsYXBwZW5kIHZjbWl0bGlzdGVkKCR2aWV3KSAkbGlzdGVkCgl9CglzZXQgZ290c29tZSAxCiAgICB9CiAgICBpZiB7JGdvdHNvbWV9IHsKCWlmIHskdmlldyA9PSAkY3Vydmlld30gewoJICAgIHdoaWxlIHtbbGF5b3V0bW9yZSAkbmV4dHVwZGF0ZV19IGRvdXBkYXRlCgl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJHZpZXcgPT0gJGhsdmlld30gewoJICAgIHZoaWdobGlnaHRtb3JlCgl9CiAgICB9CiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJZG91cGRhdGUKICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7fSB7CiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cwoKICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CglmaWxlZXZlbnQgJGNvbW1mZCgkdikgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgZm9yZWFjaCB2IFthcnJheSBuYW1lcyBjb21tZmRdIHsKCXNldCBmZCAkY29tbWZkKCR2KQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZdCiAgICB9Cn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIHtbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQgY2F0LWZpbGUgY29tbWl0ICRpZF19XX0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKfQoKcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKICAgIGdsb2JhbCB2aWV3ZGF0YSBjdXJ2aWV3IHBoYXNlIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgdGhpY2tlcmxpbmUKCiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglzdG9wX3Jldl9saXN0CglzZXQgcGhhc2Uge30KICAgIH0KICAgIHNldCBuICRjdXJ2aWV3CiAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgewoJY2F0Y2gge3Vuc2V0IGNoaWxkcmVuKCRuLCRpZCl9CgljYXRjaCB7dW5zZXQgY29tbWl0cm93KCRuLCRpZCl9CiAgICB9CiAgICBzZXQgY3VydmlldyAtMQogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCB0aGlja2VybGluZX0KICAgIGNhdGNoIHt1bnNldCB2aWV3ZGF0YSgkbil9CiAgICBkaXNjYXJkYWxsY29tbWl0cwogICAgcmVhZHJlZnMKICAgIHNob3d2aWV3ICRuCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2RhdGUKCiAgICBzZXQgaW5oZHIgMQogICAgc2V0IGNvbW1lbnQge30KICAgIHNldCBoZWFkbGluZSB7fQogICAgc2V0IGF1bmFtZSB7fQogICAgc2V0IGF1ZGF0ZSB7fQogICAgc2V0IGNvbW5hbWUge30KICAgIHNldCBjb21kYXRlIHt9CiAgICBzZXQgaGRyZW5kIFtzdHJpbmcgZmlyc3QgIlxuXG4iICRjb250ZW50c10KICAgIGlmIHskaGRyZW5kIDwgMH0gewoJIyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCglzZXQgaGRyZW5kIFtzdHJpbmcgbGVuZ3RoICRjb250ZW50c10KICAgIH0KICAgIHNldCBoZWFkZXIgW3N0cmluZyByYW5nZSAkY29udGVudHMgMCBbZXhwciB7JGhkcmVuZCAtIDF9XV0KICAgIHNldCBjb21tZW50IFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIFtleHByIHskaGRyZW5kICsgMn1dIGVuZF0KICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CglzZXQgdGFnIFtsaW5kZXggJGxpbmUgMF0KCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBhdW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBjb21uYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0KICAgIH0KICAgIHNldCBoZWFkbGluZSB7fQogICAgIyB0YWtlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tZW50IGFzIHRoZSBoZWFkbGluZQogICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRjb21tZW50XQogICAgaWYgeyRpID49IDB9IHsKCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gW3N0cmluZyByYW5nZSAkY29tbWVudCAwICRpXV0KICAgIH0gZWxzZSB7CglzZXQgaGVhZGxpbmUgJGNvbW1lbnQKICAgIH0KICAgIGlmIHshJGxpc3RlZH0gewoJIyBnaXQgcmV2LWxpc3QgaW5kZW50cyB0aGUgY29tbWVudCBieSA0IHNwYWNlczsKCSMgaWYgd2UgZ290IHRoaXMgdmlhIGdpdCBjYXQtZmlsZSwgYWRkIHRoZSBpbmRlbnRhdGlvbgoJc2V0IG5ld2NvbW1lbnQge30KCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNvbW1lbnQgIlxuIl0gewoJICAgIGFwcGVuZCBuZXdjb21tZW50ICIgICAgIgoJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIlxuIgoJfQoJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKICAgIH0KICAgIGlmIHskY29tZGF0ZSAhPSB7fX0gewoJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKICAgIH0KICAgIHNldCBjb21taXRpbmZvKCRpZCkgW2xpc3QgJGhlYWRsaW5lICRhdW5hbWUgJGF1ZGF0ZSBcCgkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCn0KCnByb2MgZ2V0Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdGRhdGEgY29tbWl0aW5mbwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0gewoJcGFyc2Vjb21taXQgJGlkICRjb21taXRkYXRhKCRpZCkgMQogICAgfSBlbHNlIHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcyBtYWluaGVhZAoKICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0IHNob3ctcmVmXSByXQogICAgd2hpbGUgezAgPD0gW3NldCBuIFtnZXRzICRyZWZkIGxpbmVdXX0gewoJaWYgeyFbcmVnZXhwIHteKFswLTlhLWZdezQwfSkgcmVmcy8oW15eXSopJH0gJGxpbmUgXAoJICAgIG1hdGNoIGlkIHBhdGhdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHtbcmVnZXhwIHtecmVtb3Rlcy8uKi9IRUFEJH0gJHBhdGggbWF0Y2hdfSB7CgkgICAgY29udGludWUKCX0KCWlmIHshW3JlZ2V4cCB7Xih0YWdzfGhlYWRzKS8oLiopJH0gJHBhdGggbWF0Y2ggdHlwZSBuYW1lXX0gewoJICAgIHNldCB0eXBlIG90aGVycwoJICAgIHNldCBuYW1lICRwYXRoCgl9CglpZiB7W3JlZ2V4cCB7XnJlbW90ZXMvfSAkcGF0aCBtYXRjaF19IHsKCSAgICBzZXQgdHlwZSBoZWFkcwoJfQoJaWYgeyR0eXBlID09ICJ0YWdzIn0gewoJICAgIHNldCB0YWdpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJG5hbWUKCSAgICBzZXQgb2JqIHt9CgkgICAgc2V0IHR5cGUge30KCSAgICBzZXQgdGFnIHt9CgkgICAgY2F0Y2ggewoJCXNldCBjb21taXQgW2V4ZWMgZ2l0IHJldi1wYXJzZSAiJGlkXjAiXQoJCWlmIHskY29tbWl0ICE9ICRpZH0gewoJCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkY29tbWl0CgkJICAgIGxhcHBlbmQgaWR0YWdzKCRjb21taXQpICRuYW1lCgkJfQoJICAgIH0JCQoJICAgIGNhdGNoIHsKCSAgICAgICAgc2V0IHRhZ2NvbnRlbnRzKCRuYW1lKSBbZXhlYyBnaXQgY2F0LWZpbGUgdGFnICRpZF0KCSAgICB9Cgl9IGVsc2VpZiB7ICR0eXBlID09ICJoZWFkcyIgfSB7CgkgICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCgl9IGVsc2UgewoJICAgIHNldCBvdGhlcnJlZmlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZG90aGVycmVmcygkaWQpICRuYW1lCgl9CiAgICB9CiAgICBjbG9zZSAkcmVmZAogICAgc2V0IG1haW5oZWFkIHt9CiAgICBjYXRjaCB7CglzZXQgdGhlaGVhZCBbZXhlYyBnaXQgc3ltYm9saWMtcmVmIEhFQURdCglpZiB7W3N0cmluZyBtYXRjaCAicmVmcy9oZWFkcy8qIiAkdGhlaGVhZF19IHsKCSAgICBzZXQgbWFpbmhlYWQgW3N0cmluZyByYW5nZSAkdGhlaGVhZCAxMSBlbmRdCgl9CiAgICB9Cn0KCnByb2Mgc2hvd19lcnJvciB7dyB0b3AgbXNnfSB7CiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJkZXN0cm95ICR0b3AiCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBiaW5kICR0b3AgPFZpc2liaWxpdHk+ICJncmFiICR0b3A7IGZvY3VzICR0b3AiCiAgICBiaW5kICR0b3AgPEtleS1SZXR1cm4+ICJkZXN0cm95ICR0b3AiCiAgICB0a3dhaXQgd2luZG93ICR0b3AKfQoKcHJvYyBlcnJvcl9wb3B1cCBtc2cgewogICAgc2V0IHcgLmVycm9yCiAgICB0b3BsZXZlbCAkdwogICAgd20gdHJhbnNpZW50ICR3IC4KICAgIHNob3dfZXJyb3IgJHcgJHcgJG1zZwp9Cgpwcm9jIGNvbmZpcm1fcG9wdXAgbXNnIHsKICAgIGdsb2JhbCBjb25maXJtX29rCiAgICBzZXQgY29uZmlybV9vayAwCiAgICBzZXQgdyAuY29uZmlybQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRyYW5zaWVudCAkdyAuCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgJG1zZyAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IE9LIC1jb21tYW5kICJzZXQgY29uZmlybV9vayAxOyBkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBsZWZ0IC1maWxsIHgKICAgIGJ1dHRvbiAkdy5jYW5jZWwgLXRleHQgQ2FuY2VsIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5jYW5jZWwgLXNpZGUgcmlnaHQgLWZpbGwgeAogICAgYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgogICAgdGt3YWl0IHdpbmRvdyAkdwogICAgcmV0dXJuICRjb25maXJtX29rCn0KCnByb2MgbWFrZXdpbmRvdyB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgdGV4dGZvbnQgbWFpbmZvbnQgdWlmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4IHdyYXBjb21tZW50CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGdkdHR5cGUKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcgc3N0cmluZwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBiZ2xpc3QgZmdsaXN0IGRpZmZjb2xvcnMKICAgIGdsb2JhbCBoZWFkY3R4bWVudQoKICAgIG1lbnUgLmJhcgogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkZpbGUiIC1tZW51IC5iYXIuZmlsZQogICAgLmJhciBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgbWVudSAuYmFyLmZpbGUKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlVwZGF0ZSIgLWNvbW1hbmQgdXBkYXRlY29tbWl0cwogICAgLmJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUmVyZWFkIHJlZmVyZW5jZXMiIC1jb21tYW5kIHJlcmVhZHJlZnMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgLmJhci5maWxlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBtZW51IC5iYXIuZWRpdAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkVkaXQiIC1tZW51IC5iYXIuZWRpdAogICAgLmJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiUHJlZmVyZW5jZXMiIC1jb21tYW5kIGRvcHJlZnMKICAgIC5iYXIuZWRpdCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAoKICAgIG1lbnUgLmJhci52aWV3IC1mb250ICR1aWZvbnQKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJWaWV3IiAtbWVudSAuYmFyLnZpZXcKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIk5ldyB2aWV3Li4uIiAtY29tbWFuZCB7bmV3dmlldyAwfQogICAgLmJhci52aWV3IGFkZCBjb21tYW5kIC1sYWJlbCAiRWRpdCB2aWV3Li4uIiAtY29tbWFuZCBlZGl0dmlldyBcCgktc3RhdGUgZGlzYWJsZWQKICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkRlbGV0ZSB2aWV3IiAtY29tbWFuZCBkZWx2aWV3IC1zdGF0ZSBkaXNhYmxlZAogICAgLmJhci52aWV3IGFkZCBzZXBhcmF0b3IKICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICJBbGwgZmlsZXMiIC1jb21tYW5kIHtzaG93dmlldyAwfSBcCgktdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAwCgogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuYmFyLmhlbHAgYWRkIGNvbW1hbmQgLWxhYmVsICJLZXkgYmluZGluZ3MiIC1jb21tYW5kIGtleXMKICAgIC5iYXIuaGVscCBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLiBjb25maWd1cmUgLW1lbnUgLmJhcgoKICAgICMgdGhlIGd1aSBoYXMgdXBwZXIgYW5kIGxvd2VyIGhhbGYsIHBhcnRzIG9mIGEgcGFuZWQgd2luZG93LgogICAgcGFuZWR3aW5kb3cgLmN0b3AgLW9yaWVudCB2ZXJ0aWNhbAoKICAgICMgcG9zc2libHkgdXNlIGFzc3VtZWQgZ2VvbWV0cnkKICAgIGlmIHshW2luZm8gZXhpc3RzIGdlb21ldHJ5KHB3c2FzaDApXX0gewogICAgICAgIHNldCBnZW9tZXRyeSh0b3BoZWlnaHQpIFtleHByIHsxNSAqICRsaW5lc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkodG9wd2lkdGgpIFtleHByIHs4MCAqICRjaGFyc3BjfV0KICAgICAgICBzZXQgZ2VvbWV0cnkoYm90aGVpZ2h0KSBbZXhwciB7MTUgKiAkbGluZXNwY31dCiAgICAgICAgc2V0IGdlb21ldHJ5KGJvdHdpZHRoKSBbZXhwciB7NTAgKiAkY2hhcnNwY31dCiAgICAgICAgc2V0IGdlb21ldHJ5KHB3c2FzaDApICJbZXhwciB7NDAgKiAkY2hhcnNwY31dIDIiCiAgICAgICAgc2V0IGdlb21ldHJ5KHB3c2FzaDEpICJbZXhwciB7NjAgKiAkY2hhcnNwY31dIDIiCiAgICB9CgogICAgIyB0aGUgdXBwZXIgaGFsZiB3aWxsIGhhdmUgYSBwYW5lZCB3aW5kb3csIGEgc2Nyb2xsIGJhciB0byB0aGUgcmlnaHQsIGFuZCBzb21lIHN0dWZmIGJlbG93CiAgICBmcmFtZSAudGYgLWhlaWdodCAkZ2VvbWV0cnkodG9waGVpZ2h0KSAtd2lkdGggJGdlb21ldHJ5KHRvcHdpZHRoKQogICAgZnJhbWUgLnRmLmhpc3RmcmFtZQogICAgcGFuZWR3aW5kb3cgLnRmLmhpc3RmcmFtZS5wd2NsaXN0IC1vcmllbnQgaG9yaXpvbnRhbCAtc2FzaHBhZCAwIC1oYW5kbGVzaXplIDQKCiAgICAjIGNyZWF0ZSB0aHJlZSBjYW52YXNlcwogICAgc2V0IGNzY3JvbGwgLnRmLmhpc3RmcmFtZS5jc2IKICAgIHNldCBjYW52IC50Zi5oaXN0ZnJhbWUucHdjbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgXAoJLXlzY3JvbGxpbmNyICRsaW5lc3BjIC15c2Nyb2xsY29tbWFuZCAic2Nyb2xsY2FudiAkY3Njcm9sbCIKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYKICAgIHNldCBjYW52MiAudGYuaGlzdGZyYW1lLnB3Y2xpc3QuY2FudjIKICAgIGNhbnZhcyAkY2FudjIgXAoJLWJhY2tncm91bmQgJGJnY29sb3IgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC50Zi5oaXN0ZnJhbWUucHdjbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBhZGQgJGNhbnYzCiAgICBldmFsIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIHBsYWNlIDAgJGdlb21ldHJ5KHB3c2FzaDApCiAgICBldmFsIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCBzYXNoIHBsYWNlIDEgJGdlb21ldHJ5KHB3c2FzaDEpCgogICAgIyBhIHNjcm9sbCBiYXIgdG8gcnVsZSB0aGVtCiAgICBzY3JvbGxiYXIgJGNzY3JvbGwgLWNvbW1hbmQge2FsbGNhbnZzIHl2aWV3fSAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKICAgIHBhY2sgJGNzY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgYmluZCAudGYuaGlzdGZyYW1lLnB3Y2xpc3QgPENvbmZpZ3VyZT4ge3Jlc2l6ZWNsaXN0cGFuZXMgJVcgJXd9CiAgICBsYXBwZW5kIGJnbGlzdCAkY2FudiAkY2FudjIgJGNhbnYzCiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUucHdjbGlzdCAtZmlsbCBib3RoIC1leHBhbmQgMSAtc2lkZSBsZWZ0CgogICAgIyB3ZSBoYXZlIHR3byBidXR0b24gYmFycyBhdCBib3R0b20gb2YgdG9wIGZyYW1lLiBCYXIgMQogICAgZnJhbWUgLnRmLmJhcgogICAgZnJhbWUgLnRmLmxiYXIgLWhlaWdodCAxNQoKICAgIHNldCBzaGExZW50cnkgLnRmLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAudGYuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOCAtZm9udCAkdWlmb250CiAgICAkc2hhMWJ1dCBjb25mIC1kaXNhYmxlZGZvcmVncm91bmQgWyRzaGExYnV0IGNnZXQgLWZvcmVncm91bmRdCiAgICBwYWNrIC50Zi5iYXIuc2hhMWxhYmVsIC1zaWRlIGxlZnQKICAgIGVudHJ5ICRzaGExZW50cnkgLXdpZHRoIDQwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNoYTFzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzaGExc3RyaW5nIHdyaXRlIHNoYTFjaGFuZ2UKICAgIHBhY2sgJHNoYTFlbnRyeSAtc2lkZSBsZWZ0IC1wYWR5IDIKCiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLWxlZnQgLWRhdGEgewoJI2RlZmluZSBsZWZ0X3dpZHRoIDE2CgkjZGVmaW5lIGxlZnRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciBsZWZ0X2JpdHNbXSA9IHsKCTB4MDAsIDB4MDAsIDB4YzAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsIDB4MDAsCgkweDBlLCAweDAwLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweGZmLCAweDdmLCAweDBlLCAweDAwLCAweDFjLCAweDAwLAoJMHgzOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhjMCwgMHgwMX07CiAgICB9CiAgICBpbWFnZSBjcmVhdGUgYml0bWFwIGJtLXJpZ2h0IC1kYXRhIHsKCSNkZWZpbmUgcmlnaHRfd2lkdGggMTYKCSNkZWZpbmUgcmlnaHRfaGVpZ2h0IDE2CglzdGF0aWMgdW5zaWduZWQgY2hhciByaWdodF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweDgwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDBlLCAweDAwLCAweDFjLAoJMHgwMCwgMHgzOCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MGUsIDB4MDAsIDB4MDcsIDB4ODAsIDB4MDMsIDB4YzAsIDB4MDF9OwogICAgfQogICAgYnV0dG9uIC50Zi5iYXIubGVmdGJ1dCAtaW1hZ2UgYm0tbGVmdCAtY29tbWFuZCBnb2JhY2sgXAoJLXN0YXRlIGRpc2FibGVkIC13aWR0aCAyNgogICAgcGFjayAudGYuYmFyLmxlZnRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBidXR0b24gLnRmLmJhci5yaWdodGJ1dCAtaW1hZ2UgYm0tcmlnaHQgLWNvbW1hbmQgZ29mb3J3IFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLnRmLmJhci5yaWdodGJ1dCAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBidXR0b24gLnRmLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYuYmFyLmZpbmRidXQgLXNpZGUgbGVmdAogICAgc2V0IGZpbmRzdHJpbmcge30KICAgIHNldCBmc3RyaW5nIC50Zi5iYXIuZmluZHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRmc3RyaW5nCiAgICBlbnRyeSAkZnN0cmluZyAtd2lkdGggMzAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgZmluZHN0cmluZwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRzdHJpbmcgd3JpdGUgZmluZF9jaGFuZ2UKICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeCAtaW4gLnRmLmJhcgogICAgc2V0IGZpbmR0eXBlIEV4YWN0CiAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC50Zi5iYXIuZmluZHR5cGUgXAoJCSAgICAgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmR0eXBlIHdyaXRlIGZpbmRfY2hhbmdlCiAgICAudGYuYmFyLmZpbmR0eXBlIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAudGYuYmFyLmZpbmR0eXBlLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHNldCBmaW5kbG9jICJBbGwgZmllbGRzIgogICAgdGtfb3B0aW9uTWVudSAudGYuYmFyLmZpbmRsb2MgZmluZGxvYyAiQWxsIGZpZWxkcyIgSGVhZGxpbmUgXAoJQ29tbWVudHMgQXV0aG9yIENvbW1pdHRlcgogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRsb2Mgd3JpdGUgZmluZF9jaGFuZ2UKICAgIC50Zi5iYXIuZmluZGxvYyBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLnRmLmJhci5maW5kbG9jLm1lbnUgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmJhci5maW5kbG9jIC1zaWRlIHJpZ2h0CiAgICBwYWNrIC50Zi5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKCiAgICAjIGJ1aWxkIHVwIHRoZSBib3R0b20gYmFyIG9mIHVwcGVyIHdpbmRvdwogICAgbGFiZWwgLnRmLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAogICAgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5mbGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgogICAgc2V0IGdtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLmdkdHR5cGUgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IiBcCgkiYWRkaW5nL3JlbW92aW5nIHN0cmluZzoiXQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGdkdHR5cGUgd3JpdGUgaGZpbGVzX2NoYW5nZQogICAgJGdtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgLnRmLmxiYXIuZ2R0dHlwZSBjb25mIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIuZ2R0dHlwZSAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGVudHJ5IC50Zi5sYmFyLmZlbnQgLXdpZHRoIDI1IC1mb250ICR0ZXh0Zm9udCBcCgktdGV4dHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcwogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9maWxlcyB3cml0ZSBoZmlsZXNfY2hhbmdlCiAgICBsYXBwZW5kIGVudHJpZXMgLnRmLmxiYXIuZmVudAogICAgcGFjayAudGYubGJhci5mZW50IC1zaWRlIGxlZnQgLWZpbGwgeCAtZXhwYW5kIDEKICAgIGxhYmVsIC50Zi5sYmFyLnZsYWJlbCAtdGV4dCAiIE9SIGluIHZpZXciIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLnRmLmxiYXIudmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZ2xvYmFsIHZpZXdobG1lbnUgc2VsZWN0ZWRobHZpZXcKICAgIHNldCB2aWV3aGxtZW51IFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnZobCBzZWxlY3RlZGhsdmlldyBOb25lXQogICAgJHZpZXdobG1lbnUgZW50cnljb25mIE5vbmUgLWNvbW1hbmQgZGVsdmhpZ2hsaWdodAogICAgJHZpZXdobG1lbnUgY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci52aGwgY29uZiAtZm9udCAkdWlmb250CiAgICBwYWNrIC50Zi5sYmFyLnZobCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGxhYmVsIC50Zi5sYmFyLnJsYWJlbCAtdGV4dCAiIE9SICIgLWZvbnQgJHVpZm9udAogICAgcGFjayAudGYubGJhci5ybGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQKICAgIHNldCBtIFt0a19vcHRpb25NZW51IC50Zi5sYmFyLnJlbG0gaGlnaGxpZ2h0X3JlbGF0ZWQgTm9uZSBcCgkiRGVzY2VuZGVudCIgIk5vdCBkZXNjZW5kZW50IiAiQW5jZXN0b3IiICJOb3QgYW5jZXN0b3IiXQogICAgJG0gY29uZiAtZm9udCAkdWlmb250CiAgICAudGYubGJhci5yZWxtIGNvbmYgLWZvbnQgJHVpZm9udAogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGhpZ2hsaWdodF9yZWxhdGVkIHdyaXRlIHZyZWxfY2hhbmdlCiAgICBwYWNrIC50Zi5sYmFyLnJlbG0gLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgIyBGaW5pc2ggcHV0dGluZyB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdmlld2VyIHRvZ2V0aGVyCiAgICBwYWNrIC50Zi5sYmFyIC1pbiAudGYgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLnRmLmJhciAtaW4gLnRmIC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBwYWNrIC50Zi5oaXN0ZnJhbWUgLWZpbGwgYm90aCAtc2lkZSB0b3AgLWV4cGFuZCAxCiAgICAuY3RvcCBhZGQgLnRmCiAgICAuY3RvcCBwYW5lY29uZmlndXJlIC50ZiAtaGVpZ2h0ICRnZW9tZXRyeSh0b3BoZWlnaHQpCiAgICAuY3RvcCBwYW5lY29uZmlndXJlIC50ZiAtd2lkdGggJGdlb21ldHJ5KHRvcHdpZHRoKQoKICAgICMgbm93IGJ1aWxkIHVwIHRoZSBib3R0b20KICAgIHBhbmVkd2luZG93IC5wd2JvdHRvbSAtb3JpZW50IGhvcml6b250YWwKCiAgICAjIGxvd2VyIGxlZnQsIGEgdGV4dCBib3ggb3ZlciBzZWFyY2ggYmFyLCBzY3JvbGwgYmFyIHRvIHRoZSByaWdodAogICAgIyBpZiB3ZSBrbm93IHdpbmRvdyBoZWlnaHQsIHRoZW4gdGhhdCB3aWxsIHNldCB0aGUgbG93ZXIgdGV4dCBoZWlnaHQsIG90aGVyd2lzZQogICAgIyB3ZSBzZXQgbG93ZXIgdGV4dCBoZWlnaHQgd2hpY2ggd2lsbCBkcml2ZSB3aW5kb3cgaGVpZ2h0CiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0gewogICAgICAgIGZyYW1lIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKQogICAgfSBlbHNlIHsKICAgICAgICBmcmFtZSAuYmxlZnQgLXdpZHRoICRnZW9tZXRyeShib3R3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoYm90aGVpZ2h0KQogICAgfQogICAgZnJhbWUgLmJsZWZ0LnRvcAoKICAgIGJ1dHRvbiAuYmxlZnQudG9wLnNlYXJjaCAtdGV4dCAiU2VhcmNoIiAtY29tbWFuZCBkb3NlYXJjaCBcCgktZm9udCAkdWlmb250CiAgICBwYWNrIC5ibGVmdC50b3Auc2VhcmNoIC1zaWRlIGxlZnQgLXBhZHggNQogICAgc2V0IHNzdHJpbmcgLmJsZWZ0LnRvcC5zc3RyaW5nCiAgICBlbnRyeSAkc3N0cmluZyAtd2lkdGggMjAgLWZvbnQgJHRleHRmb250IC10ZXh0dmFyaWFibGUgc2VhcmNoc3RyaW5nCiAgICBsYXBwZW5kIGVudHJpZXMgJHNzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBzZWFyY2hzdHJpbmcgd3JpdGUgaW5jcnNlYXJjaAogICAgcGFjayAkc3N0cmluZyAtc2lkZSBsZWZ0IC1leHBhbmQgMSAtZmlsbCB4CiAgICBzZXQgY3RleHQgLmJsZWZ0LmN0ZXh0CiAgICB0ZXh0ICRjdGV4dCAtYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktc3RhdGUgZGlzYWJsZWQgLWZvbnQgJHRleHRmb250IFwKCS15c2Nyb2xsY29tbWFuZCBzY3JvbGx0ZXh0IC13cmFwIG5vbmUKICAgIHNjcm9sbGJhciAuYmxlZnQuc2IgLWNvbW1hbmQgIiRjdGV4dCB5dmlldyIKICAgIHBhY2sgLmJsZWZ0LnRvcCAtc2lkZSB0b3AgLWZpbGwgeAogICAgcGFjayAuYmxlZnQuc2IgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkY3RleHQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgbGFwcGVuZCBiZ2xpc3QgJGN0ZXh0CiAgICBsYXBwZW5kIGZnbGlzdCAkY3RleHQKCiAgICAkY3RleHQgdGFnIGNvbmYgY29tbWVudCAtd3JhcCAkd3JhcGNvbW1lbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdIC1iYWNrICIjYWFhYWFhIgogICAgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAyXQogICAgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMF0KICAgICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDFdCiAgICAkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCiAgICAkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQogICAgJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCiAgICAkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCiAgICAkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KICAgICRjdGV4dCB0YWcgY29uZiBtNSAtZm9yZSAiIzAwOTA5MCIKICAgICRjdGV4dCB0YWcgY29uZiBtNiAtZm9yZSBtYWdlbnRhCiAgICAkY3RleHQgdGFnIGNvbmYgbTcgLWZvcmUgIiM4MDgwMDAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTggLWZvcmUgIiMwMDkwMDAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTkgLWZvcmUgIiNmZjAwODAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEwIC1mb3JlIGN5YW4KICAgICRjdGV4dCB0YWcgY29uZiBtMTEgLWZvcmUgIiNiMDcwNzAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTEyIC1mb3JlICIjNzBiMGYwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMyAtZm9yZSAiIzcwZjBiMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTQgLWZvcmUgIiNmMGIwNzAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTE1IC1mb3JlICIjZmY3MGIwIgogICAgJGN0ZXh0IHRhZyBjb25mIG1tYXggLWZvcmUgZGFya2dyZXkKICAgIHNldCBtZXJnZW1heCAxNgogICAgJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgICRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CgogICAgLnB3Ym90dG9tIGFkZCAuYmxlZnQKICAgIC5wd2JvdHRvbSBwYW5lY29uZmlndXJlIC5ibGVmdCAtd2lkdGggJGdlb21ldHJ5KGJvdHdpZHRoKQoKICAgICMgbG93ZXIgcmlnaHQKICAgIGZyYW1lIC5icmlnaHQKICAgIGZyYW1lIC5icmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgcmFkaW9idXR0b24gLmJyaWdodC5tb2RlLnRyZWUgLXRleHQgIlRyZWUiIFwKCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJ0cmVlIgogICAgZ3JpZCAuYnJpZ2h0Lm1vZGUucGF0Y2ggLmJyaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuYnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmJyaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtZm9yZWdyb3VuZCAkZmdjb2xvciBcCgktZm9udCAkbWFpbmZvbnQgXAoJLXRhYnMgW2xpc3QgJGluZGVudCBbZXhwciB7MiAqICRpbmRlbnR9XV0gXAoJLXlzY3JvbGxjb21tYW5kICIuYnJpZ2h0LnNiIHNldCIgXAoJLWN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdIFwKCS1zcGFjaW5nMSAxIC1zcGFjaW5nMyAxCiAgICBsYXBwZW5kIGJnbGlzdCAkY2ZsaXN0CiAgICBsYXBwZW5kIGZnbGlzdCAkY2ZsaXN0CiAgICBzY3JvbGxiYXIgLmJyaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmJyaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGhpZ2hsaWdodCBcCgktYmFja2dyb3VuZCBbJGNmbGlzdCBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXQogICAgJGNmbGlzdCB0YWcgY29uZmlndXJlIGJvbGQgLWZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCiAgICAucHdib3R0b20gYWRkIC5icmlnaHQKICAgIC5jdG9wIGFkZCAucHdib3R0b20KCiAgICAjIHJlc3RvcmUgd2luZG93IHBvc2l0aW9uIGlmIGtub3duCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KG1haW4pXX0gewogICAgICAgIHdtIGdlb21ldHJ5IC4gIiRnZW9tZXRyeShtYWluKSIKICAgIH0KCiAgICBiaW5kIC5wd2JvdHRvbSA8Q29uZmlndXJlPiB7cmVzaXplY2RldHBhbmVzICVXICV3fQogICAgcGFjayAuY3RvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgYmluZGFsbCA8MT4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgI2JpbmRhbGwgPEIxLU1vdGlvbj4ge3NlbGNhbnZsaW5lICVXICV4ICV5fQogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS00PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIC01IHVuaXRzIgogICAgYmluZGFsbCA8QnV0dG9uUmVsZWFzZS01PiAiYWxsY2FudnMgeXZpZXcgc2Nyb2xsIDUgdW5pdHMiCiAgICBiaW5kYWxsIDwyPiAiY2FudnNjYW4gbWFyayAlVyAleCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImNhbnZzY2FuIGRyYWd0byAlVyAleCAleSIKICAgIGJpbmRrZXkgPEhvbWU+IHNlbGZpcnN0bGluZQogICAgYmluZGtleSA8RW5kPiBzZWxsYXN0bGluZQogICAgYmluZCAuIDxLZXktVXA+ICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmQgLiA8S2V5LURvd24+ICJzZWxuZXh0bGluZSAxIgogICAgYmluZCAuIDxTaGlmdC1LZXktVXA+ICJuZXh0X2hpZ2hsaWdodCAtMSIKICAgIGJpbmQgLiA8U2hpZnQtS2V5LURvd24+ICJuZXh0X2hpZ2hsaWdodCAxIgogICAgYmluZGtleSA8S2V5LVJpZ2h0PiAiZ29mb3J3IgogICAgYmluZGtleSA8S2V5LUxlZnQ+ICJnb2JhY2siCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gInNlbG5leHRwYWdlIC0xIgogICAgYmluZCAuIDxLZXktTmV4dD4gInNlbG5leHRwYWdlIDEiCiAgICBiaW5kIC4gPENvbnRyb2wtSG9tZT4gImFsbGNhbnZzIHl2aWV3IG1vdmV0byAwLjAiCiAgICBiaW5kIC4gPENvbnRyb2wtRW5kPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDEuMCIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktVXA+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgdW5pdHMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LURvd24+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSB1bml0cyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktUHJpb3I+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5kIC4gPENvbnRyb2wtS2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSB6ICJnb2JhY2siCiAgICBiaW5ka2V5IHggImdvZm9ydyIKICAgIGJpbmRrZXkgaSAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IGsgInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IGogImdvYmFjayIKICAgIGJpbmRrZXkgbCAiZ29mb3J3IgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmRrZXkgPEY1PiB1cGRhdGVjb21taXRzCiAgICBiaW5kIC4gPENvbnRyb2wtcT4gZG9xdWl0CiAgICBiaW5kIC4gPENvbnRyb2wtZj4gZG9maW5kCiAgICBiaW5kIC4gPENvbnRyb2wtZz4ge2ZpbmRuZXh0IDB9CiAgICBiaW5kIC4gPENvbnRyb2wtcj4gZG9zZWFyY2hiYWNrCiAgICBiaW5kIC4gPENvbnRyb2wtcz4gZG9zZWFyY2gKICAgIGJpbmQgLiA8Q29udHJvbC1lcXVhbD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfQWRkPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1taW51cz4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxDb250cm9sLUtQX1N1YnRyYWN0PiB7aW5jcmZvbnQgLTF9CiAgICB3bSBwcm90b2NvbCAuIFdNX0RFTEVURV9XSU5ET1cgZG9xdWl0CiAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCiAgICBiaW5kICRmc3RyaW5nIDxLZXktUmV0dXJuPiBkb2ZpbmQKICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAogICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKICAgIGJpbmQgJGNmbGlzdCA8MT4ge3NlbF9mbGlzdCAlVyAleCAleTsgYnJlYWt9CiAgICBiaW5kICRjZmxpc3QgPEIxLU1vdGlvbj4ge3NlbF9mbGlzdCAlVyAleCAleTsgYnJlYWt9CiAgICBiaW5kICRjZmxpc3QgPEJ1dHRvblJlbGVhc2UtMT4ge3RyZWVjbGljayAlVyAleCAleX0KCiAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCgogICAgc2V0IHJvd2N0eG1lbnUgLnJvd2N0eG1lbnUKICAgIG1lbnUgJHJvd2N0eG1lbnUgLXRlYXJvZmYgMAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHRoaXMgLT4gc2VsZWN0ZWQiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMH0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiBzZWxlY3RlZCAtPiB0aGlzIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDF9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIk1ha2UgcGF0Y2giIC1jb21tYW5kIG1rcGF0Y2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ3JlYXRlIHRhZyIgLWNvbW1hbmQgbWt0YWcKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiIC1jb21tYW5kIHdyaXRlY29tbWl0CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSBuZXcgYnJhbmNoIiAtY29tbWFuZCBta2JyYW5jaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDaGVycnktcGljayB0aGlzIGNvbW1pdCIgXAoJLWNvbW1hbmQgY2hlcnJ5cGljawoKICAgIHNldCBoZWFkY3R4bWVudSAuaGVhZGN0eG1lbnUKICAgIG1lbnUgJGhlYWRjdHhtZW51IC10ZWFyb2ZmIDAKICAgICRoZWFkY3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNoZWNrIG91dCB0aGlzIGJyYW5jaCIgXAoJLWNvbW1hbmQgY29icmFuY2gKICAgICRoZWFkY3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlbW92ZSB0aGlzIGJyYW5jaCIgXAoJLWNvbW1hbmQgcm1icmFuY2gKfQoKIyBtb3VzZS0yIG1ha2VzIGFsbCB3aW5kb3dzIHNjYW4gdmVydGljYWxseSwgYnV0IG9ubHkgdGhlIG9uZQojIHRoZSBjdXJzb3IgaXMgaW4gc2NhbnMgaG9yaXpvbnRhbGx5CnByb2MgY2FudnNjYW4ge29wIHcgeCB5fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZm9yZWFjaCBjIFtsaXN0ICRjYW52ICRjYW52MiAkY2FudjNdIHsKCWlmIHskYyA9PSAkd30gewoJICAgICRjIHNjYW4gJG9wICR4ICR5Cgl9IGVsc2UgewoJICAgICRjIHNjYW4gJG9wIDAgJHkKCX0KICAgIH0KfQoKcHJvYyBzY3JvbGxjYW52IHtjc2Nyb2xsIGYwIGYxfSB7CiAgICAkY3Njcm9sbCBzZXQgJGYwICRmMQogICAgZHJhd2ZyYWMgJGYwICRmMQogICAgZmx1c2hoaWdobGlnaHRzCn0KCiMgd2hlbiB3ZSBtYWtlIGEga2V5IGJpbmRpbmcgZm9yIHRoZSB0b3BsZXZlbCwgbWFrZSBzdXJlCiMgaXQgZG9lc24ndCBnZXQgdHJpZ2dlcmVkIHdoZW4gdGhhdCBrZXkgaXMgcHJlc3NlZCBpbiB0aGUKIyBmaW5kIHN0cmluZyBlbnRyeSB3aWRnZXQuCnByb2MgYmluZGtleSB7ZXYgc2NyaXB0fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgYmluZCAuICRldiAkc2NyaXB0CiAgICBzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSAkZXZdCiAgICBpZiB7JGVzY3JpcHQgPT0ge319IHsKCXNldCBlc2NyaXB0IFtiaW5kIEVudHJ5IDxLZXk+XQogICAgfQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWJpbmQgJGUgJGV2ICIkZXNjcmlwdDsgYnJlYWsiCiAgICB9Cn0KCiMgc2V0IHRoZSBmb2N1cyBiYWNrIHRvIHRoZSB0b3BsZXZlbCBmb3IgYW55IGNsaWNrIG91dHNpZGUKIyB0aGUgZW50cnkgd2lkZ2V0cwpwcm9jIGNsaWNrIHt3fSB7CiAgICBnbG9iYWwgZW50cmllcwogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCWlmIHskdyA9PSAkZX0gcmV0dXJuCiAgICB9CiAgICBmb2N1cyAuCn0KCnByb2Mgc2F2ZXN0dWZmIHt3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjZmxpc3QgbWFpbmZvbnQgdGV4dGZvbnQgdWlmb250CiAgICBnbG9iYWwgc3R1ZmZzYXZlZCBmaW5kbWVyZ2VmaWxlcyBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG1heHdpZHRoIHNob3duZWFydGFncwogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdmaWxlcyB2aWV3YXJncyB2aWV3cGVybSBuZXh0dmlld251bQogICAgZ2xvYmFsIGNtaXRtb2RlIHdyYXBjb21tZW50CiAgICBnbG9iYWwgY29sb3JzIGJnY29sb3IgZmdjb2xvciBkaWZmY29sb3JzCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHVpZm9udCAkdWlmb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgZmluZG1lcmdlZmlsZXMgJGZpbmRtZXJnZWZpbGVzXQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4Z3JhcGhwY3QgJG1heGdyYXBocGN0XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWF4d2lkdGggJG1heHdpZHRoXQoJcHV0cyAkZiBbbGlzdCBzZXQgY21pdG1vZGUgJGNtaXRtb2RlXQoJcHV0cyAkZiBbbGlzdCBzZXQgd3JhcGNvbW1lbnQgJHdyYXBjb21tZW50XQoJcHV0cyAkZiBbbGlzdCBzZXQgc2hvd25lYXJ0YWdzICRzaG93bmVhcnRhZ3NdCglwdXRzICRmIFtsaXN0IHNldCBiZ2NvbG9yICRiZ2NvbG9yXQoJcHV0cyAkZiBbbGlzdCBzZXQgZmdjb2xvciAkZmdjb2xvcl0KCXB1dHMgJGYgW2xpc3Qgc2V0IGNvbG9ycyAkY29sb3JzXQoJcHV0cyAkZiBbbGlzdCBzZXQgZGlmZmNvbG9ycyAkZGlmZmNvbG9yc10KCglwdXRzICRmICJzZXQgZ2VvbWV0cnkobWFpbikgW3dtIGdlb21ldHJ5IC5dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHRvcHdpZHRoKSBbd2luZm8gd2lkdGggLnRmXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeSh0b3BoZWlnaHQpIFt3aW5mbyBoZWlnaHQgLnRmXSIKICAgICAgICBwdXRzICRmICJzZXQgZ2VvbWV0cnkocHdzYXNoMCkgXCJbLnRmLmhpc3RmcmFtZS5wd2NsaXN0IHNhc2ggY29vcmQgMF1cIiIKICAgICAgICBwdXRzICRmICJzZXQgZ2VvbWV0cnkocHdzYXNoMSkgXCJbLnRmLmhpc3RmcmFtZS5wd2NsaXN0IHNhc2ggY29vcmQgMV1cIiIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShib3R3aWR0aCkgW3dpbmZvIHdpZHRoIC5ibGVmdF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoYm90aGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC5ibGVmdF0iCgoJcHV0cyAtbm9uZXdsaW5lICRmICJzZXQgcGVybXZpZXdzIHsiCglmb3Ige3NldCB2IDB9IHskdiA8ICRuZXh0dmlld251bX0ge2luY3Igdn0gewoJICAgIGlmIHskdmlld3Blcm0oJHYpfSB7CgkJcHV0cyAkZiAie1tsaXN0ICR2aWV3bmFtZSgkdikgJHZpZXdmaWxlcygkdikgJHZpZXdhcmdzKCR2KV19IgoJICAgIH0KCX0KCXB1dHMgJGYgIn0iCgljbG9zZSAkZgoJZmlsZSByZW5hbWUgLWZvcmNlICJ+Ly5naXRrLW5ldyIgIn4vLmdpdGsiCiAgICB9CiAgICBzZXQgc3R1ZmZzYXZlZCAxCn0KCnByb2MgcmVzaXplY2xpc3RwYW5lcyB7d2luIHd9IHsKICAgIGdsb2JhbCBvbGR3aWR0aAogICAgaWYge1tpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV19IHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglzZXQgczEgWyR3aW4gc2FzaCBjb29yZCAxXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdy8yIC0gMil9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCR3KjUvNiAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIHNldCBzYXNoMSBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMSAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCAzMH0gewoJCXNldCBzYXNoMCAzMAoJICAgIH0KCSAgICBpZiB7JHNhc2gxIDwgJHNhc2gwICsgMjB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgeyRzYXNoMCArIDIwfV0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgeyR3IC0gMTB9XQoJCWlmIHskc2FzaDAgPiAkc2FzaDEgLSAyMH0gewoJCSAgICBzZXQgc2FzaDAgW2V4cHIgeyRzYXNoMSAtIDIwfV0KCQl9CgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCgkkd2luIHNhc2ggcGxhY2UgMSAkc2FzaDEgW2xpbmRleCAkczEgMV0KICAgIH0KICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdwp9Cgpwcm9jIHJlc2l6ZWNkZXRwYW5lcyB7d2luIHd9IHsKICAgIGdsb2JhbCBvbGR3aWR0aAogICAgaWYge1tpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV19IHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciB7JHcgLSAxNX1dCgkgICAgfQoJfQoJJHdpbiBzYXNoIHBsYWNlIDAgJHNhc2gwIFtsaW5kZXggJHMwIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyBhbGxjYW52cyBhcmdzIHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBldmFsICRjYW52ICRhcmdzCiAgICBldmFsICRjYW52MiAkYXJncwogICAgZXZhbCAkY2FudjMgJGFyZ3MKfQoKcHJvYyBiaW5kYWxsIHtldmVudCBhY3Rpb259IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBiaW5kICRjYW52ICRldmVudCAkYWN0aW9uCiAgICBiaW5kICRjYW52MiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjMgJGV2ZW50ICRhY3Rpb24KfQoKcHJvYyBhYm91dCB7fSB7CiAgICBzZXQgdyAuYWJvdXQKICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0gewoJcmFpc2UgJHcKCXJldHVybgogICAgfQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRpdGxlICR3ICJBYm91dCBnaXRrIgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKR2l0ayAtIGEgY29tbWl0IHZpZXdlciBmb3IgZ2l0CgpDb3B5cmlnaHQgqSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBrZXlzIHt9IHsKICAgIHNldCB3IC5rZXlzCiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiR2l0ayBrZXkgYmluZGluZ3MiCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgewpHaXRrIGtleSBiaW5kaW5nczoKCjxDdHJsLVE+CQlRdWl0CjxIb21lPgkJTW92ZSB0byBmaXJzdCBjb21taXQKPEVuZD4JCU1vdmUgdG8gbGFzdCBjb21taXQKPFVwPiwgcCwgaQlNb3ZlIHVwIG9uZSBjb21taXQKPERvd24+LCBuLCBrCU1vdmUgZG93biBvbmUgY29tbWl0CjxMZWZ0PiwgeiwgaglHbyBiYWNrIGluIGhpc3RvcnkgbGlzdAo8UmlnaHQ+LCB4LCBsCUdvIGZvcndhcmQgaW4gaGlzdG9yeSBsaXN0CjxQYWdlVXA+CU1vdmUgdXAgb25lIHBhZ2UgaW4gY29tbWl0IGxpc3QKPFBhZ2VEb3duPglNb3ZlIGRvd24gb25lIHBhZ2UgaW4gY29tbWl0IGxpc3QKPEN0cmwtSG9tZT4JU2Nyb2xsIHRvIHRvcCBvZiBjb21taXQgbGlzdAo8Q3RybC1FbmQ+CVNjcm9sbCB0byBib3R0b20gb2YgY29tbWl0IGxpc3QKPEN0cmwtVXA+CVNjcm9sbCBjb21taXQgbGlzdCB1cCBvbmUgbGluZQo8Q3RybC1Eb3duPglTY3JvbGwgY29tbWl0IGxpc3QgZG93biBvbmUgbGluZQo8Q3RybC1QYWdlVXA+CVNjcm9sbCBjb21taXQgbGlzdCB1cCBvbmUgcGFnZQo8Q3RybC1QYWdlRG93bj4JU2Nyb2xsIGNvbW1pdCBsaXN0IGRvd24gb25lIHBhZ2UKPFNoaWZ0LVVwPglNb3ZlIHRvIHByZXZpb3VzIGhpZ2hsaWdodGVkIGxpbmUKPFNoaWZ0LURvd24+CU1vdmUgdG8gbmV4dCBoaWdobGlnaHRlZCBsaW5lCjxEZWxldGU+LCBiCVNjcm9sbCBkaWZmIHZpZXcgdXAgb25lIHBhZ2UKPEJhY2tzcGFjZT4JU2Nyb2xsIGRpZmYgdmlldyB1cCBvbmUgcGFnZQo8U3BhY2U+CQlTY3JvbGwgZGlmZiB2aWV3IGRvd24gb25lIHBhZ2UKdQkJU2Nyb2xsIGRpZmYgdmlldyB1cCAxOCBsaW5lcwpkCQlTY3JvbGwgZGlmZiB2aWV3IGRvd24gMTggbGluZXMKPEN0cmwtRj4JCUZpbmQKPEN0cmwtRz4JCU1vdmUgdG8gbmV4dCBmaW5kIGhpdAo8UmV0dXJuPglNb3ZlIHRvIG5leHQgZmluZCBoaXQKLwkJTW92ZSB0byBuZXh0IGZpbmQgaGl0LCBvciByZWRvIGZpbmQKPwkJTW92ZSB0byBwcmV2aW91cyBmaW5kIGhpdApmCQlTY3JvbGwgZGlmZiB2aWV3IHRvIG5leHQgZmlsZQo8Q3RybC1TPgkJU2VhcmNoIGZvciBuZXh0IGhpdCBpbiBkaWZmIHZpZXcKPEN0cmwtUj4JCVNlYXJjaCBmb3IgcHJldmlvdXMgaGl0IGluIGRpZmYgdmlldwo8Q3RybC1LUCs+CUluY3JlYXNlIGZvbnQgc2l6ZQo8Q3RybC1wbHVzPglJbmNyZWFzZSBmb250IHNpemUKPEN0cmwtS1AtPglEZWNyZWFzZSBmb250IHNpemUKPEN0cmwtbWludXM+CURlY3JlYXNlIGZvbnQgc2l6ZQo8RjU+CQlVcGRhdGUKfSBcCgkgICAgLWp1c3RpZnkgbGVmdCAtYmcgd2hpdGUgLWJvcmRlciAyIC1yZWxpZWYgc3Vua2VuCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIGJvdGgKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCiMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQojIGJvdHRvbSByaWdodCBvZiB0aGUgb3ZlcmFsbCB3aW5kb3cuCgpwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKICAgIGdsb2JhbCB0cmVlY29udGVudHMgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVpbmRleAoKICAgIHNldCBpeCAwCiAgICBzZXQgdHJlZWluZGV4KCkgMAogICAgc2V0IGxldiAwCiAgICBzZXQgcHJlZml4IHt9CiAgICBzZXQgcHJlZml4ZW5kIC0xCiAgICBzZXQgcHJlZmVuZHN0YWNrIHt9CiAgICBzZXQgaHRzdGFjayB7fQogICAgc2V0IGh0IDAKICAgIHNldCB0cmVlY29udGVudHMoKSB7fQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGwgewoJd2hpbGUge1tzdHJpbmcgcmFuZ2UgJGYgMCAkcHJlZml4ZW5kXSBuZSAkcHJlZml4fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJJHcgbWFyayBzZXQgZTokdHJlZWluZGV4KCRwcmVmaXgpICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBlOiR0cmVlaW5kZXgoJHByZWZpeCkgbGVmdAoJICAgIH0KCSAgICBzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCSAgICBpbmNyIGh0IFtsaW5kZXggJGh0c3RhY2sgZW5kXQoJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQoJICAgIHNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCSAgICBzZXQgcHJlZmVuZHN0YWNrIFtscmVwbGFjZSAkcHJlZmVuZHN0YWNrIGVuZCBlbmRdCgkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQoJICAgIGluY3IgbGV2IC0xCgl9CglzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCgl3aGlsZSB7W3NldCBzbGFzaCBbc3RyaW5nIGZpcnN0ICIvIiAkdGFpbF1dID49IDB9IHsKCSAgICBsYXBwZW5kIGh0c3RhY2sgJGh0CgkgICAgc2V0IGh0IDAKCSAgICBsYXBwZW5kIHByZWZlbmRzdGFjayAkcHJlZml4ZW5kCgkgICAgaW5jciBwcmVmaXhlbmQgW2V4cHIgeyRzbGFzaCArIDF9XQoJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCgkgICAgbGFwcGVuZCB0cmVlY29udGVudHMoJHByZWZpeCkgJGQKCSAgICBzZXQgb2xkcHJlZml4ICRwcmVmaXgKCSAgICBhcHBlbmQgcHJlZml4ICRkCgkgICAgc2V0IHRyZWVjb250ZW50cygkcHJlZml4KSB7fQoJICAgIHNldCB0cmVlaW5kZXgoJHByZWZpeCkgW2luY3IgaXhdCgkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAoJICAgIHNldCB0YWlsIFtzdHJpbmcgcmFuZ2UgJHRhaWwgW2V4cHIgeyRzbGFzaCsxfV0gZW5kXQoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCXNldCBodCAxCgkJc2V0IHRyZWVkaXJvcGVuKCRwcmVmaXgpIFtleHByIHskbGV2IDwgJG9wZW5sZXZzfV0KCQlzZXQgYm0gW2V4cHIgeyRsZXYgPT0gJG9wZW5sZXZzPyAidHJpLXJ0IjogInRyaS1kbiJ9XQoJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBkOiRpeCBsZWZ0CgkJc2V0IHN0ciAiXG4iCgkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQoJCSR3IGluc2VydCBlbmQgJHN0cgoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgLWFsaWduIGNlbnRlciAtaW1hZ2UgJGJtIC1wYWR4IDEgXAoJCSAgICAtbmFtZSBhOiRpeAoJCSR3IGluc2VydCBlbmQgJGQgW2hpZ2hsaWdodF90YWcgJHByZWZpeF0KCQkkdyBtYXJrIHNldCBzOiRpeCAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAoJICAgIH0KCSAgICBpbmNyIGxldgoJfQoJaWYgeyR0YWlsIG5lIHt9fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJaW5jciBodAoJCXNldCBzdHIgIlxuIgoJCWZvciB7c2V0IGkgMH0geyRpIDwgJGxldn0ge2luY3IgaX0ge2FwcGVuZCBzdHIgIlx0In0KCQkkdyBpbnNlcnQgZW5kICRzdHIKCQkkdyBpbnNlcnQgZW5kICR0YWlsIFtoaWdobGlnaHRfdGFnICRmXQoJICAgIH0KCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAoJfQogICAgfQogICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CglzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCWluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCglzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KICAgIH0KICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbGluZXRvZWx0IHtsfSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKCiAgICBzZXQgeSAyCiAgICBzZXQgcHJlZml4IHt9CiAgICB3aGlsZSB7MX0gewoJZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJICAgIGlmIHskeSA9PSAkbH0gewoJCXJldHVybiAiJHByZWZpeCRlIgoJICAgIH0KCSAgICBzZXQgbiAxCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyJ9IHsKCQlzZXQgbiAkdHJlZWhlaWdodCgkcHJlZml4JGUpCgkJaWYgeyR5ICsgJG4gPiAkbH0gewoJCSAgICBhcHBlbmQgcHJlZml4ICRlCgkJICAgIGluY3IgeQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaW5jciB5ICRuCgl9CiAgICB9Cn0KCnByb2MgaGlnaGxpZ2h0X3RyZWUge3kgcHJlZml4fSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CgogICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJc2V0IHBhdGggJHByZWZpeCRlCglpZiB7W2hpZ2hsaWdodF90YWcgJHBhdGhdIG5lIHt9fSB7CgkgICAgJGNmbGlzdCB0YWcgYWRkIGJvbGQgJHkuMCAiJHkuMCBsaW5lZW5kIgoJfQoJaW5jciB5CglpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIiAmJiAkdHJlZWhlaWdodCgkcGF0aCkgPiAxfSB7CgkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQoJfQogICAgfQogICAgcmV0dXJuICR5Cn0KCnByb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKCiAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkdyBkZWxldGUgczokaXggZTokaXgKICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCiAgICAkdyBpbWFnZSBjb25maWd1cmUgYTokaXggLWltYWdlIHRyaS1ydAogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQogICAgd2hpbGUgeyRkaXIgbmUge319IHsKCWluY3IgdHJlZWhlaWdodCgkZGlyKSAkbgoJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQogICAgfQp9Cgpwcm9jIHRyZWVvcGVuZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlY29udGVudHMgdHJlZWluZGV4CgogICAgc2V0IGl4ICR0cmVlaW5kZXgoJGRpcikKICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KICAgICR3IG1hcmsgc2V0IGU6JGl4IHM6JGl4CiAgICAkdyBtYXJrIGdyYXZpdHkgZTokaXggcmlnaHQKICAgIHNldCBsZXYgMAogICAgc2V0IHN0ciAiXG4iCiAgICBzZXQgbiBbbGxlbmd0aCAkdHJlZWNvbnRlbnRzKCRkaXIpXQogICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKCWluY3IgbGV2CglhcHBlbmQgc3RyICJcdCIKCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KICAgIH0KICAgIGZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRkaXIpIHsKCXNldCBkZSAkZGlyJGUKCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CgkgICAgc2V0IGl5ICR0cmVlaW5kZXgoJGRlKQoJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CgkgICAgJHcgbWFyayBncmF2aXR5IGQ6JGl5IGxlZnQKCSAgICAkdyBpbnNlcnQgZTokaXggJHN0cgoJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKCSAgICAkdyBpbWFnZSBjcmVhdGUgZTokaXggLWFsaWduIGNlbnRlciAtaW1hZ2UgdHJpLXJ0IC1wYWR4IDEgXAoJCS1uYW1lIGE6JGl5CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCSAgICAkdyBtYXJrIHNldCBzOiRpeSBlOiRpeAoJICAgICR3IG1hcmsgZ3Jhdml0eSBzOiRpeSBsZWZ0CgkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCgl9IGVsc2UgewoJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCX0KICAgIH0KICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IHRyZWVkaXJvcGVuKCRkaXIpIDEKICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCiAgICBzZXQgaHQgWyR3IGNnZXQgLWhlaWdodF0KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBzOiRpeF0gLl0gMF0KICAgIGlmIHskbCA8ICR0b3B9IHsKCSR3IHl2aWV3ICRsLjAKICAgIH0gZWxzZWlmIHskbCArICRuICsgMSA+ICR0b3AgKyAkaHR9IHsKCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KCWlmIHskbCA8ICR0b3B9IHsKCSAgICBzZXQgdG9wICRsCgl9CgkkdyB5dmlldyAkdG9wLjAKICAgIH0KfQoKcHJvYyB0cmVlY2xpY2sge3cgeCB5fSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKCXJldHVybgogICAgfQogICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gbmUgIi8ifSB7CglzaG93ZmlsZSAkZQogICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKCXRyZWVjbG9zZWRpciAkdyAkZQogICAgfSBlbHNlIHsKCXRyZWVvcGVuZGlyICR3ICRlCiAgICB9Cn0KCnByb2Mgc2V0ZmlsZWxpc3Qge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IGNmbGlzdAoKICAgIHRyZWV2aWV3ICRjZmxpc3QgJHRyZWVmaWxlbGlzdCgkaWQpIDAKfQoKaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktcnQgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1ydF93aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktcnRfYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhmMCwgMHgwMCwKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnQtbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1ydC1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCiAgICAgICAweGY4LCAweDAzLCAweGY4LCAweDAxLCAweGY4LCAweDAwLCAweDc4LCAweDAwLCAweDM4LCAweDAwLCAweDE4LCAweDAwLAogICAgICAgMHgwOCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktZG4gLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1kbl93aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktZG5fYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwNywgMHhmOCwgMHgwMywKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG4tbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1kbi1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCiAgICAgICAweGY4LCAweDAzLCAweGYwLCAweDAxLCAweGUwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0KCnByb2MgaW5pdF9mbGlzdCB7Zmlyc3R9IHsKICAgIGdsb2JhbCBjZmxpc3QgY2ZsaXN0X3RvcCBzZWxlY3RlZGxpbmUgZGlmZmZpbGVzdGFydAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IGRlbGV0ZSAwLjAgZW5kCiAgICBpZiB7JGZpcnN0IG5lIHt9fSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGZpcnN0CglzZXQgY2ZsaXN0X3RvcCAxCgkkY2ZsaXN0IHRhZyBhZGQgaGlnaGxpZ2h0IDEuMCAiMS4wIGxpbmVlbmQiCiAgICB9IGVsc2UgewoJY2F0Y2gge3Vuc2V0IGNmbGlzdF90b3B9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgZGlmZmZpbGVzdGFydCB7fQp9Cgpwcm9jIGhpZ2hsaWdodF90YWcge2Z9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcGF0aHMKCiAgICBmb3JlYWNoIHAgJGhpZ2hsaWdodF9wYXRocyB7CglpZiB7W3N0cmluZyBtYXRjaCAkcCAkZl19IHsKCSAgICByZXR1cm4gImJvbGQiCgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBoaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNtaXRtb2RlIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJc2V0IGVuZCBbbGluZGV4IFtzcGxpdCBbJGNmbGlzdCBpbmRleCBlbmRdIC5dIDBdCglmb3Ige3NldCBsIDJ9IHskbCA8ICRlbmR9IHtpbmNyIGx9IHsKCSAgICBzZXQgbGluZSBbJGNmbGlzdCBnZXQgJGwuMCAiJGwuMCBsaW5lZW5kIl0KCSAgICBpZiB7W2hpZ2hsaWdodF90YWcgJGxpbmVdIG5lIHt9fSB7CgkJJGNmbGlzdCB0YWcgYWRkIGJvbGQgJGwuMCAiJGwuMCBsaW5lZW5kIgoJICAgIH0KCX0KICAgIH0gZWxzZSB7CgloaWdobGlnaHRfdHJlZSAyIHt9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgdW5oaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgYm9sZCAxLjAgZW5kCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgYWRkX2ZsaXN0IHtmbH0gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGZsIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAiXG4iCgkkY2ZsaXN0IGluc2VydCBlbmQgJGYgW2hpZ2hsaWdodF90YWcgJGZdCiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2Mgc2VsX2ZsaXN0IHt3IHggeX0gewogICAgZ2xvYmFsIGN0ZXh0IGRpZmZmaWxlc3RhcnQgY2ZsaXN0IGNmbGlzdF90b3AgY21pdG1vZGUKCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKICAgIH0gZWxzZSB7CgljYXRjaCB7JGN0ZXh0IHl2aWV3IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgW2V4cHIgeyRsIC0gMn1dXX0KICAgIH0KfQoKIyBGdW5jdGlvbnMgZm9yIGFkZGluZyBhbmQgcmVtb3Zpbmcgc2hlbGwtdHlwZSBxdW90aW5nCgpwcm9jIHNoZWxscXVvdGUge3N0cn0gewogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqXFsnXCJcXCBcdF0qIiAkc3RyXX0gewoJcmV0dXJuICRzdHIKICAgIH0KICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFxdKiIgJHN0cl19IHsKCXJldHVybiAiXCIkc3RyXCIiCiAgICB9CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIionKiIgJHN0cl19IHsKCXJldHVybiAiJyRzdHInIgogICAgfQogICAgcmV0dXJuICJcIltzdHJpbmcgbWFwIHtcIiBcXFwiIFxcIFxcXFx9ICRzdHJdXCIiCn0KCnByb2Mgc2hlbGxhcmdsaXN0IHtsfSB7CiAgICBzZXQgc3RyIHt9CiAgICBmb3JlYWNoIGEgJGwgewoJaWYgeyRzdHIgbmUge319IHsKCSAgICBhcHBlbmQgc3RyICIgIgoJfQoJYXBwZW5kIHN0ciBbc2hlbGxxdW90ZSAkYV0KICAgIH0KICAgIHJldHVybiAkc3RyCn0KCnByb2Mgc2hlbGxkZXF1b3RlIHtzdHJ9IHsKICAgIHNldCByZXQge30KICAgIHNldCB1c2VkIC0xCiAgICB3aGlsZSB7MX0gewoJaW5jciB1c2VkCglpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcWydcIlxcXFwgXHRdIiAkc3RyIGZpcnN0XX0gewoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIGVuZF0KCSAgICBzZXQgdXNlZCBbc3RyaW5nIGxlbmd0aCAkc3RyXQoJICAgIGJyZWFrCgl9CglzZXQgZmlyc3QgW2xpbmRleCAkZmlyc3QgMF0KCXNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJaWYgeyRmaXJzdCA+ICR1c2VkfSB7CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KCSAgICBzZXQgdXNlZCAkZmlyc3QKCX0KCWlmIHskY2ggZXEgIiAiIHx8ICRjaCBlcSAiXHQifSBicmVhawoJaW5jciB1c2VkCglpZiB7JGNoIGVxICInIn0gewoJICAgIHNldCBmaXJzdCBbc3RyaW5nIGZpcnN0ICInIiAkc3RyICR1c2VkXQoJICAgIGlmIHskZmlyc3QgPCAwfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBzaW5nbGUtcXVvdGUiCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkgICAgc2V0IHVzZWQgJGZpcnN0CgkgICAgY29udGludWUKCX0KCWlmIHskY2ggZXEgIlxcIn0gewoJICAgIGlmIHskdXNlZCA+PSBbc3RyaW5nIGxlbmd0aCAkc3RyXX0gewoJCWVycm9yICJ0cmFpbGluZyBiYWNrc2xhc2giCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQoJICAgIGNvbnRpbnVlCgl9CgkjIGhlcmUgY2ggPT0gIlwiIgoJd2hpbGUgezF9IHsKCSAgICBpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcW1wiXFxcXF0iICRzdHIgZmlyc3RdfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBkb3VibGUtcXVvdGUiCgkgICAgfQoJICAgIHNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQoJICAgIHNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJICAgIGlmIHskZmlyc3QgPiAkdXNlZH0gewoJCWFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkJc2V0IHVzZWQgJGZpcnN0CgkgICAgfQoJICAgIGlmIHskY2ggZXEgIlwiIn0gYnJlYWsKCSAgICBpbmNyIHVzZWQKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KCSAgICBpbmNyIHVzZWQKCX0KICAgIH0KICAgIHJldHVybiBbbGlzdCAkdXNlZCAkcmV0XQp9Cgpwcm9jIHNoZWxsc3BsaXQge3N0cn0gewogICAgc2V0IGwge30KICAgIHdoaWxlIHsxfSB7CglzZXQgc3RyIFtzdHJpbmcgdHJpbWxlZnQgJHN0cl0KCWlmIHskc3RyIGVxIHt9fSBicmVhawoJc2V0IGRxIFtzaGVsbGRlcXVvdGUgJHN0cl0KCXNldCBuIFtsaW5kZXggJGRxIDBdCglzZXQgd29yZCBbbGluZGV4ICRkcSAxXQoJc2V0IHN0ciBbc3RyaW5nIHJhbmdlICRzdHIgJG4gZW5kXQoJbGFwcGVuZCBsICR3b3JkCiAgICB9CiAgICByZXR1cm4gJGwKfQoKIyBDb2RlIHRvIGltcGxlbWVudCBtdWx0aXBsZSB2aWV3cwoKcHJvYyBuZXd2aWV3IHtpc2hpZ2hsaWdodH0gewogICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHVpZm9udCBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIG5ld3ZpZXdhcmdzIHJldnRyZWVhcmdzCgogICAgc2V0IG5ld2lzaGlnaGxpZ2h0ICRpc2hpZ2hsaWdodAogICAgc2V0IHRvcCAuZ2l0a3ZpZXcKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXd2aWV3bmFtZSgkbmV4dHZpZXdudW0pICJWaWV3ICRuZXh0dmlld251bSIKICAgIHNldCBuZXd2aWV3cGVybSgkbmV4dHZpZXdudW0pIDAKICAgIHNldCBuZXd2aWV3YXJncygkbmV4dHZpZXdudW0pIFtzaGVsbGFyZ2xpc3QgJHJldnRyZWVhcmdzXQogICAgdmlld2VkaXRvciAkdG9wICRuZXh0dmlld251bSAiR2l0ayB2aWV3IGRlZmluaXRpb24iCn0KCnByb2MgZWRpdHZpZXcge30gewogICAgZ2xvYmFsIGN1cnZpZXcKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3cGVybSBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybQogICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzCgogICAgc2V0IHRvcCAuZ2l0a3ZlZGl0LSRjdXJ2aWV3CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3dmlld25hbWUoJGN1cnZpZXcpICR2aWV3bmFtZSgkY3VydmlldykKICAgIHNldCBuZXd2aWV3cGVybSgkY3VydmlldykgJHZpZXdwZXJtKCRjdXJ2aWV3KQogICAgc2V0IG5ld3ZpZXdhcmdzKCRjdXJ2aWV3KSBbc2hlbGxhcmdsaXN0ICR2aWV3YXJncygkY3VydmlldyldCiAgICB2aWV3ZWRpdG9yICR0b3AgJGN1cnZpZXcgIkdpdGs6IGVkaXQgdmlldyAkdmlld25hbWUoJGN1cnZpZXcpIgp9Cgpwcm9jIHZpZXdlZGl0b3Ige3RvcCBuIHRpdGxlfSB7CiAgICBnbG9iYWwgbmV3dmlld25hbWUgbmV3dmlld3Blcm0gdmlld2ZpbGVzCiAgICBnbG9iYWwgdWlmb250CgogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAkdGl0bGUKICAgIGxhYmVsICR0b3AubmwgLXRleHQgIk5hbWUiIC1mb250ICR1aWZvbnQKICAgIGVudHJ5ICR0b3AubmFtZSAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBuZXd2aWV3bmFtZSgkbikKICAgIGdyaWQgJHRvcC5ubCAkdG9wLm5hbWUgLXN0aWNreSB3IC1wYWR5IDUKICAgIGNoZWNrYnV0dG9uICR0b3AucGVybSAtdGV4dCAiUmVtZW1iZXIgdGhpcyB2aWV3IiAtdmFyaWFibGUgbmV3dmlld3Blcm0oJG4pCiAgICBncmlkICR0b3AucGVybSAtIC1wYWR5IDUgLXN0aWNreSB3CiAgICBtZXNzYWdlICR0b3AuYWwgLWFzcGVjdCAxMDAwIC1mb250ICR1aWZvbnQgXAoJLXRleHQgIkNvbW1pdHMgdG8gaW5jbHVkZSAoYXJndW1lbnRzIHRvIGdpdCByZXYtbGlzdCk6IgogICAgZ3JpZCAkdG9wLmFsIC0gLXN0aWNreSB3IC1wYWR5IDUKICAgIGVudHJ5ICR0b3AuYXJncyAtd2lkdGggNTAgLXRleHR2YXJpYWJsZSBuZXd2aWV3YXJncygkbikgXAoJLWJhY2tncm91bmQgd2hpdGUKICAgIGdyaWQgJHRvcC5hcmdzIC0gLXN0aWNreSBldyAtcGFkeCA1CiAgICBtZXNzYWdlICR0b3AubCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCgktdGV4dCAiRW50ZXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIGluY2x1ZGUsIG9uZSBwZXIgbGluZToiCiAgICBncmlkICR0b3AubCAtIC1zdGlja3kgdwogICAgdGV4dCAkdG9wLnQgLXdpZHRoIDQwIC1oZWlnaHQgMTAgLWJhY2tncm91bmQgd2hpdGUKICAgIGlmIHtbaW5mbyBleGlzdHMgdmlld2ZpbGVzKCRuKV19IHsKCWZvcmVhY2ggZiAkdmlld2ZpbGVzKCRuKSB7CgkgICAgJHRvcC50IGluc2VydCBlbmQgJGYKCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAiXG4iCgl9CgkkdG9wLnQgZGVsZXRlIHtlbmQgLSAxY30gZW5kCgkkdG9wLnQgbWFyayBzZXQgaW5zZXJ0IDAuMAogICAgfQogICAgZ3JpZCAkdG9wLnQgLSAtc3RpY2t5IGV3IC1wYWR4IDUKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5vayAtdGV4dCAiT0siIC1jb21tYW5kIFtsaXN0IG5ld3ZpZXdvayAkdG9wICRuXQogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkdG9wXQogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudAp9Cgpwcm9jIGRvdmlld21lbnUge20gZmlyc3QgY21kIG9wIGFyZ3Z9IHsKICAgIHNldCBubWVudSBbJG0gaW5kZXggZW5kXQogICAgZm9yIHtzZXQgaSAkZmlyc3R9IHskaSA8PSAkbm1lbnV9IHtpbmNyIGl9IHsKCWlmIHtbJG0gZW50cnljZ2V0ICRpIC1jb21tYW5kXSBlcSAkY21kfSB7CgkgICAgZXZhbCAkbSAkb3AgJGkgJGFyZ3YKCSAgICBicmVhawoJfQogICAgfQp9Cgpwcm9jIGFsbHZpZXdtZW51cyB7biBvcCBhcmdzfSB7CiAgICBnbG9iYWwgdmlld2hsbWVudQoKICAgIGRvdmlld21lbnUgLmJhci52aWV3IDUgW2xpc3Qgc2hvd3ZpZXcgJG5dICRvcCAkYXJncwogICAgZG92aWV3bWVudSAkdmlld2hsbWVudSAxIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dICRvcCAkYXJncwp9Cgpwcm9jIG5ld3ZpZXdvayB7dG9wIG59IHsKICAgIGdsb2JhbCBuZXh0dmlld251bSBuZXd2aWV3cGVybSBuZXd2aWV3bmFtZSBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdmaWxlcyB2aWV3cGVybSBzZWxlY3RlZHZpZXcgY3VydmlldwogICAgZ2xvYmFsIHZpZXdhcmdzIG5ld3ZpZXdhcmdzIHZpZXdobG1lbnUKCiAgICBpZiB7W2NhdGNoIHsKCXNldCBuZXdhcmdzIFtzaGVsbHNwbGl0ICRuZXd2aWV3YXJncygkbildCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBpbiBjb21taXQgc2VsZWN0aW9uIGFyZ3VtZW50czogJGVyciIKCXdtIHJhaXNlICR0b3AKCWZvY3VzICR0b3AKCXJldHVybgogICAgfQogICAgc2V0IGZpbGVzIHt9CiAgICBmb3JlYWNoIGYgW3NwbGl0IFskdG9wLnQgZ2V0IDAuMCBlbmRdICJcbiJdIHsKCXNldCBmdCBbc3RyaW5nIHRyaW0gJGZdCglpZiB7JGZ0IG5lIHt9fSB7CgkgICAgbGFwcGVuZCBmaWxlcyAkZnQKCX0KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdmaWxlcygkbildfSB7CgkjIGNyZWF0aW5nIGEgbmV3IHZpZXcKCWluY3IgbmV4dHZpZXdudW0KCXNldCB2aWV3bmFtZSgkbikgJG5ld3ZpZXduYW1lKCRuKQoJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCglzZXQgdmlld2ZpbGVzKCRuKSAkZmlsZXMKCXNldCB2aWV3YXJncygkbikgJG5ld2FyZ3MKCWFkZHZpZXdtZW51ICRuCglpZiB7ISRuZXdpc2hpZ2hsaWdodH0gewoJICAgIGFmdGVyIGlkbGUgc2hvd3ZpZXcgJG4KCX0gZWxzZSB7CgkgICAgYWZ0ZXIgaWRsZSBhZGR2aGlnaGxpZ2h0ICRuCgl9CiAgICB9IGVsc2UgewoJIyBlZGl0aW5nIGFuIGV4aXN0aW5nIHZpZXcKCXNldCB2aWV3cGVybSgkbikgJG5ld3ZpZXdwZXJtKCRuKQoJaWYgeyRuZXd2aWV3bmFtZSgkbikgbmUgJHZpZXduYW1lKCRuKX0gewoJICAgIHNldCB2aWV3bmFtZSgkbikgJG5ld3ZpZXduYW1lKCRuKQoJICAgIGRvdmlld21lbnUgLmJhci52aWV3IDUgW2xpc3Qgc2hvd3ZpZXcgJG5dIFwKCQllbnRyeWNvbmYgW2xpc3QgLWxhYmVsICR2aWV3bmFtZSgkbildCgkgICAgZG92aWV3bWVudSAkdmlld2hsbWVudSAxIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dIFwKCQllbnRyeWNvbmYgW2xpc3QgLWxhYmVsICR2aWV3bmFtZSgkbikgLXZhbHVlICR2aWV3bmFtZSgkbildCgl9CglpZiB7JGZpbGVzIG5lICR2aWV3ZmlsZXMoJG4pIHx8ICRuZXdhcmdzIG5lICR2aWV3YXJncygkbil9IHsKCSAgICBzZXQgdmlld2ZpbGVzKCRuKSAkZmlsZXMKCSAgICBzZXQgdmlld2FyZ3MoJG4pICRuZXdhcmdzCgkgICAgaWYgeyRjdXJ2aWV3ID09ICRufSB7CgkJYWZ0ZXIgaWRsZSB1cGRhdGVjb21taXRzCgkgICAgfQoJfQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KfQoKcHJvYyBkZWx2aWV3IHt9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHZpZXdkYXRhIHZpZXdwZXJtIGhsdmlldyBzZWxlY3RlZGhsdmlldwoKICAgIGlmIHskY3VydmlldyA9PSAwfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkaGx2aWV3ID09ICRjdXJ2aWV3fSB7CglzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQoJdW5zZXQgaGx2aWV3CiAgICB9CiAgICBhbGx2aWV3bWVudXMgJGN1cnZpZXcgZGVsZXRlCiAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIHt9CiAgICBzZXQgdmlld3Blcm0oJGN1cnZpZXcpIDAKICAgIHNob3d2aWV3IDAKfQoKcHJvYyBhZGR2aWV3bWVudSB7bn0gewogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdobG1lbnUKCiAgICAuYmFyLnZpZXcgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkdmlld25hbWUoJG4pIFwKCS1jb21tYW5kIFtsaXN0IHNob3d2aWV3ICRuXSAtdmFyaWFibGUgc2VsZWN0ZWR2aWV3IC12YWx1ZSAkbgogICAgJHZpZXdobG1lbnUgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAkdmlld25hbWUoJG4pIFwKCS1jb21tYW5kIFtsaXN0IGFkZHZoaWdobGlnaHQgJG5dIC12YXJpYWJsZSBzZWxlY3RlZGhsdmlldwp9Cgpwcm9jIGZsYXR0ZW4ge3Zhcn0gewogICAgZ2xvYmFsICR2YXIKCiAgICBzZXQgcmV0IHt9CiAgICBmb3JlYWNoIGkgW2FycmF5IG5hbWVzICR2YXJdIHsKCWxhcHBlbmQgcmV0ICRpIFtzZXQgJHZhclwoJGlcKV0KICAgIH0KICAgIHJldHVybiAkcmV0Cn0KCnByb2MgdW5mbGF0dGVuIHt2YXIgbH0gewogICAgZ2xvYmFsICR2YXIKCiAgICBjYXRjaCB7dW5zZXQgJHZhcn0KICAgIGZvcmVhY2gge2kgdn0gJGwgewoJc2V0ICR2YXJcKCRpXCkgJHYKICAgIH0KfQoKcHJvYyBzaG93dmlldyB7bn0gewogICAgZ2xvYmFsIGN1cnZpZXcgdmlld2RhdGEgdmlld2ZpbGVzCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudGxpc3QgY2hpbGRsaXN0IHJvd2lkbGlzdCByb3dvZmZzZXRzCiAgICBnbG9iYWwgY29sb3JtYXAgcm93dGV4dHggY29tbWl0cm93IG5leHRjb2xvciBjYW52eG1heAogICAgZ2xvYmFsIG51bWNvbW1pdHMgcm93cmFuZ2VsaXN0IGNvbW1pdGxpc3RlZCBpZHJvd3JhbmdlcwogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgY2FudiBjYW52eTAKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHRyZWVkaWZmcwogICAgZ2xvYmFsIHBlbmRpbmdfc2VsZWN0IHBoYXNlCiAgICBnbG9iYWwgY29tbWl0aWR4IHJvd2xhaWRvdXQgcm93b3B0aW0gbGluZXNlZ2VuZHMKICAgIGdsb2JhbCBjb21tZmQgbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHNlbGVjdGVkdmlldwogICAgZ2xvYmFsIHZwYXJlbnRsaXN0IHZjaGlsZGxpc3QgdmRpc3BvcmRlciB2Y21pdGxpc3RlZAogICAgZ2xvYmFsIGhsdmlldyBzZWxlY3RlZGhsdmlldwoKICAgIGlmIHskbiA9PSAkY3Vydmlld30gcmV0dXJuCiAgICBzZXQgc2VsaWQge30KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IHNlbGlkICRjdXJyZW50aWQKCXNldCB5IFt5YyAkc2VsZWN0ZWRsaW5lXQoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJc2V0IHNwYW4gWyRjYW52IHl2aWV3XQoJc2V0IHl0b3AgW2V4cHIge1tsaW5kZXggJHNwYW4gMF0gKiAkeW1heH1dCglzZXQgeWJvdCBbZXhwciB7W2xpbmRleCAkc3BhbiAxXSAqICR5bWF4fV0KCWlmIHskeXRvcCA8ICR5ICYmICR5IDwgJHlib3R9IHsKCSAgICBzZXQgeXNjcmVlbiBbZXhwciB7JHkgLSAkeXRvcH1dCgl9IGVsc2UgewoJICAgIHNldCB5c2NyZWVuIFtleHByIHsoJHlib3QgLSAkeXRvcCkgLyAyfV0KCX0KICAgIH0KICAgIHVuc2VsZWN0bGluZQogICAgbm9ybWFsbGluZQogICAgc3RvcGZpbmRwcm9jCiAgICBpZiB7JGN1cnZpZXcgPj0gMH0gewoJc2V0IHZwYXJlbnRsaXN0KCRjdXJ2aWV3KSAkcGFyZW50bGlzdAoJc2V0IHZjaGlsZGxpc3QoJGN1cnZpZXcpICRjaGlsZGxpc3QKCXNldCB2ZGlzcG9yZGVyKCRjdXJ2aWV3KSAkZGlzcGxheW9yZGVyCglzZXQgdmNtaXRsaXN0ZWQoJGN1cnZpZXcpICRjb21taXRsaXN0ZWQKCWlmIHskcGhhc2UgbmUge319IHsKCSAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIFwKCQlbbGlzdCAkcGhhc2UgJHJvd2lkbGlzdCAkcm93b2Zmc2V0cyAkcm93cmFuZ2VsaXN0IFwKCQkgICAgIFtmbGF0dGVuIGlkcm93cmFuZ2VzXSBbZmxhdHRlbiBpZGlubGlzdF0gXAoJCSAgICAgJHJvd2xhaWRvdXQgJHJvd29wdGltICRudW1jb21taXRzICRsaW5lc2VnZW5kc10KCX0gZWxzZWlmIHshW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRjdXJ2aWV3KV0KCQkgIHx8IFtsaW5kZXggJHZpZXdkYXRhKCRjdXJ2aWV3KSAwXSBuZSB7fX0gewoJICAgIHNldCB2aWV3ZGF0YSgkY3VydmlldykgXAoJCVtsaXN0IHt9ICRyb3dpZGxpc3QgJHJvd29mZnNldHMgJHJvd3JhbmdlbGlzdF0KCX0KICAgIH0KICAgIGNhdGNoIHt1bnNldCBtYXRjaGluZ2xpbmVzfQogICAgY2F0Y2gge3Vuc2V0IHRyZWVkaWZmc30KICAgIGNsZWFyX2Rpc3BsYXkKICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkaGx2aWV3ID09ICRufSB7Cgl1bnNldCBobHZpZXcKCXNldCBzZWxlY3RlZGhsdmlldyBOb25lCiAgICB9CgogICAgc2V0IGN1cnZpZXcgJG4KICAgIHNldCBzZWxlY3RlZHZpZXcgJG4KICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRWRpdCogLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCiAgICAuYmFyLnZpZXcgZW50cnljb25mIERlbGV0ZSogLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCgogICAgaWYgeyFbaW5mbyBleGlzdHMgdmlld2RhdGEoJG4pXX0gewoJc2V0IHBlbmRpbmdfc2VsZWN0ICRzZWxpZAoJZ2V0Y29tbWl0cwoJcmV0dXJuCiAgICB9CgogICAgc2V0IHYgJHZpZXdkYXRhKCRuKQogICAgc2V0IHBoYXNlIFtsaW5kZXggJHYgMF0KICAgIHNldCBkaXNwbGF5b3JkZXIgJHZkaXNwb3JkZXIoJG4pCiAgICBzZXQgcGFyZW50bGlzdCAkdnBhcmVudGxpc3QoJG4pCiAgICBzZXQgY2hpbGRsaXN0ICR2Y2hpbGRsaXN0KCRuKQogICAgc2V0IGNvbW1pdGxpc3RlZCAkdmNtaXRsaXN0ZWQoJG4pCiAgICBzZXQgcm93aWRsaXN0IFtsaW5kZXggJHYgMV0KICAgIHNldCByb3dvZmZzZXRzIFtsaW5kZXggJHYgMl0KICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbmRleCAkdiAzXQogICAgaWYgeyRwaGFzZSBlcSB7fX0gewoJc2V0IG51bWNvbW1pdHMgW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KCWNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KICAgIH0gZWxzZSB7Cgl1bmZsYXR0ZW4gaWRyb3dyYW5nZXMgW2xpbmRleCAkdiA0XQoJdW5mbGF0dGVuIGlkaW5saXN0IFtsaW5kZXggJHYgNV0KCXNldCByb3dsYWlkb3V0IFtsaW5kZXggJHYgNl0KCXNldCByb3dvcHRpbSBbbGluZGV4ICR2IDddCglzZXQgbnVtY29tbWl0cyBbbGluZGV4ICR2IDhdCglzZXQgbGluZXNlZ2VuZHMgW2xpbmRleCAkdiA5XQogICAgfQoKICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KICAgIGNhdGNoIHt1bnNldCByb3d0ZXh0eH0KICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ4bWF4IFskY2FudiBjZ2V0IC13aWR0aF0KICAgIHNldCBjdXJ2aWV3ICRuCiAgICBzZXQgcm93IDAKICAgIHNldGNhbnZzY3JvbGwKICAgIHNldCB5ZiAwCiAgICBzZXQgcm93IDAKICAgIGlmIHskc2VsaWQgbmUge30gJiYgW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkbiwkc2VsaWQpXX0gewoJc2V0IHJvdyAkY29tbWl0cm93KCRuLCRzZWxpZCkKCSMgdHJ5IHRvIGdldCB0aGUgc2VsZWN0ZWQgcm93IGluIHRoZSBzYW1lIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4KCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCXNldCB5dG9wIFtleHByIHtbeWMgJHJvd10gLSAkeXNjcmVlbn1dCglpZiB7JHl0b3AgPCAwfSB7CgkgICAgc2V0IHl0b3AgMAoJfQoJc2V0IHlmIFtleHByIHskeXRvcCAqIDEuMCAvICR5bWF4fV0KICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byAkeWYKICAgIGRyYXd2aXNpYmxlCiAgICBzZWxlY3RsaW5lICRyb3cgMAogICAgaWYgeyRwaGFzZSBuZSB7fX0gewoJaWYgeyRwaGFzZSBlcSAiZ2V0Y29tbWl0cyJ9IHsKCSAgICBzaG93X3N0YXR1cyAiUmVhZGluZyBjb21taXRzLi4uIgoJfQoJaWYge1tpbmZvIGV4aXN0cyBjb21tZmQoJG4pXX0gewoJICAgIGxheW91dG1vcmUge30KCX0gZWxzZSB7CgkgICAgZmluaXNoY29tbWl0cwoJfQogICAgfSBlbHNlaWYgeyRudW1jb21taXRzID09IDB9IHsKCXNob3dfc3RhdHVzICJObyBjb21taXRzIHNlbGVjdGVkIgogICAgfQp9CgojIFN0dWZmIHJlbGF0aW5nIHRvIHRoZSBoaWdobGlnaHRpbmcgZmFjaWxpdHkKCnByb2MgaXNoaWdobGlnaHRlZCB7cm93fSB7CiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXSAmJiAkbmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJG5oaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXSAmJiAkdmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXSAmJiAkZmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJGZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXSAmJiAkcmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHJoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICByZXR1cm4gMAp9Cgpwcm9jIGJvbGRlbiB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIHNlbGVjdGVkbGluZSBib2xkcm93cwoKICAgIGxhcHBlbmQgYm9sZHJvd3MgJHJvdwogICAgJGNhbnYgaXRlbWNvbmYgJGxpbmVodGFnKCRyb3cpIC1mb250ICRmb250CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHJvdyA9PSAkc2VsZWN0ZWRsaW5lfSB7CgkkY2FudiBkZWxldGUgc2Vjc2VsCglzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJHJvdyldIFwKCQkgICAtb3V0bGluZSB7e319IC10YWdzIHNlY3NlbCBcCgkJICAgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyBib2xkZW5fbmFtZSB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52MiBsaW5lbnRhZyBzZWxlY3RlZGxpbmUgYm9sZG5hbWVyb3dzCgogICAgbGFwcGVuZCBib2xkbmFtZXJvd3MgJHJvdwogICAgJGNhbnYyIGl0ZW1jb25mICRsaW5lbnRhZygkcm93KSAtZm9udCAkZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRyb3cgPT0gJHNlbGVjdGVkbGluZX0gewoJJGNhbnYyIGRlbGV0ZSBzZWNzZWwKCXNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRyb3cpXSBcCgkJICAgLW91dGxpbmUge3t9fSAtdGFncyBzZWNzZWwgXAoJCSAgIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCgkkY2FudjIgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bmJvbGRlbiB7fSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgYm9sZHJvd3MKCiAgICBzZXQgc3RpbGxib2xkIHt9CiAgICBmb3JlYWNoIHJvdyAkYm9sZHJvd3MgewoJaWYgeyFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93ICRtYWluZm9udAoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHN0aWxsYm9sZCAkcm93Cgl9CiAgICB9CiAgICBzZXQgYm9sZHJvd3MgJHN0aWxsYm9sZAp9Cgpwcm9jIGFkZHZoaWdobGlnaHQge259IHsKICAgIGdsb2JhbCBobHZpZXcgY3VydmlldyB2aWV3ZGF0YSB2aGxfZG9uZSB2aGlnaGxpZ2h0cyBjb21taXRpZHgKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKCWRlbHZoaWdobGlnaHQKICAgIH0KICAgIHNldCBobHZpZXcgJG4KICAgIGlmIHskbiAhPSAkY3VydmlldyAmJiAhW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKCXNldCB2aWV3ZGF0YSgkbikgW2xpc3QgZ2V0Y29tbWl0cyB7e319IHt7fX0ge30ge30ge30gMCAwIDAge31dCglzZXQgdnBhcmVudGxpc3QoJG4pIHt9CglzZXQgdmNoaWxkbGlzdCgkbikge30KCXNldCB2ZGlzcG9yZGVyKCRuKSB7fQoJc2V0IHZjbWl0bGlzdGVkKCRuKSB7fQoJc3RhcnRfcmV2X2xpc3QgJG4KICAgIH0KICAgIHNldCB2aGxfZG9uZSAkY29tbWl0aWR4KCRobHZpZXcpCiAgICBpZiB7JHZobF9kb25lID4gMH0gewoJZHJhd3Zpc2libGUKICAgIH0KfQoKcHJvYyBkZWx2aGlnaGxpZ2h0IHt9IHsKICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBobHZpZXddfSByZXR1cm4KICAgIHVuc2V0IGhsdmlldwogICAgY2F0Y2gge3Vuc2V0IHZoaWdobGlnaHRzfQogICAgdW5ib2xkZW4KfQoKcHJvYyB2aGlnaGxpZ2h0bW9yZSB7fSB7CiAgICBnbG9iYWwgaGx2aWV3IHZobF9kb25lIGNvbW1pdGlkeCB2aGlnaGxpZ2h0cwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciB2ZGlzcG9yZGVyIGN1cnZpZXcgbWFpbmZvbnQKCiAgICBzZXQgZm9udCBbY29uY2F0ICRtYWluZm9udCBib2xkXQogICAgc2V0IG1heCAkY29tbWl0aWR4KCRobHZpZXcpCiAgICBpZiB7JGhsdmlldyA9PSAkY3Vydmlld30gewoJc2V0IGRpc3AgJGRpc3BsYXlvcmRlcgogICAgfSBlbHNlIHsKCXNldCBkaXNwICR2ZGlzcG9yZGVyKCRobHZpZXcpCiAgICB9CiAgICBzZXQgdnIgW3Zpc2libGVyb3dzXQogICAgc2V0IHIwIFtsaW5kZXggJHZyIDBdCiAgICBzZXQgcjEgW2xpbmRleCAkdnIgMV0KICAgIGZvciB7c2V0IGkgJHZobF9kb25lfSB7JGkgPCAkbWF4fSB7aW5jciBpfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcCAkaV0KCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CgkgICAgc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKCSAgICBpZiB7JHIwIDw9ICRyb3cgJiYgJHJvdyA8PSAkcjF9IHsKCQlpZiB7IVtoaWdobGlnaHRlZCAkcm93XX0gewoJCSAgICBib2xkZW4gJHJvdyAkZm9udAoJCX0KCQlzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQoJICAgIH0KCX0KICAgIH0KICAgIHNldCB2aGxfZG9uZSAkbWF4Cn0KCnByb2MgYXNrdmhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzIGNvbW1pdHJvdyBpZGRyYXduIG1haW5mb250CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGhsdmlldywkaWQpXX0gewoJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQogICAgfSBlbHNlIHsKCXNldCB2aGlnaGxpZ2h0cygkcm93KSAwCiAgICB9Cn0KCnByb2MgaGZpbGVzX2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZoX3NlcmlhbAogICAgZ2xvYmFsIG1haW5mb250IGhpZ2hsaWdodF9wYXRocwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCSMgZGVsZXRlIHByZXZpb3VzIGhpZ2hsaWdodHMKCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KCXVuc2V0IGZpbGVoaWdobGlnaHQKCWNhdGNoIHt1bnNldCBmaGlnaGxpZ2h0c30KCXVuYm9sZGVuCgl1bmhpZ2hsaWdodF9maWxlbGlzdAogICAgfQogICAgc2V0IGhpZ2hsaWdodF9wYXRocyB7fQogICAgYWZ0ZXIgY2FuY2VsIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAogICAgaW5jciBmaF9zZXJpYWwKICAgIGlmIHskaGlnaGxpZ2h0X2ZpbGVzIG5lIHt9fSB7CglhZnRlciAzMDAgZG9fZmlsZV9obCAkZmhfc2VyaWFsCiAgICB9Cn0KCnByb2MgbWFrZXBhdHRlcm5zIHtsfSB7CiAgICBzZXQgcmV0IHt9CiAgICBmb3JlYWNoIGUgJGwgewoJc2V0IGVlIFtzdHJpbmcgbWFwIHsiKiIgIlxcKiIgIj8iICJcXD8iICJcWyIgIlxcXFsiICJcXCIgIlxcXFwifSAkZV0KCWlmIHtbc3RyaW5nIGluZGV4ICRlZSBlbmRdIGVxICIvIn0gewoJICAgIGxhcHBlbmQgcmV0ICIkZWUqIgoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHJldCAkZWUKCSAgICBsYXBwZW5kIHJldCAiJGVlLyoiCgl9CiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIGRvX2ZpbGVfaGwge3NlcmlhbH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBmaWxlaGlnaGxpZ2h0IGhpZ2hsaWdodF9wYXRocyBnZHR0eXBlIGZobF9saXN0CgogICAgaWYgeyRnZHR0eXBlIGVxICJ0b3VjaGluZyBwYXRoczoifSB7CglpZiB7W2NhdGNoIHtzZXQgcGF0aHMgW3NoZWxsc3BsaXQgJGhpZ2hsaWdodF9maWxlc119XX0gcmV0dXJuCglzZXQgaGlnaGxpZ2h0X3BhdGhzIFttYWtlcGF0dGVybnMgJHBhdGhzXQoJaGlnaGxpZ2h0X2ZpbGVsaXN0CglzZXQgZ2R0YXJncyBbY29uY2F0IC0tICRwYXRoc10KICAgIH0gZWxzZSB7CglzZXQgZ2R0YXJncyBbbGlzdCAiLVMkaGlnaGxpZ2h0X2ZpbGVzIl0KICAgIH0KICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLXIgLXMgLS1zdGRpbiAkZ2R0YXJnc10KICAgIHNldCBmaWxlaGlnaGxpZ2h0IFtvcGVuICRjbWQgcitdCiAgICBmY29uZmlndXJlICRmaWxlaGlnaGxpZ2h0IC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGZpbGVoaWdobGlnaHQgcmVhZGFibGUgcmVhZGZoaWdobGlnaHQKICAgIHNldCBmaGxfbGlzdCB7fQogICAgZHJhd3Zpc2libGUKICAgIGZsdXNoaGlnaGxpZ2h0cwp9Cgpwcm9jIGZsdXNoaGlnaGxpZ2h0cyB7fSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGxfbGlzdAoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCWxhcHBlbmQgZmhsX2xpc3Qge30KCXB1dHMgJGZpbGVoaWdobGlnaHQgIiIKCWZsdXNoICRmaWxlaGlnaGxpZ2h0CiAgICB9Cn0KCnByb2MgYXNrZmlsZWhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaGxfbGlzdAoKICAgIGxhcHBlbmQgZmhsX2xpc3QgJGlkCiAgICBzZXQgZmhpZ2hsaWdodHMoJHJvdykgLTEKICAgIHB1dHMgJGZpbGVoaWdobGlnaHQgJGlkCn0KCnByb2MgcmVhZGZoaWdobGlnaHQge30gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgY29tbWl0cm93IGN1cnZpZXcgbWFpbmZvbnQgaWRkcmF3bgogICAgZ2xvYmFsIGZobF9saXN0CgogICAgd2hpbGUge1tnZXRzICRmaWxlaGlnaGxpZ2h0IGxpbmVdID49IDB9IHsKCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkZmhsX2xpc3QgJGxpbmVdCglpZiB7JGkgPCAwfSBjb250aW51ZQoJZm9yIHtzZXQgaiAwfSB7JGogPCAkaX0ge2luY3Igan0gewoJICAgIHNldCBpZCBbbGluZGV4ICRmaGxfbGlzdCAkal0KCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJCXNldCBmaGlnaGxpZ2h0cygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIDAKCSAgICB9Cgl9CglzZXQgZmhsX2xpc3QgW2xyYW5nZSAkZmhsX2xpc3QgW2V4cHIgeyRpKzF9XSBlbmRdCglpZiB7JGxpbmUgZXEge319IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGxpbmUpXX0gY29udGludWUKCXNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkbGluZSkKCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkbGluZSldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglzZXQgZmhpZ2hsaWdodHMoJHJvdykgMQogICAgfQogICAgaWYge1tlb2YgJGZpbGVoaWdobGlnaHRdfSB7CgkjIHN0cmFuZ2UuLi4KCXB1dHMgIm9vcHMsIGdpdCBkaWZmLXRyZWUgZGllZCIKCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KCXVuc2V0IGZpbGVoaWdobGlnaHQKICAgIH0KICAgIG5leHRfaGxjb250Cn0KCnByb2MgZmluZF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBtYWluZm9udCBib2xkbmFtZXJvd3MKICAgIGdsb2JhbCBmaW5kc3RyaW5nIGZpbmRwYXR0ZXJuIGZpbmR0eXBlCgogICAgIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cywgaWYgYW55CiAgICBmb3JlYWNoIHJvdyAkYm9sZG5hbWVyb3dzIHsKCWJvbGRlbl9uYW1lICRyb3cgJG1haW5mb250CiAgICB9CiAgICBzZXQgYm9sZG5hbWVyb3dzIHt9CiAgICBjYXRjaCB7dW5zZXQgbmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgogICAgaWYgeyRmaW5kdHlwZSBuZSAiUmVnZXhwIn0gewoJc2V0IGUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9IFwKCQkgICAkZmluZHN0cmluZ10KCXNldCBmaW5kcGF0dGVybiAiKiRlKiIKICAgIH0KICAgIGRyYXd2aXNpYmxlCn0KCnByb2MgYXNrZmluZGhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgbmhpZ2hsaWdodHMgY29tbWl0aW5mbyBpZGRyYXduIG1haW5mb250CiAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kdHlwZSBmaW5kbG9jIGZpbmRwYXR0ZXJuCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJZ2V0Y29tbWl0ICRpZAogICAgfQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGlzYm9sZCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KICAgIGZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJaWYgeyRmaW5kbG9jIG5lICJBbGwgZmllbGRzIiAmJiAkZmluZGxvYyBuZSAkdHl9IHsKCSAgICBjb250aW51ZQoJfQoJaWYgeyRmaW5kdHlwZSBlcSAiUmVnZXhwIn0gewoJICAgIHNldCBkb2VzbWF0Y2ggW3JlZ2V4cCAkZmluZHN0cmluZyAkZl0KCX0gZWxzZWlmIHskZmluZHR5cGUgZXEgIklnbkNhc2UifSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoIC1ub2Nhc2UgJGZpbmRwYXR0ZXJuICRmXQoJfSBlbHNlIHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggJGZpbmRwYXR0ZXJuICRmXQoJfQoJaWYgeyRkb2VzbWF0Y2h9IHsKCSAgICBpZiB7JHR5IGVxICJBdXRob3IifSB7CgkJc2V0IGlzYm9sZCAyCgkgICAgfSBlbHNlIHsKCQlzZXQgaXNib2xkIDEKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHsKCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglpZiB7JGlzYm9sZCA+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+PSAwfSB7CglzZXQgaWQgW2xpbmRleCAkYWxsaWRzICRpXQoJc2V0IGF0YWdzIHt9Cglmb3JlYWNoIHAgJGFsbHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJHApXX0gewoJCXNldCBwdGFncyBbbGlzdCAkcF0KCSAgICB9IGVsc2UgewoJCXNldCBwdGFncyAkYW5jX3RhZ3MoJHApCgkgICAgfQoJICAgIGlmIHskYXRhZ3MgZXEge319IHsKCQlzZXQgYXRhZ3MgJHB0YWdzCgkgICAgfSBlbHNlaWYgeyRwdGFncyBuZSAkYXRhZ3N9IHsKCQlzZXQgYXRhZ3MgW2NvbWJpbmVfYXRhZ3MgJGF0YWdzICRwdGFnc10KCSAgICB9Cgl9CglzZXQgYW5jX3RhZ3MoJGlkKSAkYXRhZ3MKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHQwID49IDUwfSB7CgkgICAgc2V0IHRyYXZpbmRleCAkaQoJICAgIGFmdGVyIGlkbGUgcmVzdGFydGF0YWdzCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYWxsY29tbWl0cyAiZG9uZSIKICAgIHNldCB0cmF2aW5kZXggMAogICAgbm90YnVzeSBhbGxjb21taXRzCiAgICBkaXNwbmVhcnRhZ3MKfQoKIyB1cGRhdGUgdGhlIGRlc2NfdGFncyBhbmQgYW5jX3RhZ3MgYXJyYXlzIGZvciBhIG5ldyB0YWcganVzdCBhZGRlZApwcm9jIGFkZGVkdGFnIHtpZH0gewogICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMKICAgIGdsb2JhbCBpZHRhZ3MgdGFnaXNkZXNjIGFsbGR0YWdzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSByZXR1cm4KICAgIHNldCBhZHQgJGRlc2NfdGFncygkaWQpCiAgICBmb3JlYWNoIHQgJGRlc2NfdGFncygkaWQpIHsKCXNldCBhZHQgW2NvbmNhdCAkYWR0ICRhbGxkdGFncygkdCldCiAgICB9CiAgICBzZXQgYWR0IFtsc29ydCAtdW5pcXVlICRhZHRdCiAgICBzZXQgYWxsZHRhZ3MoJGlkKSAkYWR0CiAgICBmb3JlYWNoIHQgJGFkdCB7CglzZXQgdGFnaXNkZXNjKCRpZCwkdCkgLTEKCXNldCB0YWdpc2Rlc2MoJHQsJGlkKSAxCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSB7CglzZXQgdG9kbyAkYW5jX3RhZ3MoJGlkKQoJd2hpbGUgeyR0b2RvIG5lIHt9fSB7CgkgICAgc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCSAgICBzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCRpZCwkZG8pXX0gY29udGludWUKCSAgICBzZXQgdGFnaXNkZXNjKCRkbywkaWQpIC0xCgkgICAgc2V0IHRhZ2lzZGVzYygkaWQsJGRvKSAxCgkgICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkZG8pXX0gewoJCXNldCB0b2RvIFtjb25jYXQgJHRvZG8gJGFuY190YWdzKCRkbyldCgkgICAgfQoJfQogICAgfQoKICAgIHNldCBsYXN0b2xkICRkZXNjX3RhZ3MoJGlkKQogICAgc2V0IGxhc3RuZXcgW2xpc3QgJGlkXQogICAgc2V0IG51cCAwCiAgICBzZXQgbmNoIDAKICAgIHNldCB0b2RvICRhbGxwYXJlbnRzKCRpZCkKICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGRvKV19IGNvbnRpbnVlCglpZiB7JGRlc2NfdGFncygkZG8pIG5lICRsYXN0b2xkfSB7CgkgICAgc2V0IGxhc3RvbGQgJGRlc2NfdGFncygkZG8pCgkgICAgc2V0IGxhc3RuZXcgW2NvbWJpbmVfZHRhZ3MgJGxhc3RvbGQgW2xpc3QgJGlkXV0KCSAgICBpbmNyIG5jaAoJfQoJaWYgeyRsYXN0b2xkIGVxICRsYXN0bmV3fSBjb250aW51ZQoJc2V0IGRlc2NfdGFncygkZG8pICRsYXN0bmV3CglpbmNyIG51cAoJaWYgeyFbaW5mbyBleGlzdHMgaWR0YWdzKCRkbyldfSB7CgkgICAgc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkYWxscGFyZW50cygkZG8pXQoJfQogICAgfQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSByZXR1cm4KICAgIHNldCBsYXN0b2xkICRhbmNfdGFncygkaWQpCiAgICBzZXQgbGFzdG5ldyBbbGlzdCAkaWRdCiAgICBzZXQgbnVwIDAKICAgIHNldCBuY2ggMAogICAgc2V0IHRvZG8gJGFsbGNoaWxkcmVuKCRpZCkKICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBhbmNfdGFncygkZG8pXX0gY29udGludWUKCWlmIHskYW5jX3RhZ3MoJGRvKSBuZSAkbGFzdG9sZH0gewoJICAgIHNldCBsYXN0b2xkICRhbmNfdGFncygkZG8pCgkgICAgc2V0IGxhc3RuZXcgW2NvbWJpbmVfYXRhZ3MgJGxhc3RvbGQgW2xpc3QgJGlkXV0KCSAgICBpbmNyIG5jaAoJfQoJaWYgeyRsYXN0b2xkIGVxICRsYXN0bmV3fSBjb250aW51ZQoJc2V0IGFuY190YWdzKCRkbykgJGxhc3RuZXcKCWluY3IgbnVwCglpZiB7IVtpbmZvIGV4aXN0cyBpZHRhZ3MoJGRvKV19IHsKCSAgICBzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRhbGxjaGlsZHJlbigkZG8pXQoJfQogICAgfQp9CgojIHVwZGF0ZSB0aGUgZGVzY19oZWFkcyBhcnJheSBmb3IgYSBuZXcgaGVhZCBqdXN0IGFkZGVkCnByb2MgYWRkZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgaGVhZGlkcygkaGVhZCkgJGhpZAogICAgbGFwcGVuZCBpZGhlYWRzKCRoaWQpICRoZWFkCgogICAgc2V0IHRvZG8gW2xpc3QgJGhpZF0KICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRkbyldIHx8CgkgICAgW2xzZWFyY2ggLWV4YWN0ICRkZXNjX2hlYWRzKCRkbykgJGhlYWRdID49IDB9IGNvbnRpbnVlCglzZXQgb2xkaGVhZHMgJGRlc2NfaGVhZHMoJGRvKQoJbGFwcGVuZCBkZXNjX2hlYWRzKCRkbykgJGhlYWQKCXNldCBoZWFkcyAkZGVzY19oZWFkcygkZG8pCgl3aGlsZSB7MX0gewoJICAgIHNldCBwICRhbGxwYXJlbnRzKCRkbykKCSAgICBpZiB7W2xsZW5ndGggJHBdICE9IDEgfHwgIVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRwKV0gfHwKCQkkZGVzY19oZWFkcygkcCkgbmUgJG9sZGhlYWRzfSBicmVhawoJICAgIHNldCBkbyAkcAoJICAgIHNldCBkZXNjX2hlYWRzKCRkbykgJGhlYWRzCgl9CglzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRwXQogICAgfQp9CgojIHVwZGF0ZSB0aGUgZGVzY19oZWFkcyBhcnJheSBmb3IgYSBoZWFkIGp1c3QgcmVtb3ZlZApwcm9jIHJlbW92ZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKCiAgICB1bnNldCBoZWFkaWRzKCRoZWFkKQogICAgaWYgeyRpZGhlYWRzKCRoaWQpIGVxICRoZWFkfSB7Cgl1bnNldCBpZGhlYWRzKCRoaWQpCiAgICB9IGVsc2UgewoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZGhlYWRzKCRoaWQpICRoZWFkXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkaGlkKSBbbHJlcGxhY2UgJGlkaGVhZHMoJGhpZCkgJGkgJGldCgl9CiAgICB9CgogICAgc2V0IHRvZG8gW2xpc3QgJGhpZF0KICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRkbyldfSBjb250aW51ZQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRkZXNjX2hlYWRzKCRkbykgJGhlYWRdCglpZiB7JGkgPCAwfSBjb250aW51ZQoJc2V0IG9sZGhlYWRzICRkZXNjX2hlYWRzKCRkbykKCXNldCBoZWFkcyBbbHJlcGxhY2UgJGRlc2NfaGVhZHMoJGRvKSAkaSAkaV0KCXdoaWxlIHsxfSB7CgkgICAgc2V0IGRlc2NfaGVhZHMoJGRvKSAkaGVhZHMKCSAgICBzZXQgcCAkYWxscGFyZW50cygkZG8pCgkgICAgaWYge1tsbGVuZ3RoICRwXSAhPSAxIHx8ICFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcCldIHx8CgkJJGRlc2NfaGVhZHMoJHApIG5lICRvbGRoZWFkc30gYnJlYWsKCSAgICBzZXQgZG8gJHAKCX0KCXNldCB0b2RvIFtjb25jYXQgJHRvZG8gJHBdCiAgICB9Cn0KCiMgdXBkYXRlIHRoaW5ncyBmb3IgYSBoZWFkIG1vdmVkIHRvIGEgY2hpbGQgb2YgaXRzIHByZXZpb3VzIGxvY2F0aW9uCnByb2MgbW92ZWRoZWFkIHtpZCBuYW1lfSB7CiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IG9sZGlkICRoZWFkaWRzKCRuYW1lKQogICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAogICAgaWYgeyRpZGhlYWRzKCRvbGRpZCkgZXEgJG5hbWV9IHsKCXVuc2V0IGlkaGVhZHMoJG9sZGlkKQogICAgfSBlbHNlIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRoZWFkcygkb2xkaWQpICRuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkb2xkaWQpIFtscmVwbGFjZSAkaWRoZWFkcygkb2xkaWQpICRpICRpXQoJfQogICAgfQogICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKfQoKcHJvYyBjaGFuZ2VkcmVmcyB7fSB7CiAgICBnbG9iYWwgZGVzY19oZWFkcyBkZXNjX3RhZ3MgYW5jX3RhZ3MgYWxsY29tbWl0cyBhbGxpZHMKICAgIGdsb2JhbCBhbGxjaGlsZHJlbiBhbGxwYXJlbnRzIGlkdGFncyB0cmF2aW5kZXgKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gcmV0dXJuCiAgICBjYXRjaCB7dW5zZXQgZGVzY19oZWFkc30KICAgIGNhdGNoIHt1bnNldCBkZXNjX3RhZ3N9CiAgICBjYXRjaCB7dW5zZXQgYW5jX3RhZ3N9CiAgICBjYXRjaCB7dW5zZXQgYWxsZHRhZ3N9CiAgICBjYXRjaCB7dW5zZXQgdGFnaXNkZXNjfQogICAgZm9yZWFjaCBpZCAkYWxsaWRzIHsKCWZvcndhcmRfcGFzcyAkaWQgJGFsbGNoaWxkcmVuKCRpZCkKICAgIH0KICAgIGlmIHskYWxsY29tbWl0cyBuZSAicmVhZGluZyJ9IHsKCXNldCB0cmF2aW5kZXggW2xsZW5ndGggJGFsbGlkc10KCWlmIHskYWxsY29tbWl0cyBuZSAidHJhdmVyc2luZyJ9IHsKCSAgICBzZXQgYWxsY29tbWl0cyAidHJhdmVyc2luZyIKCSAgICBhZnRlciBpZGxlIHJlc3RhcnRhdGFncwoJfQogICAgfQp9Cgpwcm9jIHJlcmVhZHJlZnMge30gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICBzZXQgb2xkbWFpbmhlYWQgJG1haW5oZWFkCiAgICByZWFkcmVmcwogICAgY2hhbmdlZHJlZnMKICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkJW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCXNldCB2IFtsaXN0cmVmcyAkaWRdCglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV0gfHwgJHJlZigkaWQpICE9ICR2IHx8CgkgICAgKCRpZCBlcSAkb2xkbWFpbmhlYWQgJiYgJGlkIG5lICRtYWluaGVhZCkgfHwKCSAgICAoJGlkIGVxICRtYWluaGVhZCAmJiAkaWQgbmUgJG9sZG1haW5oZWFkKX0gewoJICAgIHJlZHJhd3RhZ3MgJGlkCgl9CiAgICB9Cn0KCnByb2MgbGlzdHJlZnMge2lkfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKCiAgICBzZXQgeCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCB4ICRpZHRhZ3MoJGlkKQogICAgfQogICAgc2V0IHkge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IHkgJGlkaGVhZHMoJGlkKQogICAgfQogICAgc2V0IHoge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB6ICRpZG90aGVycmVmcygkaWQpCiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHggJHkgJHpdCn0KCnByb2Mgc2hvd3RhZyB7dGFnIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgdGFnY29udGVudHMgdGFnaWRzIGxpbmtudW0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2hvd3RhZyAkdGFnIDBdCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgc2V0IGxpbmtudW0gMAogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCXNldCB0ZXh0ICR0YWdjb250ZW50cygkdGFnKQogICAgfSBlbHNlIHsKCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dCB7fQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpbml0X2ZsaXN0IHt9Cn0KCnByb2MgZG9xdWl0IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkCiAgICBzZXQgc3RvcHBlZCAxMDAKICAgIHNhdmVzdHVmZiAuCiAgICBkZXN0cm95IC4KfQoKcHJvYyBkb3ByZWZzIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBjdGV4dCBkaWZmY29sb3JzCgogICAgc2V0IHRvcCAuZ2l0a3ByZWZzCiAgICBzZXQgcHJlZnN0b3AgJHRvcAogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgZm9yZWFjaCB2IHttYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBzaG93bmVhcnRhZ3N9IHsKCXNldCBvbGRwcmVmcygkdikgW3NldCAkdl0KICAgIH0KICAgIHRvcGxldmVsICR0b3AKICAgIHdtIHRpdGxlICR0b3AgIkdpdGsgcHJlZmVyZW5jZXMiCiAgICBsYWJlbCAkdG9wLmxkaXNwIC10ZXh0ICJDb21taXQgbGlzdCBkaXNwbGF5IG9wdGlvbnMiCiAgICBncmlkICR0b3AubGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3Auc3BhY2VyIC10ZXh0ICIgIgogICAgbGFiZWwgJHRvcC5tYXh3aWR0aGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKGxpbmVzKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHdpZHRoIC1mcm9tIDAgLXRvIDEwMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIG1heHdpZHRoCiAgICBncmlkICR0b3Auc3BhY2VyICR0b3AubWF4d2lkdGhsICR0b3AubWF4d2lkdGggLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLm1heHBjdGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKCUgb2YgcGFuZSkiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIHNwaW5ib3ggJHRvcC5tYXhwY3QgLWZyb20gMSAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4Z3JhcGhwY3QKICAgIGdyaWQgeCAkdG9wLm1heHBjdGwgJHRvcC5tYXhwY3QgLXN0aWNreSB3CgogICAgbGFiZWwgJHRvcC5kZGlzcCAtdGV4dCAiRGlmZiBkaXNwbGF5IG9wdGlvbnMiCiAgICBncmlkICR0b3AuZGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZGlmZm9wdGwgLXRleHQgIk9wdGlvbnMgZm9yIGRpZmYgcHJvZ3JhbSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgZW50cnkgJHRvcC5kaWZmb3B0IC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIGRpZmZvcHRzCiAgICBncmlkIHggJHRvcC5kaWZmb3B0bCAkdG9wLmRpZmZvcHQgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLm50YWcKICAgIGxhYmVsICR0b3AubnRhZy5sIC10ZXh0ICJEaXNwbGF5IG5lYXJieSB0YWdzIiAtZm9udCBvcHRpb25mb250CiAgICBjaGVja2J1dHRvbiAkdG9wLm50YWcuYiAtdmFyaWFibGUgc2hvd25lYXJ0YWdzCiAgICBwYWNrICR0b3AubnRhZy5iICR0b3AubnRhZy5sIC1zaWRlIGxlZnQKICAgIGdyaWQgeCAkdG9wLm50YWcgLXN0aWNreSB3CgogICAgbGFiZWwgJHRvcC5jZGlzcCAtdGV4dCAiQ29sb3JzOiBwcmVzcyB0byBjaG9vc2UiCiAgICBncmlkICR0b3AuY2Rpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuYmcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRiZ2NvbG9yCiAgICBidXR0b24gJHRvcC5iZ2J1dCAtdGV4dCAiQmFja2dyb3VuZCIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBiZ2NvbG9yIDAgJHRvcC5iZyBiYWNrZ3JvdW5kIHNldGJnXQogICAgZ3JpZCB4ICR0b3AuYmdidXQgJHRvcC5iZyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZmcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRmZ2NvbG9yCiAgICBidXR0b24gJHRvcC5mZ2J1dCAtdGV4dCAiRm9yZWdyb3VuZCIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBmZ2NvbG9yIDAgJHRvcC5mZyBmb3JlZ3JvdW5kIHNldGZnXQogICAgZ3JpZCB4ICR0b3AuZmdidXQgJHRvcC5mZyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZGlmZm9sZCAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAwXQogICAgYnV0dG9uICR0b3AuZGlmZm9sZGJ1dCAtdGV4dCAiRGlmZjogb2xkIGxpbmVzIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGRpZmZjb2xvcnMgMCAkdG9wLmRpZmZvbGQgImRpZmYgb2xkIGxpbmVzIiBcCgkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlZ3JvdW5kXV0KICAgIGdyaWQgeCAkdG9wLmRpZmZvbGRidXQgJHRvcC5kaWZmb2xkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kaWZmbmV3IC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDFdCiAgICBidXR0b24gJHRvcC5kaWZmbmV3YnV0IC10ZXh0ICJEaWZmOiBuZXcgbGluZXMiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAxICR0b3AuZGlmZm5ldyAiZGlmZiBuZXcgbGluZXMiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuZGlmZm5ld2J1dCAkdG9wLmRpZmZuZXcgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmh1bmtzZXAgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMl0KICAgIGJ1dHRvbiAkdG9wLmh1bmtzZXBidXQgLXRleHQgIkRpZmY6IGh1bmsgaGVhZGVyIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGRpZmZjb2xvcnMgMiAkdG9wLmh1bmtzZXAgXAoJCSAgICAgICJkaWZmIGh1bmsgaGVhZGVyIiBcCgkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuaHVua3NlcGJ1dCAkdG9wLmh1bmtzZXAgLXN0aWNreSB3CgogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgcHJlZnNvawogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgcHJlZnNjYW4KICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtIC1wYWR5IDEwIC1zdGlja3kgZXcKfQoKcHJvYyBjaG9vc2Vjb2xvciB7diB2aSB3IHggY21kfSB7CiAgICBnbG9iYWwgJHYKCiAgICBzZXQgYyBbdGtfY2hvb3NlQ29sb3IgLWluaXRpYWxjb2xvciBbbGluZGV4IFtzZXQgJHZdICR2aV0gXAoJICAgICAgIC10aXRsZSAiR2l0azogY2hvb3NlIGNvbG9yIGZvciAkeCJdCiAgICBpZiB7JGMgZXEge319IHJldHVybgogICAgJHcgY29uZiAtYmFja2dyb3VuZCAkYwogICAgbHNldCAkdiAkdmkgJGMKICAgIGV2YWwgJGNtZCAkYwp9Cgpwcm9jIHNldGJnIHtjfSB7CiAgICBnbG9iYWwgYmdsaXN0CgogICAgZm9yZWFjaCB3ICRiZ2xpc3QgewoJJHcgY29uZiAtYmFja2dyb3VuZCAkYwogICAgfQp9Cgpwcm9jIHNldGZnIHtjfSB7CiAgICBnbG9iYWwgZmdsaXN0IGNhbnYKCiAgICBmb3JlYWNoIHcgJGZnbGlzdCB7CgkkdyBjb25mIC1mb3JlZ3JvdW5kICRjCiAgICB9CiAgICBhbGxjYW52cyBpdGVtY29uZiB0ZXh0IC1maWxsICRjCiAgICAkY2FudiBpdGVtY29uZiBjaXJjbGUgLW91dGxpbmUgJGMKfQoKcHJvYyBwcmVmc2NhbiB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKCiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFnc30gewoJc2V0ICR2ICRvbGRwcmVmcygkdikKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwcmVmc3RvcH0KICAgIHVuc2V0IHByZWZzdG9wCn0KCnByb2MgcHJlZnNvayB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKCiAgICBjYXRjaCB7ZGVzdHJveSAkcHJlZnN0b3B9CiAgICB1bnNldCBwcmVmc3RvcAogICAgaWYgeyRtYXh3aWR0aCAhPSAkb2xkcHJlZnMobWF4d2lkdGgpCgl8fCAkbWF4Z3JhcGhwY3QgIT0gJG9sZHByZWZzKG1heGdyYXBocGN0KX0gewoJcmVkaXNwbGF5CiAgICB9IGVsc2VpZiB7JHNob3duZWFydGFncyAhPSAkb2xkcHJlZnMoc2hvd25lYXJ0YWdzKX0gewoJcmVzZWxlY3RsaW5lCiAgICB9Cn0KCnByb2MgZm9ybWF0ZGF0ZSB7ZH0gewogICAgcmV0dXJuIFtjbG9jayBmb3JtYXQgJGQgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQp9CgojIFRoaXMgbGlzdCBvZiBlbmNvZGluZyBuYW1lcyBhbmQgYWxpYXNlcyBpcyBkaXN0aWxsZWQgZnJvbQojIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMuCiMgTm90IGFsbCBvZiB0aGVtIGFyZSBzdXBwb3J0ZWQgYnkgVGNsLgpzZXQgZW5jb2RpbmdfYWxpYXNlcyB7CiAgICB7IEFOU0lfWDMuNC0xOTY4IGlzby1pci02IEFOU0lfWDMuNC0xOTg2IElTT182NDYuaXJ2OjE5OTEgQVNDSUkKICAgICAgSVNPNjQ2LVVTIFVTLUFTQ0lJIHVzIElCTTM2NyBjcDM2NyBjc0FTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVURi0xIGNzSVNPMTA2NDZVVEYxIH0KICAgIHsgSVNPXzY0Ni5iYXNpYzoxOTgzIHJlZiBjc0lTTzY0NmJhc2ljMTk4MyB9CiAgICB7IElOVkFSSUFOVCBjc0lOVkFSSUFOVCB9CiAgICB7IElTT182NDYuaXJ2OjE5ODMgaXNvLWlyLTIgaXJ2IGNzSVNPMkludGxSZWZWZXJzaW9uIH0KICAgIHsgQlNfNDczMCBpc28taXItNCBJU082NDYtR0IgZ2IgdWsgY3NJU080VW5pdGVkS2luZ2RvbSB9CiAgICB7IE5BVFMtU0VGSSBpc28taXItOC0xIGNzTkFUU1NFRkkgfQogICAgeyBOQVRTLVNFRkktQUREIGlzby1pci04LTIgY3NOQVRTU0VGSUFERCB9CiAgICB7IE5BVFMtREFOTyBpc28taXItOS0xIGNzTkFUU0RBTk8gfQogICAgeyBOQVRTLURBTk8tQUREIGlzby1pci05LTIgY3NOQVRTREFOT0FERCB9CiAgICB7IFNFTl84NTAyMDBfQiBpc28taXItMTAgRkkgSVNPNjQ2LUZJIElTTzY0Ni1TRSBzZSBjc0lTTzEwU3dlZGlzaCB9CiAgICB7IFNFTl84NTAyMDBfQyBpc28taXItMTEgSVNPNjQ2LVNFMiBzZTIgY3NJU08xMVN3ZWRpc2hGb3JOYW1lcyB9CiAgICB7IEtTX0NfNTYwMS0xOTg3IGlzby1pci0xNDkgS1NfQ181NjAxLTE5ODkgS1NDXzU2MDEga29yZWFuIGNzS1NDNTYwMTE5ODcgfQogICAgeyBJU08tMjAyMi1LUiBjc0lTTzIwMjJLUiB9CiAgICB7IEVVQy1LUiBjc0VVQ0tSIH0KICAgIHsgSVNPLTIwMjItSlAgY3NJU08yMDIySlAgfQogICAgeyBJU08tMjAyMi1KUC0yIGNzSVNPMjAyMkpQMiB9CiAgICB7IEpJU19DNjIyMC0xOTY5LWpwIEpJU19DNjIyMC0xOTY5IGlzby1pci0xMyBrYXRha2FuYSB4MDIwMS03CiAgICAgIGNzSVNPMTNKSVNDNjIyMGpwIH0KICAgIHsgSklTX0M2MjIwLTE5Njktcm8gaXNvLWlyLTE0IGpwIElTTzY0Ni1KUCBjc0lTTzE0SklTQzYyMjBybyB9CiAgICB7IElUIGlzby1pci0xNSBJU082NDYtSVQgY3NJU08xNUl0YWxpYW4gfQogICAgeyBQVCBpc28taXItMTYgSVNPNjQ2LVBUIGNzSVNPMTZQb3J0dWd1ZXNlIH0KICAgIHsgRVMgaXNvLWlyLTE3IElTTzY0Ni1FUyBjc0lTTzE3U3BhbmlzaCB9CiAgICB7IGdyZWVrNy1vbGQgaXNvLWlyLTE4IGNzSVNPMThHcmVlazdPbGQgfQogICAgeyBsYXRpbi1ncmVlayBpc28taXItMTkgY3NJU08xOUxhdGluR3JlZWsgfQogICAgeyBESU5fNjYwMDMgaXNvLWlyLTIxIGRlIElTTzY0Ni1ERSBjc0lTTzIxR2VybWFuIH0KICAgIHsgTkZfWl82Mi0wMTBfKDE5NzMpIGlzby1pci0yNSBJU082NDYtRlIxIGNzSVNPMjVGcmVuY2ggfQogICAgeyBMYXRpbi1ncmVlay0xIGlzby1pci0yNyBjc0lTTzI3TGF0aW5HcmVlazEgfQogICAgeyBJU09fNTQyNyBpc28taXItMzcgY3NJU081NDI3Q3lyaWxsaWMgfQogICAgeyBKSVNfQzYyMjYtMTk3OCBpc28taXItNDIgY3NJU080MkpJU0M2MjI2MTk3OCB9CiAgICB7IEJTX3ZpZXdkYXRhIGlzby1pci00NyBjc0lTTzQ3QlNWaWV3ZGF0YSB9CiAgICB7IElOSVMgaXNvLWlyLTQ5IGNzSVNPNDlJTklTIH0KICAgIHsgSU5JUy04IGlzby1pci01MCBjc0lTTzUwSU5JUzggfQogICAgeyBJTklTLWN5cmlsbGljIGlzby1pci01MSBjc0lTTzUxSU5JU0N5cmlsbGljIH0KICAgIHsgSVNPXzU0Mjc6MTk4MSBpc28taXItNTQgSVNPNTQyN0N5cmlsbGljMTk4MSB9CiAgICB7IElTT181NDI4OjE5ODAgaXNvLWlyLTU1IGNzSVNPNTQyOEdyZWVrIH0KICAgIHsgR0JfMTk4OC04MCBpc28taXItNTcgY24gSVNPNjQ2LUNOIGNzSVNPNTdHQjE5ODggfQogICAgeyBHQl8yMzEyLTgwIGlzby1pci01OCBjaGluZXNlIGNzSVNPNThHQjIzMTI4MCB9CiAgICB7IE5TXzQ1NTEtMSBpc28taXItNjAgSVNPNjQ2LU5PIG5vIGNzSVNPNjBEYW5pc2hOb3J3ZWdpYW4KICAgICAgY3NJU082ME5vcndlZ2lhbjEgfQogICAgeyBOU180NTUxLTIgSVNPNjQ2LU5PMiBpc28taXItNjEgbm8yIGNzSVNPNjFOb3J3ZWdpYW4yIH0KICAgIHsgTkZfWl82Mi0wMTAgaXNvLWlyLTY5IElTTzY0Ni1GUiBmciBjc0lTTzY5RnJlbmNoIH0KICAgIHsgdmlkZW90ZXgtc3VwcGwgaXNvLWlyLTcwIGNzSVNPNzBWaWRlb3RleFN1cHAxIH0KICAgIHsgUFQyIGlzby1pci04NCBJU082NDYtUFQyIGNzSVNPODRQb3J0dWd1ZXNlMiB9CiAgICB7IEVTMiBpc28taXItODUgSVNPNjQ2LUVTMiBjc0lTTzg1U3BhbmlzaDIgfQogICAgeyBNU1pfNzc5NS4zIGlzby1pci04NiBJU082NDYtSFUgaHUgY3NJU084Nkh1bmdhcmlhbiB9CiAgICB7IEpJU19DNjIyNi0xOTgzIGlzby1pci04NyB4MDIwOCBKSVNfWDAyMDgtMTk4MyBjc0lTTzg3SklTWDAyMDggfQogICAgeyBncmVlazcgaXNvLWlyLTg4IGNzSVNPODhHcmVlazcgfQogICAgeyBBU01PXzQ0OSBJU09fOTAzNiBhcmFiaWM3IGlzby1pci04OSBjc0lTTzg5QVNNTzQ0OSB9CiAgICB7IGlzby1pci05MCBjc0lTTzkwIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYSBpc28taXItOTEganAtb2NyLWEgY3NJU085MUpJU0M2MjI5MTk4NGEgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iIGlzby1pci05MiBJU082NDYtSlAtT0NSLUIganAtb2NyLWIKICAgICAgY3NJU085MkpJU0M2Mjk5MTk4NGIgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iLWFkZCBpc28taXItOTMganAtb2NyLWItYWRkIGNzSVNPOTNKSVM2MjI5MTk4NGJhZGQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kIGlzby1pci05NCBqcC1vY3ItaGFuZCBjc0lTTzk0SklTNjIyOTE5ODRoYW5kIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZC1hZGQgaXNvLWlyLTk1IGpwLW9jci1oYW5kLWFkZAogICAgICBjc0lTTzk1SklTNjIyOTE5ODRoYW5kYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQta2FuYSBpc28taXItOTYgY3NJU085NkpJU0M2MjI5MTk4NGthbmEgfQogICAgeyBJU09fMjAzMy0xOTgzIGlzby1pci05OCBlMTNiIGNzSVNPMjAzMyB9CiAgICB7IEFOU0lfWDMuMTEwLTE5ODMgaXNvLWlyLTk5IENTQV9UNTAwLTE5ODMgTkFQTFBTIGNzSVNPOTlOQVBMUFMgfQogICAgeyBJU09fODg1OS0xOjE5ODcgaXNvLWlyLTEwMCBJU09fODg1OS0xIElTTy04ODU5LTEgbGF0aW4xIGwxIElCTTgxOQogICAgICBDUDgxOSBjc0lTT0xhdGluMSB9CiAgICB7IElTT184ODU5LTI6MTk4NyBpc28taXItMTAxIElTT184ODU5LTIgSVNPLTg4NTktMiBsYXRpbjIgbDIgY3NJU09MYXRpbjIgfQogICAgeyBULjYxLTdiaXQgaXNvLWlyLTEwMiBjc0lTTzEwMlQ2MTdiaXQgfQogICAgeyBULjYxLThiaXQgVC42MSBpc28taXItMTAzIGNzSVNPMTAzVDYxOGJpdCB9CiAgICB7IElTT184ODU5LTM6MTk4OCBpc28taXItMTA5IElTT184ODU5LTMgSVNPLTg4NTktMyBsYXRpbjMgbDMgY3NJU09MYXRpbjMgfQogICAgeyBJU09fODg1OS00OjE5ODggaXNvLWlyLTExMCBJU09fODg1OS00IElTTy04ODU5LTQgbGF0aW40IGw0IGNzSVNPTGF0aW40IH0KICAgIHsgRUNNQS1jeXJpbGxpYyBpc28taXItMTExIEtPSTgtRSBjc0lTTzExMUVDTUFDeXJpbGxpYyB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0xIGlzby1pci0xMjEgSVNPNjQ2LUNBIGNzYTctMSBjYSBjc0lTTzEyMUNhbmFkaWFuMSB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0yIGlzby1pci0xMjIgSVNPNjQ2LUNBMiBjc2E3LTIgY3NJU08xMjJDYW5hZGlhbjIgfQogICAgeyBDU0FfWjI0My40LTE5ODUtZ3IgaXNvLWlyLTEyMyBjc0lTTzEyM0NTQVoyNDM0MTk4NWdyIH0KICAgIHsgSVNPXzg4NTktNjoxOTg3IGlzby1pci0xMjcgSVNPXzg4NTktNiBJU08tODg1OS02IEVDTUEtMTE0IEFTTU8tNzA4CiAgICAgIGFyYWJpYyBjc0lTT0xhdGluQXJhYmljIH0KICAgIHsgSVNPXzg4NTktNi1FIGNzSVNPODg1OTZFIElTTy04ODU5LTYtRSB9CiAgICB7IElTT184ODU5LTYtSSBjc0lTTzg4NTk2SSBJU08tODg1OS02LUkgfQogICAgeyBJU09fODg1OS03OjE5ODcgaXNvLWlyLTEyNiBJU09fODg1OS03IElTTy04ODU5LTcgRUxPVF85MjggRUNNQS0xMTgKICAgICAgZ3JlZWsgZ3JlZWs4IGNzSVNPTGF0aW5HcmVlayB9CiAgICB7IFQuMTAxLUcyIGlzby1pci0xMjggY3NJU08xMjhUMTAxRzIgfQogICAgeyBJU09fODg1OS04OjE5ODggaXNvLWlyLTEzOCBJU09fODg1OS04IElTTy04ODU5LTggaGVicmV3CiAgICAgIGNzSVNPTGF0aW5IZWJyZXcgfQogICAgeyBJU09fODg1OS04LUUgY3NJU084ODU5OEUgSVNPLTg4NTktOC1FIH0KICAgIHsgSVNPXzg4NTktOC1JIGNzSVNPODg1OThJIElTTy04ODU5LTgtSSB9CiAgICB7IENTTl8zNjkxMDMgaXNvLWlyLTEzOSBjc0lTTzEzOUNTTjM2OTEwMyB9CiAgICB7IEpVU19JLkIxLjAwMiBpc28taXItMTQxIElTTzY0Ni1ZVSBqcyB5dSBjc0lTTzE0MUpVU0lCMTAwMiB9CiAgICB7IElTT182OTM3LTItYWRkIGlzby1pci0xNDIgY3NJU09UZXh0Q29tbSB9CiAgICB7IElFQ19QMjctMSBpc28taXItMTQzIGNzSVNPMTQzSUVDUDI3MSB9CiAgICB7IElTT184ODU5LTU6MTk4OCBpc28taXItMTQ0IElTT184ODU5LTUgSVNPLTg4NTktNSBjeXJpbGxpYwogICAgICBjc0lTT0xhdGluQ3lyaWxsaWMgfQogICAgeyBKVVNfSS5CMS4wMDMtc2VyYiBpc28taXItMTQ2IHNlcmJpYW4gY3NJU08xNDZTZXJiaWFuIH0KICAgIHsgSlVTX0kuQjEuMDAzLW1hYyBtYWNlZG9uaWFuIGlzby1pci0xNDcgY3NJU08xNDdNYWNlZG9uaWFuIH0KICAgIHsgSVNPXzg4NTktOToxOTg5IGlzby1pci0xNDggSVNPXzg4NTktOSBJU08tODg1OS05IGxhdGluNSBsNSBjc0lTT0xhdGluNSB9CiAgICB7IGdyZWVrLWNjaXR0IGlzby1pci0xNTAgY3NJU08xNTAgY3NJU08xNTBHcmVla0NDSVRUIH0KICAgIHsgTkNfTkMwMC0xMDo4MSBjdWJhIGlzby1pci0xNTEgSVNPNjQ2LUNVIGNzSVNPMTUxQ3ViYSB9CiAgICB7IElTT182OTM3LTItMjUgaXNvLWlyLTE1MiBjc0lTTzY5MzdBZGQgfQogICAgeyBHT1NUXzE5NzY4LTc0IFNUX1NFVl8zNTgtODggaXNvLWlyLTE1MyBjc0lTTzE1M0dPU1QxOTc2ODc0IH0KICAgIHsgSVNPXzg4NTktc3VwcCBpc28taXItMTU0IGxhdGluMS0yLTUgY3NJU084ODU5U3VwcCB9CiAgICB7IElTT18xMDM2Ny1ib3ggaXNvLWlyLTE1NSBjc0lTTzEwMzY3Qm94IH0KICAgIHsgSVNPLTg4NTktMTAgaXNvLWlyLTE1NyBsNiBJU09fODg1OS0xMDoxOTkyIGNzSVNPTGF0aW42IGxhdGluNiB9CiAgICB7IGxhdGluLWxhcCBsYXAgaXNvLWlyLTE1OCBjc0lTTzE1OExhcCB9CiAgICB7IEpJU19YMDIxMi0xOTkwIHgwMjEyIGlzby1pci0xNTkgY3NJU08xNTlKSVNYMDIxMjE5OTAgfQogICAgeyBEU18yMDg5IERTMjA4OSBJU082NDYtREsgZGsgY3NJU082NDZEYW5pc2ggfQogICAgeyB1cy1kayBjc1VTREsgfQogICAgeyBkay11cyBjc0RLVVMgfQogICAgeyBKSVNfWDAyMDEgWDAyMDEgY3NIYWxmV2lkdGhLYXRha2FuYSB9CiAgICB7IEtTQzU2MzYgSVNPNjQ2LUtSIGNzS1NDNTYzNiB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtMiBjc1VuaWNvZGUgfQogICAgeyBJU08tMTA2NDYtVUNTLTQgY3NVQ1M0IH0KICAgIHsgREVDLU1DUyBkZWMgY3NERUNNQ1MgfQogICAgeyBocC1yb21hbjggcm9tYW44IHI4IGNzSFBSb21hbjggfQogICAgeyBtYWNpbnRvc2ggbWFjIGNzTWFjaW50b3NoIH0KICAgIHsgSUJNMDM3IGNwMDM3IGViY2RpYy1jcC11cyBlYmNkaWMtY3AtY2EgZWJjZGljLWNwLXd0IGViY2RpYy1jcC1ubAogICAgICBjc0lCTTAzNyB9CiAgICB7IElCTTAzOCBFQkNESUMtSU5UIGNwMDM4IGNzSUJNMDM4IH0KICAgIHsgSUJNMjczIENQMjczIGNzSUJNMjczIH0KICAgIHsgSUJNMjc0IEVCQ0RJQy1CRSBDUDI3NCBjc0lCTTI3NCB9CiAgICB7IElCTTI3NSBFQkNESUMtQlIgY3AyNzUgY3NJQk0yNzUgfQogICAgeyBJQk0yNzcgRUJDRElDLUNQLURLIEVCQ0RJQy1DUC1OTyBjc0lCTTI3NyB9CiAgICB7IElCTTI3OCBDUDI3OCBlYmNkaWMtY3AtZmkgZWJjZGljLWNwLXNlIGNzSUJNMjc4IH0KICAgIHsgSUJNMjgwIENQMjgwIGViY2RpYy1jcC1pdCBjc0lCTTI4MCB9CiAgICB7IElCTTI4MSBFQkNESUMtSlAtRSBjcDI4MSBjc0lCTTI4MSB9CiAgICB7IElCTTI4NCBDUDI4NCBlYmNkaWMtY3AtZXMgY3NJQk0yODQgfQogICAgeyBJQk0yODUgQ1AyODUgZWJjZGljLWNwLWdiIGNzSUJNMjg1IH0KICAgIHsgSUJNMjkwIGNwMjkwIEVCQ0RJQy1KUC1rYW5hIGNzSUJNMjkwIH0KICAgIHsgSUJNMjk3IGNwMjk3IGViY2RpYy1jcC1mciBjc0lCTTI5NyB9CiAgICB7IElCTTQyMCBjcDQyMCBlYmNkaWMtY3AtYXIxIGNzSUJNNDIwIH0KICAgIHsgSUJNNDIzIGNwNDIzIGViY2RpYy1jcC1nciBjc0lCTTQyMyB9CiAgICB7IElCTTQyNCBjcDQyNCBlYmNkaWMtY3AtaGUgY3NJQk00MjQgfQogICAgeyBJQk00MzcgY3A0MzcgNDM3IGNzUEM4Q29kZVBhZ2U0MzcgfQogICAgeyBJQk01MDAgQ1A1MDAgZWJjZGljLWNwLWJlIGViY2RpYy1jcC1jaCBjc0lCTTUwMCB9CiAgICB7IElCTTc3NSBjcDc3NSBjc1BDNzc1QmFsdGljIH0KICAgIHsgSUJNODUwIGNwODUwIDg1MCBjc1BDODUwTXVsdGlsaW5ndWFsIH0KICAgIHsgSUJNODUxIGNwODUxIDg1MSBjc0lCTTg1MSB9CiAgICB7IElCTTg1MiBjcDg1MiA4NTIgY3NQQ3A4NTIgfQogICAgeyBJQk04NTUgY3A4NTUgODU1IGNzSUJNODU1IH0KICAgIHsgSUJNODU3IGNwODU3IDg1NyBjc0lCTTg1NyB9CiAgICB7IElCTTg2MCBjcDg2MCA4NjAgY3NJQk04NjAgfQogICAgeyBJQk04NjEgY3A4NjEgODYxIGNwLWlzIGNzSUJNODYxIH0KICAgIHsgSUJNODYyIGNwODYyIDg2MiBjc1BDODYyTGF0aW5IZWJyZXcgfQogICAgeyBJQk04NjMgY3A4NjMgODYzIGNzSUJNODYzIH0KICAgIHsgSUJNODY0IGNwODY0IGNzSUJNODY0IH0KICAgIHsgSUJNODY1IGNwODY1IDg2NSBjc0lCTTg2NSB9CiAgICB7IElCTTg2NiBjcDg2NiA4NjYgY3NJQk04NjYgfQogICAgeyBJQk04NjggQ1A4NjggY3AtYXIgY3NJQk04NjggfQogICAgeyBJQk04NjkgY3A4NjkgODY5IGNwLWdyIGNzSUJNODY5IH0KICAgIHsgSUJNODcwIENQODcwIGViY2RpYy1jcC1yb2VjZSBlYmNkaWMtY3AteXUgY3NJQk04NzAgfQogICAgeyBJQk04NzEgQ1A4NzEgZWJjZGljLWNwLWlzIGNzSUJNODcxIH0KICAgIHsgSUJNODgwIGNwODgwIEVCQ0RJQy1DeXJpbGxpYyBjc0lCTTg4MCB9CiAgICB7IElCTTg5MSBjcDg5MSBjc0lCTTg5MSB9CiAgICB7IElCTTkwMyBjcDkwMyBjc0lCTTkwMyB9CiAgICB7IElCTTkwNCBjcDkwNCA5MDQgY3NJQkJNOTA0IH0KICAgIHsgSUJNOTA1IENQOTA1IGViY2RpYy1jcC10ciBjc0lCTTkwNSB9CiAgICB7IElCTTkxOCBDUDkxOCBlYmNkaWMtY3AtYXIyIGNzSUJNOTE4IH0KICAgIHsgSUJNMTAyNiBDUDEwMjYgY3NJQk0xMDI2IH0KICAgIHsgRUJDRElDLUFULURFIGNzSUJNRUJDRElDQVRERSB9CiAgICB7IEVCQ0RJQy1BVC1ERS1BIGNzRUJDRElDQVRERUEgfQogICAgeyBFQkNESUMtQ0EtRlIgY3NFQkNESUNDQUZSIH0KICAgIHsgRUJDRElDLURLLU5PIGNzRUJDRElDREtOTyB9CiAgICB7IEVCQ0RJQy1ESy1OTy1BIGNzRUJDRElDREtOT0EgfQogICAgeyBFQkNESUMtRkktU0UgY3NFQkNESUNGSVNFIH0KICAgIHsgRUJDRElDLUZJLVNFLUEgY3NFQkNESUNGSVNFQSB9CiAgICB7IEVCQ0RJQy1GUiBjc0VCQ0RJQ0ZSIH0KICAgIHsgRUJDRElDLUlUIGNzRUJDRElDSVQgfQogICAgeyBFQkNESUMtUFQgY3NFQkNESUNQVCB9CiAgICB7IEVCQ0RJQy1FUyBjc0VCQ0RJQ0VTIH0KICAgIHsgRUJDRElDLUVTLUEgY3NFQkNESUNFU0EgfQogICAgeyBFQkNESUMtRVMtUyBjc0VCQ0RJQ0VTUyB9CiAgICB7IEVCQ0RJQy1VSyBjc0VCQ0RJQ1VLIH0KICAgIHsgRUJDRElDLVVTIGNzRUJDRElDVVMgfQogICAgeyBVTktOT1dOLThCSVQgY3NVbmtub3duOEJpVCB9CiAgICB7IE1ORU1PTklDIGNzTW5lbW9uaWMgfQogICAgeyBNTkVNIGNzTW5lbSB9CiAgICB7IFZJU0NJSSBjc1ZJU0NJSSB9CiAgICB7IFZJUVIgY3NWSVFSIH0KICAgIHsgS09JOC1SIGNzS09JOFIgfQogICAgeyBJQk0wMDg1OCBDQ1NJRDAwODU4IENQMDA4NTggUEMtTXVsdGlsaW5ndWFsLTg1MCtldXJvIH0KICAgIHsgSUJNMDA5MjQgQ0NTSUQwMDkyNCBDUDAwOTI0IGViY2RpYy1MYXRpbjktLWV1cm8gfQogICAgeyBJQk0wMTE0MCBDQ1NJRDAxMTQwIENQMDExNDAgZWJjZGljLXVzLTM3K2V1cm8gfQogICAgeyBJQk0wMTE0MSBDQ1NJRDAxMTQxIENQMDExNDEgZWJjZGljLWRlLTI3MytldXJvIH0KICAgIHsgSUJNMDExNDIgQ0NTSUQwMTE0MiBDUDAxMTQyIGViY2RpYy1kay0yNzcrZXVybyBlYmNkaWMtbm8tMjc3K2V1cm8gfQogICAgeyBJQk0wMTE0MyBDQ1NJRDAxMTQzIENQMDExNDMgZWJjZGljLWZpLTI3OCtldXJvIGViY2RpYy1zZS0yNzgrZXVybyB9CiAgICB7IElCTTAxMTQ0IENDU0lEMDExNDQgQ1AwMTE0NCBlYmNkaWMtaXQtMjgwK2V1cm8gfQogICAgeyBJQk0wMTE0NSBDQ1NJRDAxMTQ1IENQMDExNDUgZWJjZGljLWVzLTI4NCtldXJvIH0KICAgIHsgSUJNMDExNDYgQ0NTSUQwMTE0NiBDUDAxMTQ2IGViY2RpYy1nYi0yODUrZXVybyB9CiAgICB7IElCTTAxMTQ3IENDU0lEMDExNDcgQ1AwMTE0NyBlYmNkaWMtZnItMjk3K2V1cm8gfQogICAgeyBJQk0wMTE0OCBDQ1NJRDAxMTQ4IENQMDExNDggZWJjZGljLWludGVybmF0aW9uYWwtNTAwK2V1cm8gfQogICAgeyBJQk0wMTE0OSBDQ1NJRDAxMTQ5IENQMDExNDkgZWJjZGljLWlzLTg3MStldXJvIH0KICAgIHsgSUJNMTA0NyBJQk0tMTA0NyB9CiAgICB7IFBUQ1AxNTQgY3NQVENQMTU0IFBUMTU0IENQMTU0IEN5cmlsbGljLUFzaWFuIH0KICAgIHsgQW1pZ2EtMTI1MSBBbWkxMjUxIEFtaWdhMTI1MSBBbWktMTI1MSB9CiAgICB7IFVOSUNPREUtMS0xIGNzVW5pY29kZTExIH0KICAgIHsgQ0VTVS04IGNzQ0VTVS04IH0KICAgIHsgQk9DVS0xIGNzQk9DVS0xIH0KICAgIHsgVU5JQ09ERS0xLTEtVVRGLTcgY3NVbmljb2RlMTFVVEY3IH0KICAgIHsgSVNPLTg4NTktMTQgaXNvLWlyLTE5OSBJU09fODg1OS0xNDoxOTk4IElTT184ODU5LTE0IGxhdGluOCBpc28tY2VsdGljCiAgICAgIGw4IH0KICAgIHsgSVNPLTg4NTktMTUgSVNPXzg4NTktMTUgTGF0aW4tOSB9CiAgICB7IElTTy04ODU5LTE2IGlzby1pci0yMjYgSVNPXzg4NTktMTY6MjAwMSBJU09fODg1OS0xNiBsYXRpbjEwIGwxMCB9CiAgICB7IEdCSyBDUDkzNiBNUzkzNiB3aW5kb3dzLTkzNiB9CiAgICB7IEpJU19FbmNvZGluZyBjc0pJU0VuY29kaW5nIH0KICAgIHsgU2hpZnRfSklTIE1TX0thbmppIGNzU2hpZnRKSVMgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfUGFja2VkX0Zvcm1hdF9mb3JfSmFwYW5lc2UgY3NFVUNQa2RGbXRKYXBhbmVzZQogICAgICBFVUMtSlAgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfRml4ZWRfV2lkdGhfZm9yX0phcGFuZXNlIGNzRVVDRml4V2lkSmFwYW5lc2UgfQogICAgeyBJU08tMTA2NDYtVUNTLUJhc2ljIGNzVW5pY29kZUFTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVuaWNvZGUtTGF0aW4xIGNzVW5pY29kZUxhdGluMSBJU08tMTA2NDYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2MSBjc1VuaWNvZGVJQk0xMjYxIH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjggY3NVbmljb2RlSUJNMTI2OCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjc2IGNzVW5pY29kZUlCTTEyNzYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NCBjc1VuaWNvZGVJQk0xMjY0IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjUgY3NVbmljb2RlSUJNMTI2NSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjAtTGF0aW4tMSBjc1dpbmRvd3MzMExhdGluMSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjEtTGF0aW4tMSBjc1dpbmRvd3MzMUxhdGluMSB9CiAgICB7IElTTy04ODU5LTItV2luZG93cy1MYXRpbi0yIGNzV2luZG93czMxTGF0aW4yIH0KICAgIHsgSVNPLTg4NTktOS1XaW5kb3dzLUxhdGluLTUgY3NXaW5kb3dzMzFMYXRpbjUgfQogICAgeyBBZG9iZS1TdGFuZGFyZC1FbmNvZGluZyBjc0Fkb2JlU3RhbmRhcmRFbmNvZGluZyB9CiAgICB7IFZlbnR1cmEtVVMgY3NWZW50dXJhVVMgfQogICAgeyBWZW50dXJhLUludGVybmF0aW9uYWwgY3NWZW50dXJhSW50ZXJuYXRpb25hbCB9CiAgICB7IFBDOC1EYW5pc2gtTm9yd2VnaWFuIGNzUEM4RGFuaXNoTm9yd2VnaWFuIH0KICAgIHsgUEM4LVR1cmtpc2ggY3NQQzhUdXJraXNoIH0KICAgIHsgSUJNLVN5bWJvbHMgY3NJQk1TeW1ib2xzIH0KICAgIHsgSUJNLVRoYWkgY3NJQk1UaGFpIH0KICAgIHsgSFAtTGVnYWwgY3NIUExlZ2FsIH0KICAgIHsgSFAtUGktZm9udCBjc0hQUGlGb250IH0KICAgIHsgSFAtTWF0aDggY3NIUE1hdGg4IH0KICAgIHsgQWRvYmUtU3ltYm9sLUVuY29kaW5nIGNzSFBQU01hdGggfQogICAgeyBIUC1EZXNrVG9wIGNzSFBEZXNrdG9wIH0KICAgIHsgVmVudHVyYS1NYXRoIGNzVmVudHVyYU1hdGggfQogICAgeyBNaWNyb3NvZnQtUHVibGlzaGluZyBjc01pY3Jvc29mdFB1Ymxpc2hpbmcgfQogICAgeyBXaW5kb3dzLTMxSiBjc1dpbmRvd3MzMUogfQogICAgeyBHQjIzMTIgY3NHQjIzMTIgfQogICAgeyBCaWc1IGNzQmlnNSB9Cn0KCnByb2MgdGNsX2VuY29kaW5nIHtlbmN9IHsKICAgIGdsb2JhbCBlbmNvZGluZ19hbGlhc2VzCiAgICBzZXQgbmFtZXMgW2VuY29kaW5nIG5hbWVzXQogICAgc2V0IGxjbmFtZXMgW3N0cmluZyB0b2xvd2VyICRuYW1lc10KICAgIHNldCBlbmMgW3N0cmluZyB0b2xvd2VyICRlbmNdCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY10KICAgIGlmIHskaSA8IDB9IHsKCSMgbG9vayBmb3IgImlzb25ubiIgaW5zdGVhZCBvZiAiaXNvLW5ubiIgb3IgImlzb19ubm4iCglpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlbmMgaXNvIGVuY3hdfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmN4XQoJfQogICAgfQogICAgaWYgeyRpIDwgMH0gewoJZm9yZWFjaCBsICRlbmNvZGluZ19hbGlhc2VzIHsKCSAgICBzZXQgbGwgW3N0cmluZyB0b2xvd2VyICRsXQoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGxsICRlbmNdIDwgMH0gY29udGludWUKCSAgICAjIGxvb2sgdGhyb3VnaCB0aGUgYWxpYXNlcyBmb3Igb25lIHRoYXQgdGNsIGtub3dzIGFib3V0CgkgICAgZm9yZWFjaCBlICRsbCB7CgkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlXQoJCWlmIHskaSA8IDB9IHsKCQkgICAgaWYge1tyZWdzdWIge15pc29bLV9dfSAkZSBpc28gZXhdfSB7CgkJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZXhdCgkJICAgIH0KCQl9CgkJaWYgeyRpID49IDB9IGJyZWFrCgkgICAgfQoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBpZiB7JGkgPj0gMH0gewoJcmV0dXJuIFtsaW5kZXggJG5hbWVzICRpXQogICAgfQogICAgcmV0dXJuIHt9Cn0KCiMgZGVmYXVsdHMuLi4Kc2V0IGRhdGVtb2RlIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdCBkaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBnaXRlbmNvZGluZyB7fQpjYXRjaCB7CiAgICBzZXQgZ2l0ZW5jb2RpbmcgW2V4ZWMgZ2l0IGNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nXQp9CmlmIHskZ2l0ZW5jb2RpbmcgPT0gIiJ9IHsKICAgIHNldCBnaXRlbmNvZGluZyAidXRmLTgiCn0Kc2V0IHRjbGVuY29kaW5nIFt0Y2xfZW5jb2RpbmcgJGdpdGVuY29kaW5nXQppZiB7JHRjbGVuY29kaW5nID09IHt9fSB7CiAgICBwdXRzIHN0ZGVyciAiV2FybmluZzogZW5jb2RpbmcgJGdpdGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgVGNsL1RrIgp9CgpzZXQgbWFpbmZvbnQge0hlbHZldGljYSA5fQpzZXQgdGV4dGZvbnQge0NvdXJpZXIgOX0Kc2V0IHVpZm9udCB7SGVsdmV0aWNhIDkgYm9sZH0Kc2V0IGZpbmRtZXJnZWZpbGVzIDAKc2V0IG1heGdyYXBocGN0IDUwCnNldCBtYXh3aWR0aCAxNgpzZXQgcmV2bGlzdG9yZGVyIDAKc2V0IGZhc3RkYXRlIDAKc2V0IHVwYXJyb3dsZW4gNwpzZXQgZG93bmFycm93bGVuIDcKc2V0IG1pbmdhcGxlbiAzMApzZXQgY21pdG1vZGUgInBhdGNoIgpzZXQgd3JhcGNvbW1lbnQgIm5vbmUiCnNldCBzaG93bmVhcnRhZ3MgMQoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CnNldCBiZ2NvbG9yIHdoaXRlCnNldCBmZ2NvbG9yIGJsYWNrCnNldCBkaWZmY29sb3JzIHtyZWQgIiMwMGEwMDAiIGJsdWV9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9Cgpmb250IGNyZWF0ZSBvcHRpb25mb250IC1mYW1pbHkgc2Fucy1zZXJpZiAtc2l6ZSAtMTIKCnNldCByZXZ0cmVlYXJncyB7fQpmb3JlYWNoIGFyZyAkYXJndiB7CiAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkYXJnIHsKCSJeJCIgeyB9CgkiXi1kIiB7IHNldCBkYXRlbW9kZSAxIH0KCWRlZmF1bHQgewoJICAgIGxhcHBlbmQgcmV2dHJlZWFyZ3MgJGFyZwoJfQogICAgfQp9CgojIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4Kc2V0IGdpdGRpciBbZ2l0ZGlyXQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CiAgICBzaG93X2Vycm9yIHt9IC4gIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKICAgIGV4aXQgMQp9CgpzZXQgY21kbGluZV9maWxlcyB7fQpzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHJldnRyZWVhcmdzICItLSJdCmlmIHskaSA+PSAwfSB7CiAgICBzZXQgY21kbGluZV9maWxlcyBbbHJhbmdlICRyZXZ0cmVlYXJncyBbZXhwciB7JGkgKyAxfV0gZW5kXQogICAgc2V0IHJldnRyZWVhcmdzIFtscmFuZ2UgJHJldnRyZWVhcmdzIDAgW2V4cHIgeyRpIC0gMX1dXQp9IGVsc2VpZiB7JHJldnRyZWVhcmdzIG5lIHt9fSB7CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtldmFsIGV4ZWMgZ2l0IHJldi1wYXJzZSAtLW5vLXJldnMgLS1uby1mbGFncyAkcmV2dHJlZWFyZ3NdCglzZXQgY21kbGluZV9maWxlcyBbc3BsaXQgJGYgIlxuIl0KCXNldCBuIFtsbGVuZ3RoICRjbWRsaW5lX2ZpbGVzXQoJc2V0IHJldnRyZWVhcmdzIFtscmFuZ2UgJHJldnRyZWVhcmdzIDAgZW5kLSRuXQogICAgfSBlcnJdfSB7CgkjIHVuZm9ydHVuYXRlbHkgd2UgZ2V0IGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgaW4gJGVyciwKCSMgc28gbG9vayBmb3IgImZhdGFsOiIuCglzZXQgaSBbc3RyaW5nIGZpcnN0ICJmYXRhbDoiICRlcnJdCglpZiB7JGkgPiAwfSB7CgkgICAgc2V0IGVyciBbc3RyaW5nIHJhbmdlICRlcnIgW2V4cHIgeyRpICsgNn1dIGVuZF0KCX0KCXNob3dfZXJyb3Ige30gLiAiQmFkIGFyZ3VtZW50cyB0byBnaXRrOlxuJGVyciIKCWV4aXQgMQogICAgfQp9CgpzZXQgaGlzdG9yeSB7fQpzZXQgaGlzdG9yeWluZGV4IDAKc2V0IGZoX3NlcmlhbCAwCnNldCBuaGxfbmFtZXMge30Kc2V0IGhpZ2hsaWdodF9wYXRocyB7fQpzZXQgc2VhcmNoZGlybiAtZm9yd2FyZHMKc2V0IGJvbGRyb3dzIHt9CnNldCBib2xkbmFtZXJvd3Mge30KCnNldCBvcHRpbV9kZWxheSAxNgoKc2V0IG5leHR2aWV3bnVtIDEKc2V0IGN1cnZpZXcgMApzZXQgc2VsZWN0ZWR2aWV3IDAKc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKc2V0IHZpZXdmaWxlcygwKSB7fQpzZXQgdmlld3Blcm0oMCkgMApzZXQgdmlld2FyZ3MoMCkge30KCnNldCBjbWRsaW5lb2sgMApzZXQgc3RvcHBlZCAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cKd20gdGl0bGUgLiAiW2ZpbGUgdGFpbCAkYXJndjBdOiBbZmlsZSB0YWlsIFtwd2RdXSIKcmVhZHJlZnMKCmlmIHskY21kbGluZV9maWxlcyBuZSB7fSB8fCAkcmV2dHJlZWFyZ3MgbmUge319IHsKICAgICMgY3JlYXRlIGEgdmlldyBmb3IgdGhlIGZpbGVzL2RpcnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKICAgIHNldCBjdXJ2aWV3IDEKICAgIHNldCBzZWxlY3RlZHZpZXcgMQogICAgc2V0IG5leHR2aWV3bnVtIDIKICAgIHNldCB2aWV3bmFtZSgxKSAiQ29tbWFuZCBsaW5lIgogICAgc2V0IHZpZXdmaWxlcygxKSAkY21kbGluZV9maWxlcwogICAgc2V0IHZpZXdhcmdzKDEpICRyZXZ0cmVlYXJncwogICAgc2V0IHZpZXdwZXJtKDEpIDAKICAgIGFkZHZpZXdtZW51IDEKICAgIC5iYXIudmlldyBlbnRyeWNvbmYgRWRpdCogLXN0YXRlIG5vcm1hbAogICAgLmJhci52aWV3IGVudHJ5Y29uZiBEZWxldGUqIC1zdGF0ZSBub3JtYWwKfQoKaWYge1tpbmZvIGV4aXN0cyBwZXJtdmlld3NdfSB7CiAgICBmb3JlYWNoIHYgJHBlcm12aWV3cyB7CglzZXQgbiAkbmV4dHZpZXdudW0KCWluY3IgbmV4dHZpZXdudW0KCXNldCB2aWV3bmFtZSgkbikgW2xpbmRleCAkdiAwXQoJc2V0IHZpZXdmaWxlcygkbikgW2xpbmRleCAkdiAxXQoJc2V0IHZpZXdhcmdzKCRuKSBbbGluZGV4ICR2IDJdCglzZXQgdmlld3Blcm0oJG4pIDEKCWFkZHZpZXdtZW51ICRuCiAgICB9Cn0KZ2V0Y29tbWl0cwo=