IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuIFtleGVjIGdpdCByZXYtcGFyc2UgLS1naXQtZGlyXQogICAgfQp9Cgpwcm9jIHN0YXJ0X3Jldl9saXN0IHt2aWV3fSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlCiAgICBnbG9iYWwgY29tbWZkIGxlZnRvdmVyIHRjbGVuY29kaW5nIGRhdGVtb2RlCiAgICBnbG9iYWwgdmlld2FyZ3Mgdmlld2ZpbGVzIGNvbW1pdGlkeAoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgY29tbWl0aWR4KCR2aWV3KSAwCiAgICBzZXQgYXJncyAkdmlld2FyZ3MoJHZpZXcpCiAgICBpZiB7JHZpZXdmaWxlcygkdmlldykgbmUge319IHsKCXNldCBhcmdzIFtjb25jYXQgJGFyZ3MgIi0tIiAkdmlld2ZpbGVzKCR2aWV3KV0KICAgIH0KICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0taGVhZGVyICRvcmRlciBcCgkJCSAgLS1wYXJlbnRzIC0tYm91bmRhcnkgLS1kZWZhdWx0IEhFQUQgJGFyZ3NdIHJdCiAgICB9IGVycl19IHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0IHJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgY29tbWZkKCR2aWV3KSAkZmQKICAgIHNldCBsZWZ0b3Zlcigkdmlldykge30KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZgogICAgaWYgeyR0Y2xlbmNvZGluZyAhPSB7fX0gewoJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nICR0Y2xlbmNvZGluZwogICAgfQogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZpZXddCiAgICBub3didXN5ICR2aWV3Cn0KCnByb2Mgc3RvcF9yZXZfbGlzdCB7fSB7CiAgICBnbG9iYWwgY29tbWZkIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21tZmQoJGN1cnZpZXcpXX0gcmV0dXJuCiAgICBzZXQgZmQgJGNvbW1mZCgkY3VydmlldykKICAgIGNhdGNoIHsKCXNldCBwaWQgW3BpZCAkZmRdCglleGVjIGtpbGwgJHBpZAogICAgfQogICAgY2F0Y2gge2Nsb3NlICRmZH0KICAgIHVuc2V0IGNvbW1mZCgkY3VydmlldykKfQoKcHJvYyBnZXRjb21taXRzIHt9IHsKICAgIGdsb2JhbCBwaGFzZSBjYW52IG1haW5mb250IGN1cnZpZXcKCiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgaW5pdGxheW91dAogICAgc3RhcnRfcmV2X2xpc3QgJGN1cnZpZXcKICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2ZkIHZpZXd9ICB7CiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIG5leHR1cGRhdGUKICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldyBobHZpZXcKICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCWdsb2JhbCB2aWV3bmFtZQoJdW5zZXQgY29tbWZkKCR2aWV3KQoJbm90YnVzeSAkdmlldwoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgc2V0IGZ2IHt9CgkgICAgaWYgeyR2aWV3ICE9ICRjdXJ2aWV3fSB7CgkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgoJICAgIH0KCSAgICBpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCgkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKCQlpZiB7JHZpZXduYW1lKCR2aWV3KSBlcSAiQ29tbWFuZCBsaW5lIn0gewoJCSAgICBhcHBlbmQgZXJyIFwKCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAoJCQkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OiAkZXJyIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAkZXJyCgl9CglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIGJyZWFrCgl9CglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAkbGVmdG92ZXIoJHZpZXcpCgkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCgkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCXNldCBsaXN0ZWQgMQoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGlkcyAwIDBdID09ICItIn0gewoJCXNldCBsaXN0ZWQgMAoJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQoJICAgIH0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYge1tzdHJpbmcgbGVuZ3RoICRpZF0gIT0gNDB9IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglpZiB7JGxpc3RlZH0gewoJICAgIHNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCSAgICBzZXQgaSAwCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlpZiB7JGkgPT0gMCB8fCBbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdID49ICRpfSB7CgkJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHZpZXcsJHApICRpZAoJCX0KCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBvbGRzIHt9Cgl9CglpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkdmlldywkaWQpXX0gewoJICAgIHNldCBjaGlsZHJlbigkdmlldywkaWQpIHt9Cgl9CglzZXQgY29tbWl0ZGF0YSgkaWQpIFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCXNldCBjb21taXRyb3coJHZpZXcsJGlkKSAkY29tbWl0aWR4KCR2aWV3KQoJaW5jciBjb21taXRpZHgoJHZpZXcpCglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBsYXBwZW5kIHBhcmVudGxpc3QgJG9sZHMKCSAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJHZpZXcsJGlkKQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCB2cGFyZW50bGlzdCgkdmlldykgJG9sZHMKCSAgICBsYXBwZW5kIHZjaGlsZGxpc3QoJHZpZXcpICRjaGlsZHJlbigkdmlldywkaWQpCgkgICAgbGFwcGVuZCB2ZGlzcG9yZGVyKCR2aWV3KSAkaWQKCSAgICBsYXBwZW5kIHZjbWl0bGlzdGVkKCR2aWV3KSAkbGlzdGVkCgl9CglzZXQgZ290c29tZSAxCiAgICB9CiAgICBpZiB7JGdvdHNvbWV9IHsKCWlmIHskdmlldyA9PSAkY3Vydmlld30gewoJICAgIHdoaWxlIHtbbGF5b3V0bW9yZSAkbmV4dHVwZGF0ZV19IGRvdXBkYXRlCgl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJHZpZXcgPT0gJGhsdmlld30gewoJICAgIHZoaWdobGlnaHRtb3JlCgl9CiAgICB9CiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJZG91cGRhdGUKICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7fSB7CiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cwoKICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CglmaWxlZXZlbnQgJGNvbW1mZCgkdikgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgZm9yZWFjaCB2IFthcnJheSBuYW1lcyBjb21tZmRdIHsKCXNldCBmZCAkY29tbWZkKCR2KQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZdCiAgICB9Cn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIHtbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQgY2F0LWZpbGUgY29tbWl0ICRpZF19XX0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKfQoKcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKICAgIGdsb2JhbCB2aWV3ZGF0YSBjdXJ2aWV3IHBoYXNlIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgdGhpY2tlcmxpbmUKCiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglzdG9wX3Jldl9saXN0CglzZXQgcGhhc2Uge30KICAgIH0KICAgIHNldCBuICRjdXJ2aWV3CiAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgewoJY2F0Y2gge3Vuc2V0IGNoaWxkcmVuKCRuLCRpZCl9CgljYXRjaCB7dW5zZXQgY29tbWl0cm93KCRuLCRpZCl9CiAgICB9CiAgICBzZXQgY3VydmlldyAtMQogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCB0aGlja2VybGluZX0KICAgIGNhdGNoIHt1bnNldCB2aWV3ZGF0YSgkbil9CiAgICBkaXNjYXJkYWxsY29tbWl0cwogICAgcmVhZHJlZnMKICAgIHNob3d2aWV3ICRuCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2RhdGUKCiAgICBzZXQgaW5oZHIgMQogICAgc2V0IGNvbW1lbnQge30KICAgIHNldCBoZWFkbGluZSB7fQogICAgc2V0IGF1bmFtZSB7fQogICAgc2V0IGF1ZGF0ZSB7fQogICAgc2V0IGNvbW5hbWUge30KICAgIHNldCBjb21kYXRlIHt9CiAgICBzZXQgaGRyZW5kIFtzdHJpbmcgZmlyc3QgIlxuXG4iICRjb250ZW50c10KICAgIGlmIHskaGRyZW5kIDwgMH0gewoJIyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCglzZXQgaGRyZW5kIFtzdHJpbmcgbGVuZ3RoICRjb250ZW50c10KICAgIH0KICAgIHNldCBoZWFkZXIgW3N0cmluZyByYW5nZSAkY29udGVudHMgMCBbZXhwciB7JGhkcmVuZCAtIDF9XV0KICAgIHNldCBjb21tZW50IFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIFtleHByIHskaGRyZW5kICsgMn1dIGVuZF0KICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CglzZXQgdGFnIFtsaW5kZXggJGxpbmUgMF0KCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBhdW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBjb21uYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0KICAgIH0KICAgIHNldCBoZWFkbGluZSB7fQogICAgIyB0YWtlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tZW50IGFzIHRoZSBoZWFkbGluZQogICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRjb21tZW50XQogICAgaWYgeyRpID49IDB9IHsKCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gW3N0cmluZyByYW5nZSAkY29tbWVudCAwICRpXV0KICAgIH0gZWxzZSB7CglzZXQgaGVhZGxpbmUgJGNvbW1lbnQKICAgIH0KICAgIGlmIHshJGxpc3RlZH0gewoJIyBnaXQgcmV2LWxpc3QgaW5kZW50cyB0aGUgY29tbWVudCBieSA0IHNwYWNlczsKCSMgaWYgd2UgZ290IHRoaXMgdmlhIGdpdCBjYXQtZmlsZSwgYWRkIHRoZSBpbmRlbnRhdGlvbgoJc2V0IG5ld2NvbW1lbnQge30KCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNvbW1lbnQgIlxuIl0gewoJICAgIGFwcGVuZCBuZXdjb21tZW50ICIgICAgIgoJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIlxuIgoJfQoJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKICAgIH0KICAgIGlmIHskY29tZGF0ZSAhPSB7fX0gewoJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKICAgIH0KICAgIHNldCBjb21taXRpbmZvKCRpZCkgW2xpc3QgJGhlYWRsaW5lICRhdW5hbWUgJGF1ZGF0ZSBcCgkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCn0KCnByb2MgZ2V0Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdGRhdGEgY29tbWl0aW5mbwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0gewoJcGFyc2Vjb21taXQgJGlkICRjb21taXRkYXRhKCRpZCkgMQogICAgfSBlbHNlIHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcyBtYWluaGVhZAoKICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0IGxzLXJlbW90ZSBbZ2l0ZGlyXV0gcl0KICAgIHdoaWxlIHswIDw9IFtzZXQgbiBbZ2V0cyAkcmVmZCBsaW5lXV19IHsKCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pCXJlZnMvKFteXl0qKSR9ICRsaW5lIFwKCSAgICBtYXRjaCBpZCBwYXRoXX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7W3JlZ2V4cCB7XnJlbW90ZXMvLiovSEVBRCR9ICRwYXRoIG1hdGNoXX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7IVtyZWdleHAge14odGFnc3xoZWFkcykvKC4qKSR9ICRwYXRoIG1hdGNoIHR5cGUgbmFtZV19IHsKCSAgICBzZXQgdHlwZSBvdGhlcnMKCSAgICBzZXQgbmFtZSAkcGF0aAoJfQoJaWYge1tyZWdleHAge15yZW1vdGVzL30gJHBhdGggbWF0Y2hdfSB7CgkgICAgc2V0IHR5cGUgaGVhZHMKCX0KCWlmIHskdHlwZSA9PSAidGFncyJ9IHsKCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkdGFncygkaWQpICRuYW1lCgkgICAgc2V0IG9iaiB7fQoJICAgIHNldCB0eXBlIHt9CgkgICAgc2V0IHRhZyB7fQoJICAgIGNhdGNoIHsKCQlzZXQgY29tbWl0IFtleGVjIGdpdCByZXYtcGFyc2UgIiRpZF4wIl0KCQlpZiB7JGNvbW1pdCAhPSAkaWR9IHsKCQkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGNvbW1pdAoJCSAgICBsYXBwZW5kIGlkdGFncygkY29tbWl0KSAkbmFtZQoJCX0KCSAgICB9CQkKCSAgICBjYXRjaCB7CgkgICAgICAgIHNldCB0YWdjb250ZW50cygkbmFtZSkgW2V4ZWMgZ2l0IGNhdC1maWxlIHRhZyAkaWRdCgkgICAgfQoJfSBlbHNlaWYgeyAkdHlwZSA9PSAiaGVhZHMiIH0gewoJICAgIHNldCBoZWFkaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkaGVhZHMoJGlkKSAkbmFtZQoJfSBlbHNlIHsKCSAgICBzZXQgb3RoZXJyZWZpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRvdGhlcnJlZnMoJGlkKSAkbmFtZQoJfQogICAgfQogICAgY2xvc2UgJHJlZmQKICAgIHNldCBtYWluaGVhZCB7fQogICAgY2F0Y2ggewoJc2V0IHRoZWhlYWQgW2V4ZWMgZ2l0IHN5bWJvbGljLXJlZiBIRUFEXQoJaWYge1tzdHJpbmcgbWF0Y2ggInJlZnMvaGVhZHMvKiIgJHRoZWhlYWRdfSB7CgkgICAgc2V0IG1haW5oZWFkIFtzdHJpbmcgcmFuZ2UgJHRoZWhlYWQgMTEgZW5kXQoJfQogICAgfQp9Cgpwcm9jIHNob3dfZXJyb3Ige3cgdG9wIG1zZ30gewogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdG9wIgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgYmluZCAkdG9wIDxWaXNpYmlsaXR5PiAiZ3JhYiAkdG9wOyBmb2N1cyAkdG9wIgogICAgYmluZCAkdG9wIDxLZXktUmV0dXJuPiAiZGVzdHJveSAkdG9wIgogICAgdGt3YWl0IHdpbmRvdyAkdG9wCn0KCnByb2MgZXJyb3JfcG9wdXAgbXNnIHsKICAgIHNldCB3IC5lcnJvcgogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRyYW5zaWVudCAkdyAuCiAgICBzaG93X2Vycm9yICR3ICR3ICRtc2cKfQoKcHJvYyBjb25maXJtX3BvcHVwIG1zZyB7CiAgICBnbG9iYWwgY29uZmlybV9vawogICAgc2V0IGNvbmZpcm1fb2sgMAogICAgc2V0IHcgLmNvbmZpcm0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAic2V0IGNvbmZpcm1fb2sgMTsgZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgbGVmdCAtZmlsbCB4CiAgICBidXR0b24gJHcuY2FuY2VsIC10ZXh0IENhbmNlbCAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcuY2FuY2VsIC1zaWRlIHJpZ2h0IC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKICAgIHJldHVybiAkY29uZmlybV9vawp9Cgpwcm9jIG1ha2V3aW5kb3cge30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbGluZXNwYyBjaGFyc3BjIGN0ZXh0IGNmbGlzdAogICAgZ2xvYmFsIHRleHRmb250IG1haW5mb250IHVpZm9udAogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmR0eXBlbWVudSBmaW5kbG9jIGZpbmRzdHJpbmcgZnN0cmluZyBnZW9tZXRyeQogICAgZ2xvYmFsIGVudHJpZXMgc2hhMWVudHJ5IHNoYTFzdHJpbmcgc2hhMWJ1dAogICAgZ2xvYmFsIG1haW5jdXJzb3IgdGV4dGN1cnNvciBjdXJ0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgcm93Y3R4bWVudSBtZXJnZW1heCB3cmFwY29tbWVudAogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBnZHR0eXBlCiAgICBnbG9iYWwgc2VhcmNoc3RyaW5nIHNzdHJpbmcKICAgIGdsb2JhbCBiZ2NvbG9yIGZnY29sb3IgYmdsaXN0IGZnbGlzdCBkaWZmY29sb3JzCiAgICBnbG9iYWwgaGVhZGN0eG1lbnUKCiAgICBtZW51IC5iYXIKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJGaWxlIiAtbWVudSAuYmFyLmZpbGUKICAgIC5iYXIgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIG1lbnUgLmJhci5maWxlCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJVcGRhdGUiIC1jb21tYW5kIHVwZGF0ZWNvbW1pdHMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlcmVhZCByZWZlcmVuY2VzIiAtY29tbWFuZCByZXJlYWRyZWZzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIC5iYXIuZmlsZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgbWVudSAuYmFyLmVkaXQKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJFZGl0IiAtbWVudSAuYmFyLmVkaXQKICAgIC5iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIlByZWZlcmVuY2VzIiAtY29tbWFuZCBkb3ByZWZzCiAgICAuYmFyLmVkaXQgY29uZmlndXJlIC1mb250ICR1aWZvbnQKCiAgICBtZW51IC5iYXIudmlldyAtZm9udCAkdWlmb250CiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiVmlldyIgLW1lbnUgLmJhci52aWV3CiAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJOZXcgdmlldy4uLiIgLWNvbW1hbmQge25ld3ZpZXcgMH0KICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkVkaXQgdmlldy4uLiIgLWNvbW1hbmQgZWRpdHZpZXcgXAoJLXN0YXRlIGRpc2FibGVkCiAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJEZWxldGUgdmlldyIgLWNvbW1hbmQgZGVsdmlldyAtc3RhdGUgZGlzYWJsZWQKICAgIC5iYXIudmlldyBhZGQgc2VwYXJhdG9yCiAgICAuYmFyLnZpZXcgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAiQWxsIGZpbGVzIiAtY29tbWFuZCB7c2hvd3ZpZXcgMH0gXAoJLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgMAogICAgCiAgICBtZW51IC5iYXIuaGVscAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkhlbHAiIC1tZW51IC5iYXIuaGVscAogICAgLmJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgZ2l0ayIgLWNvbW1hbmQgYWJvdXQKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIktleSBiaW5kaW5ncyIgLWNvbW1hbmQga2V5cwogICAgLmJhci5oZWxwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7NDUgKiAkY2hhcnNwY31dCglzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHszMCAqICRjaGFyc3BjfV0KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezE1ICogJGNoYXJzcGN9XQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7MjUgKiAkbGluZXNwYyArIDR9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0dykgODAKCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCglzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgMzAKICAgIH0KICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkod2lkdGgpXX0gewoJLmN0b3AgY29uZiAtd2lkdGggJGdlb21ldHJ5KHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShoZWlnaHQpCglzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KCXNldCBnZW9tZXRyeShjdGV4dGgpIFtleHByIHsoJHRleHRoIC0gOCkgLwoJCQkJICAgIFtmb250IG1ldHJpY3MgJHRleHRmb250IC1saW5lc3BhY2VdfV0KICAgIH0KICAgIGZyYW1lIC5jdG9wLnRvcAogICAgZnJhbWUgLmN0b3AudG9wLmJhcgogICAgZnJhbWUgLmN0b3AudG9wLmxiYXIKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1iZCAwIFwKCS15c2Nyb2xsaW5jciAkbGluZXNwYyAteXNjcm9sbGNvbW1hbmQgInNjcm9sbGNhbnYgJGNzY3JvbGwiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYyCiAgICBzZXQgY2FudjMgLmN0b3AudG9wLmNsaXN0LmNhbnYzCiAgICBjYW52YXMgJGNhbnYzIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYzCiAgICBiaW5kIC5jdG9wLnRvcC5jbGlzdCA8Q29uZmlndXJlPiB7cmVzaXplY2xpc3RwYW5lcyAlVyAld30KICAgIGxhcHBlbmQgYmdsaXN0ICRjYW52ICRjYW52MiAkY2FudjMKCiAgICBzZXQgc2hhMWVudHJ5IC5jdG9wLnRvcC5iYXIuc2hhMQogICAgc2V0IGVudHJpZXMgJHNoYTFlbnRyeQogICAgc2V0IHNoYTFidXQgLmN0b3AudG9wLmJhci5zaGExbGFiZWwKICAgIGJ1dHRvbiAkc2hhMWJ1dCAtdGV4dCAiU0hBMSBJRDogIiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IFwKCS1jb21tYW5kIGdvdG9jb21taXQgLXdpZHRoIDggLWZvbnQgJHVpZm9udAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kYnV0IC1zaWRlIGxlZnQKICAgIHNldCBmaW5kc3RyaW5nIHt9CiAgICBzZXQgZnN0cmluZyAuY3RvcC50b3AuYmFyLmZpbmRzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkZnN0cmluZwogICAgZW50cnkgJGZzdHJpbmcgLXdpZHRoIDMwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIGZpbmRzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kc3RyaW5nIHdyaXRlIGZpbmRfY2hhbmdlCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kdHlwZSB3cml0ZSBmaW5kX2NoYW5nZQogICAgLmN0b3AudG9wLmJhci5maW5kdHlwZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLmN0b3AudG9wLmJhci5maW5kdHlwZS5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBzZXQgZmluZGxvYyAiQWxsIGZpZWxkcyIKICAgIHRrX29wdGlvbk1lbnUgLmN0b3AudG9wLmJhci5maW5kbG9jIGZpbmRsb2MgIkFsbCBmaWVsZHMiIEhlYWRsaW5lIFwKCUNvbW1lbnRzIEF1dGhvciBDb21taXR0ZXIKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRfY2hhbmdlCiAgICAuY3RvcC50b3AuYmFyLmZpbmRsb2MgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5iYXIuZmluZGxvYy5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CgogICAgbGFiZWwgLmN0b3AudG9wLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAoJLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC50b3AubGJhci5mbGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgogICAgc2V0IGdtIFt0a19vcHRpb25NZW51IC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IiBcCgkJImFkZGluZy9yZW1vdmluZyBzdHJpbmc6Il0KICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBnZHR0eXBlIHdyaXRlIGhmaWxlc19jaGFuZ2UKICAgICRnbSBjb25mIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgY29uZiAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBlbnRyeSAuY3RvcC50b3AubGJhci5mZW50IC13aWR0aCAyNSAtZm9udCAkdGV4dGZvbnQgXAoJLXRleHR2YXJpYWJsZSBoaWdobGlnaHRfZmlsZXMKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBoaWdobGlnaHRfZmlsZXMgd3JpdGUgaGZpbGVzX2NoYW5nZQogICAgbGFwcGVuZCBlbnRyaWVzIC5jdG9wLnRvcC5sYmFyLmZlbnQKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIuZmVudCAtc2lkZSBsZWZ0IC1maWxsIHggLWV4cGFuZCAxCiAgICBsYWJlbCAuY3RvcC50b3AubGJhci52bGFiZWwgLXRleHQgIiBPUiBpbiB2aWV3IiAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLnZsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGdsb2JhbCB2aWV3aGxtZW51IHNlbGVjdGVkaGx2aWV3CiAgICBzZXQgdmlld2hsbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci52aGwgc2VsZWN0ZWRobHZpZXcgTm9uZV0KICAgICR2aWV3aGxtZW51IGVudHJ5Y29uZiBOb25lIC1jb21tYW5kIGRlbHZoaWdobGlnaHQKICAgICR2aWV3aGxtZW51IGNvbmYgLWZvbnQgJHVpZm9udAogICAgLmN0b3AudG9wLmxiYXIudmhsIGNvbmYgLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC50b3AubGJhci52aGwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBsYWJlbCAuY3RvcC50b3AubGJhci5ybGFiZWwgLXRleHQgIiBPUiAiIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIucmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkCiAgICBzZXQgbSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci5yZWxtIGhpZ2hsaWdodF9yZWxhdGVkIE5vbmUgXAoJICAgICAgICJEZXNjZW5kZW50IiAiTm90IGRlc2NlbmRlbnQiICJBbmNlc3RvciIgIk5vdCBhbmNlc3RvciJdCiAgICAkbSBjb25mIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5sYmFyLnJlbG0gY29uZiAtZm9udCAkdWlmb250CiAgICB0cmFjZSBhZGQgdmFyaWFibGUgaGlnaGxpZ2h0X3JlbGF0ZWQgd3JpdGUgdnJlbF9jaGFuZ2UKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIucmVsbSAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0LmJvdAogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuYm90IC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBidXR0b24gLmN0b3AuY2RldC5sZWZ0LmJvdC5zZWFyY2ggLXRleHQgIlNlYXJjaCIgLWNvbW1hbmQgZG9zZWFyY2ggXAoJLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuYm90LnNlYXJjaCAtc2lkZSBsZWZ0IC1wYWR4IDUKICAgIHNldCBzc3RyaW5nIC5jdG9wLmNkZXQubGVmdC5ib3Quc3N0cmluZwogICAgZW50cnkgJHNzdHJpbmcgLXdpZHRoIDIwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNlYXJjaHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRzc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2VhcmNoc3RyaW5nIHdyaXRlIGluY3JzZWFyY2gKICAgIHBhY2sgJHNzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJhY2tncm91bmQgJGJnY29sb3IgLWZvcmVncm91bmQgJGZnY29sb3IgXAoJLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgktd2lkdGggJGdlb21ldHJ5KGN0ZXh0dykgLWhlaWdodCAkZ2VvbWV0cnkoY3RleHRoKSBcCgkteXNjcm9sbGNvbW1hbmQgc2Nyb2xsdGV4dCAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKICAgIGxhcHBlbmQgYmdsaXN0ICRjdGV4dAogICAgbGFwcGVuZCBmZ2xpc3QgJGN0ZXh0CgogICAgJGN0ZXh0IHRhZyBjb25mIGNvbW1lbnQgLXdyYXAgJHdyYXBjb21tZW50CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMl0KICAgICRjdGV4dCB0YWcgY29uZiBkMCAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDBdCiAgICAkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAxXQogICAgJGN0ZXh0IHRhZyBjb25mIG0wIC1mb3JlIHJlZAogICAgJGN0ZXh0IHRhZyBjb25mIG0xIC1mb3JlIGJsdWUKICAgICRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgogICAgJGN0ZXh0IHRhZyBjb25mIG0zIC1mb3JlIHB1cnBsZQogICAgJGN0ZXh0IHRhZyBjb25mIG00IC1mb3JlIGJyb3duCiAgICAkY3RleHQgdGFnIGNvbmYgbTUgLWZvcmUgIiMwMDkwOTAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTYgLWZvcmUgbWFnZW50YQogICAgJGN0ZXh0IHRhZyBjb25mIG03IC1mb3JlICIjODA4MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG04IC1mb3JlICIjMDA5MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG05IC1mb3JlICIjZmYwMDgwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMCAtZm9yZSBjeWFuCiAgICAkY3RleHQgdGFnIGNvbmYgbTExIC1mb3JlICIjYjA3MDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMiAtZm9yZSAiIzcwYjBmMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTMgLWZvcmUgIiM3MGYwYjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTE0IC1mb3JlICIjZjBiMDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xNSAtZm9yZSAiI2ZmNzBiMCIKICAgICRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CiAgICBzZXQgbWVyZ2VtYXggMTYKICAgICRjdGV4dCB0YWcgY29uZiBtcmVzdWx0IC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgbXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdwoKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmN0b3AuY2RldC5yaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgcmFkaW9idXR0b24gLmN0b3AuY2RldC5yaWdodC5tb2RlLnRyZWUgLXRleHQgIlRyZWUiIFwKCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJ0cmVlIgogICAgZ3JpZCAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUucGF0Y2ggLmN0b3AuY2RldC5yaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmN0b3AuY2RldC5yaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1mb3JlZ3JvdW5kICRmZ2NvbG9yIFwKCS1mb250ICRtYWluZm9udCBcCgktdGFicyBbbGlzdCAkaW5kZW50IFtleHByIHsyICogJGluZGVudH1dXSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQucmlnaHQuc2Igc2V0IiBcCgktY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0gXAoJLXNwYWNpbmcxIDEgLXNwYWNpbmczIDEKICAgIGxhcHBlbmQgYmdsaXN0ICRjZmxpc3QKICAgIGxhcHBlbmQgZmdsaXN0ICRjZmxpc3QKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1jb21tYW5kICIkY2ZsaXN0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGNmbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAkY2ZsaXN0IHRhZyBjb25maWd1cmUgaGlnaGxpZ2h0IFwKCS1iYWNrZ3JvdW5kIFskY2ZsaXN0IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdCiAgICAkY2ZsaXN0IHRhZyBjb25maWd1cmUgYm9sZCAtZm9udCBbY29uY2F0ICRtYWluZm9udCBib2xkXQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJjYW52c2NhbiBtYXJrICVXICV4ICV5IgogICAgYmluZGFsbCA8QjItTW90aW9uPiAiY2FudnNjYW4gZHJhZ3RvICVXICV4ICV5IgogICAgYmluZGtleSA8SG9tZT4gc2VsZmlyc3RsaW5lCiAgICBiaW5ka2V5IDxFbmQ+IHNlbGxhc3RsaW5lCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPFNoaWZ0LUtleS1VcD4gIm5leHRfaGlnaGxpZ2h0IC0xIgogICAgYmluZCAuIDxTaGlmdC1LZXktRG93bj4gIm5leHRfaGlnaGxpZ2h0IDEiCiAgICBiaW5ka2V5IDxLZXktUmlnaHQ+ICJnb2ZvcnciCiAgICBiaW5ka2V5IDxLZXktTGVmdD4gImdvYmFjayIKICAgIGJpbmQgLiA8S2V5LVByaW9yPiAic2VsbmV4dHBhZ2UgLTEiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAic2VsbmV4dHBhZ2UgMSIKICAgIGJpbmQgLiA8Q29udHJvbC1Ib21lPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDAuMCIKICAgIGJpbmQgLiA8Q29udHJvbC1FbmQ+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMS4wIgogICAgYmluZCAuIDxDb250cm9sLUtleS1VcD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSB1bml0cyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktRG93bj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHVuaXRzIgogICAgYmluZCAuIDxDb250cm9sLUtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktTmV4dD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LURlbGV0ZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1zcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgcCAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IHogImdvYmFjayIKICAgIGJpbmRrZXkgeCAiZ29mb3J3IgogICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgayAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgaiAiZ29iYWNrIgogICAgYmluZGtleSBsICJnb2ZvcnciCiAgICBiaW5ka2V5IGIgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IGQgIiRjdGV4dCB5dmlldyBzY3JvbGwgMTggdW5pdHMiCiAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgogICAgYmluZGtleSAvIHtmaW5kbmV4dCAxfQogICAgYmluZGtleSA8S2V5LVJldHVybj4ge2ZpbmRuZXh0IDB9CiAgICBiaW5ka2V5ID8gZmluZHByZXYKICAgIGJpbmRrZXkgZiBuZXh0ZmlsZQogICAgYmluZCAuIDxDb250cm9sLXE+IGRvcXVpdAogICAgYmluZCAuIDxDb250cm9sLWY+IGRvZmluZAogICAgYmluZCAuIDxDb250cm9sLWc+IHtmaW5kbmV4dCAwfQogICAgYmluZCAuIDxDb250cm9sLXI+IGRvc2VhcmNoYmFjawogICAgYmluZCAuIDxDb250cm9sLXM+IGRvc2VhcmNoCiAgICBiaW5kIC4gPENvbnRyb2wtZXF1YWw+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLUtQX0FkZD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtbWludXM+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9TdWJ0cmFjdD4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCiAgICBiaW5kICRjZmxpc3QgPDE+IHtzZWxfZmxpc3QgJVcgJXggJXk7IGJyZWFrfQogICAgYmluZCAkY2ZsaXN0IDxCMS1Nb3Rpb24+IHtzZWxfZmxpc3QgJVcgJXggJXk7IGJyZWFrfQogICAgYmluZCAkY2ZsaXN0IDxCdXR0b25SZWxlYXNlLTE+IHt0cmVlY2xpY2sgJVcgJXggJXl9CgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgY3VydGV4dGN1cnNvciAkdGV4dGN1cnNvcgoKICAgIHNldCByb3djdHhtZW51IC5yb3djdHhtZW51CiAgICBtZW51ICRyb3djdHhtZW51IC10ZWFyb2ZmIDAKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiB0aGlzIC0+IHNlbGVjdGVkIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDB9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAxfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSB0YWciIC1jb21tYW5kIG1rdGFnCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIldyaXRlIGNvbW1pdCB0byBmaWxlIiAtY29tbWFuZCB3cml0ZWNvbW1pdAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgbmV3IGJyYW5jaCIgLWNvbW1hbmQgbWticmFuY2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ2hlcnJ5LXBpY2sgdGhpcyBjb21taXQiIFwKCS1jb21tYW5kIGNoZXJyeXBpY2sKCiAgICBzZXQgaGVhZGN0eG1lbnUgLmhlYWRjdHhtZW51CiAgICBtZW51ICRoZWFkY3R4bWVudSAtdGVhcm9mZiAwCiAgICAkaGVhZGN0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDaGVjayBvdXQgdGhpcyBicmFuY2giIFwKCS1jb21tYW5kIGNvYnJhbmNoCiAgICAkaGVhZGN0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZW1vdmUgdGhpcyBicmFuY2giIFwKCS1jb21tYW5kIHJtYnJhbmNoCn0KCiMgbW91c2UtMiBtYWtlcyBhbGwgd2luZG93cyBzY2FuIHZlcnRpY2FsbHksIGJ1dCBvbmx5IHRoZSBvbmUKIyB0aGUgY3Vyc29yIGlzIGluIHNjYW5zIGhvcml6b250YWxseQpwcm9jIGNhbnZzY2FuIHtvcCB3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGZvcmVhY2ggYyBbbGlzdCAkY2FudiAkY2FudjIgJGNhbnYzXSB7CglpZiB7JGMgPT0gJHd9IHsKCSAgICAkYyBzY2FuICRvcCAkeCAkeQoJfSBlbHNlIHsKCSAgICAkYyBzY2FuICRvcCAwICR5Cgl9CiAgICB9Cn0KCnByb2Mgc2Nyb2xsY2FudiB7Y3Njcm9sbCBmMCBmMX0gewogICAgJGNzY3JvbGwgc2V0ICRmMCAkZjEKICAgIGRyYXdmcmFjICRmMCAkZjEKICAgIGZsdXNoaGlnaGxpZ2h0cwp9CgojIHdoZW4gd2UgbWFrZSBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9wbGV2ZWwsIG1ha2Ugc3VyZQojIGl0IGRvZXNuJ3QgZ2V0IHRyaWdnZXJlZCB3aGVuIHRoYXQga2V5IGlzIHByZXNzZWQgaW4gdGhlCiMgZmluZCBzdHJpbmcgZW50cnkgd2lkZ2V0Lgpwcm9jIGJpbmRrZXkge2V2IHNjcmlwdH0gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGJpbmQgLiAkZXYgJHNjcmlwdAogICAgc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgJGV2XQogICAgaWYgeyRlc2NyaXB0ID09IHt9fSB7CglzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSA8S2V5Pl0KICAgIH0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgliaW5kICRlICRldiAiJGVzY3JpcHQ7IGJyZWFrIgogICAgfQp9CgojIHNldCB0aGUgZm9jdXMgYmFjayB0byB0aGUgdG9wbGV2ZWwgZm9yIGFueSBjbGljayBvdXRzaWRlCiMgdGhlIGVudHJ5IHdpZGdldHMKcHJvYyBjbGljayB7d30gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CglpZiB7JHcgPT0gJGV9IHJldHVybgogICAgfQogICAgZm9jdXMgLgp9Cgpwcm9jIHNhdmVzdHVmZiB7d30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250IHVpZm9udAogICAgZ2xvYmFsIHN0dWZmc2F2ZWQgZmluZG1lcmdlZmlsZXMgbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBtYXh3aWR0aCBzaG93bmVhcnRhZ3MKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3ZmlsZXMgdmlld2FyZ3Mgdmlld3Blcm0gbmV4dHZpZXdudW0KICAgIGdsb2JhbCBjbWl0bW9kZSB3cmFwY29tbWVudAogICAgZ2xvYmFsIGNvbG9ycyBiZ2NvbG9yIGZnY29sb3IgZGlmZmNvbG9ycwoKICAgIGlmIHskc3R1ZmZzYXZlZH0gcmV0dXJuCiAgICBpZiB7IVt3aW5mbyB2aWV3YWJsZSAuXX0gcmV0dXJuCiAgICBjYXRjaCB7CglzZXQgZiBbb3BlbiAifi8uZ2l0ay1uZXciIHddCglwdXRzICRmIFtsaXN0IHNldCBtYWluZm9udCAkbWFpbmZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB0ZXh0Zm9udCAkdGV4dGZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB1aWZvbnQgJHVpZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heGdyYXBocGN0ICRtYXhncmFwaHBjdF0KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGNtaXRtb2RlICRjbWl0bW9kZV0KCXB1dHMgJGYgW2xpc3Qgc2V0IHdyYXBjb21tZW50ICR3cmFwY29tbWVudF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHNob3duZWFydGFncyAkc2hvd25lYXJ0YWdzXQoJcHV0cyAkZiBbbGlzdCBzZXQgYmdjb2xvciAkYmdjb2xvcl0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZnY29sb3IgJGZnY29sb3JdCglwdXRzICRmIFtsaXN0IHNldCBjb2xvcnMgJGNvbG9yc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGRpZmZjb2xvcnMgJGRpZmZjb2xvcnNdCglwdXRzICRmICJzZXQgZ2VvbWV0cnkod2lkdGgpIFt3aW5mbyB3aWR0aCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoaGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIge1t3aW5mbyB3aWR0aCAkY2Fudl0tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52Ml0tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52M10tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7W3dpbmZvIGhlaWdodCAkY2Fudl0tMn1dIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY3RleHRdIC0gOCkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgJHRleHRmb250ICIwIl19XQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGN0ZXh0dykgJHdpZCIKCXNldCB3aWQgW2V4cHIgeyhbd2luZm8gd2lkdGggJGNmbGlzdF0gLSAxMSkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgWyRjZmxpc3QgY2dldCAtZm9udF0gIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgJHdpZCIKCXB1dHMgLW5vbmV3bGluZSAkZiAic2V0IHBlcm12aWV3cyB7IgoJZm9yIHtzZXQgdiAwfSB7JHYgPCAkbmV4dHZpZXdudW19IHtpbmNyIHZ9IHsKCSAgICBpZiB7JHZpZXdwZXJtKCR2KX0gewoJCXB1dHMgJGYgIntbbGlzdCAkdmlld25hbWUoJHYpICR2aWV3ZmlsZXMoJHYpICR2aWV3YXJncygkdildfSIKCSAgICB9Cgl9CglwdXRzICRmICJ9IgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJc2V0IHMxIFskd2luIHNhc2ggY29vcmQgMV0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkdyo1LzYgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczEgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKCQlzZXQgc2FzaDAgMzAKCSAgICB9CgkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskc2FzaDAgKyAyMH1dCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskdyAtIDEwfV0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCgkJfQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQoJJHdpbiBzYXNoIHBsYWNlIDEgJHNhc2gxIFtsaW5kZXggJHMxIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyByZXNpemVjZGV0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgeyR3IC0gMTV9XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgLSBhIGNvbW1pdCB2aWV3ZXIgZm9yIGdpdAoKQ29weXJpZ2h0IKkgMjAwNS0yMDA2IFBhdWwgTWFja2VycmFzCgpVc2UgYW5kIHJlZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlfSBcCgkgICAgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCnByb2Mga2V5cyB7fSB7CiAgICBzZXQgdyAua2V5cwogICAgaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CglyYWlzZSAkdwoJcmV0dXJuCiAgICB9CiAgICB0b3BsZXZlbCAkdwogICAgd20gdGl0bGUgJHcgIkdpdGsga2V5IGJpbmRpbmdzIgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKR2l0ayBrZXkgYmluZGluZ3M6Cgo8Q3RybC1RPgkJUXVpdAo8SG9tZT4JCU1vdmUgdG8gZmlyc3QgY29tbWl0CjxFbmQ+CQlNb3ZlIHRvIGxhc3QgY29tbWl0CjxVcD4sIHAsIGkJTW92ZSB1cCBvbmUgY29tbWl0CjxEb3duPiwgbiwgawlNb3ZlIGRvd24gb25lIGNvbW1pdAo8TGVmdD4sIHosIGoJR28gYmFjayBpbiBoaXN0b3J5IGxpc3QKPFJpZ2h0PiwgeCwgbAlHbyBmb3J3YXJkIGluIGhpc3RvcnkgbGlzdAo8UGFnZVVwPglNb3ZlIHVwIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0CjxQYWdlRG93bj4JTW92ZSBkb3duIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0CjxDdHJsLUhvbWU+CVNjcm9sbCB0byB0b3Agb2YgY29tbWl0IGxpc3QKPEN0cmwtRW5kPglTY3JvbGwgdG8gYm90dG9tIG9mIGNvbW1pdCBsaXN0CjxDdHJsLVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIGxpbmUKPEN0cmwtRG93bj4JU2Nyb2xsIGNvbW1pdCBsaXN0IGRvd24gb25lIGxpbmUKPEN0cmwtUGFnZVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIHBhZ2UKPEN0cmwtUGFnZURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBwYWdlCjxTaGlmdC1VcD4JTW92ZSB0byBwcmV2aW91cyBoaWdobGlnaHRlZCBsaW5lCjxTaGlmdC1Eb3duPglNb3ZlIHRvIG5leHQgaGlnaGxpZ2h0ZWQgbGluZQo8RGVsZXRlPiwgYglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCjxCYWNrc3BhY2U+CVNjcm9sbCBkaWZmIHZpZXcgdXAgb25lIHBhZ2UKPFNwYWNlPgkJU2Nyb2xsIGRpZmYgdmlldyBkb3duIG9uZSBwYWdlCnUJCVNjcm9sbCBkaWZmIHZpZXcgdXAgMTggbGluZXMKZAkJU2Nyb2xsIGRpZmYgdmlldyBkb3duIDE4IGxpbmVzCjxDdHJsLUY+CQlGaW5kCjxDdHJsLUc+CQlNb3ZlIHRvIG5leHQgZmluZCBoaXQKPFJldHVybj4JTW92ZSB0byBuZXh0IGZpbmQgaGl0Ci8JCU1vdmUgdG8gbmV4dCBmaW5kIGhpdCwgb3IgcmVkbyBmaW5kCj8JCU1vdmUgdG8gcHJldmlvdXMgZmluZCBoaXQKZgkJU2Nyb2xsIGRpZmYgdmlldyB0byBuZXh0IGZpbGUKPEN0cmwtUz4JCVNlYXJjaCBmb3IgbmV4dCBoaXQgaW4gZGlmZiB2aWV3CjxDdHJsLVI+CQlTZWFyY2ggZm9yIHByZXZpb3VzIGhpdCBpbiBkaWZmIHZpZXcKPEN0cmwtS1ArPglJbmNyZWFzZSBmb250IHNpemUKPEN0cmwtcGx1cz4JSW5jcmVhc2UgZm9udCBzaXplCjxDdHJsLUtQLT4JRGVjcmVhc2UgZm9udCBzaXplCjxDdHJsLW1pbnVzPglEZWNyZWFzZSBmb250IHNpemUKfSBcCgkgICAgLWp1c3RpZnkgbGVmdCAtYmcgd2hpdGUgLWJvcmRlciAyIC1yZWxpZWYgc3Vua2VuCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIGJvdGgKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCiMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQojIGJvdHRvbSByaWdodCBvZiB0aGUgb3ZlcmFsbCB3aW5kb3cuCgpwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKICAgIGdsb2JhbCB0cmVlY29udGVudHMgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVpbmRleAoKICAgIHNldCBpeCAwCiAgICBzZXQgdHJlZWluZGV4KCkgMAogICAgc2V0IGxldiAwCiAgICBzZXQgcHJlZml4IHt9CiAgICBzZXQgcHJlZml4ZW5kIC0xCiAgICBzZXQgcHJlZmVuZHN0YWNrIHt9CiAgICBzZXQgaHRzdGFjayB7fQogICAgc2V0IGh0IDAKICAgIHNldCB0cmVlY29udGVudHMoKSB7fQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGwgewoJd2hpbGUge1tzdHJpbmcgcmFuZ2UgJGYgMCAkcHJlZml4ZW5kXSBuZSAkcHJlZml4fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJJHcgbWFyayBzZXQgZTokdHJlZWluZGV4KCRwcmVmaXgpICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBlOiR0cmVlaW5kZXgoJHByZWZpeCkgbGVmdAoJICAgIH0KCSAgICBzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCSAgICBpbmNyIGh0IFtsaW5kZXggJGh0c3RhY2sgZW5kXQoJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQoJICAgIHNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCSAgICBzZXQgcHJlZmVuZHN0YWNrIFtscmVwbGFjZSAkcHJlZmVuZHN0YWNrIGVuZCBlbmRdCgkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQoJICAgIGluY3IgbGV2IC0xCgl9CglzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCgl3aGlsZSB7W3NldCBzbGFzaCBbc3RyaW5nIGZpcnN0ICIvIiAkdGFpbF1dID49IDB9IHsKCSAgICBsYXBwZW5kIGh0c3RhY2sgJGh0CgkgICAgc2V0IGh0IDAKCSAgICBsYXBwZW5kIHByZWZlbmRzdGFjayAkcHJlZml4ZW5kCgkgICAgaW5jciBwcmVmaXhlbmQgW2V4cHIgeyRzbGFzaCArIDF9XQoJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCgkgICAgbGFwcGVuZCB0cmVlY29udGVudHMoJHByZWZpeCkgJGQKCSAgICBzZXQgb2xkcHJlZml4ICRwcmVmaXgKCSAgICBhcHBlbmQgcHJlZml4ICRkCgkgICAgc2V0IHRyZWVjb250ZW50cygkcHJlZml4KSB7fQoJICAgIHNldCB0cmVlaW5kZXgoJHByZWZpeCkgW2luY3IgaXhdCgkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAoJICAgIHNldCB0YWlsIFtzdHJpbmcgcmFuZ2UgJHRhaWwgW2V4cHIgeyRzbGFzaCsxfV0gZW5kXQoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCXNldCBodCAxCgkJc2V0IHRyZWVkaXJvcGVuKCRwcmVmaXgpIFtleHByIHskbGV2IDwgJG9wZW5sZXZzfV0KCQlzZXQgYm0gW2V4cHIgeyRsZXYgPT0gJG9wZW5sZXZzPyAidHJpLXJ0IjogInRyaS1kbiJ9XQoJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBkOiRpeCBsZWZ0CgkJc2V0IHN0ciAiXG4iCgkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQoJCSR3IGluc2VydCBlbmQgJHN0cgoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgLWFsaWduIGNlbnRlciAtaW1hZ2UgJGJtIC1wYWR4IDEgXAoJCSAgICAtbmFtZSBhOiRpeAoJCSR3IGluc2VydCBlbmQgJGQgW2hpZ2hsaWdodF90YWcgJHByZWZpeF0KCQkkdyBtYXJrIHNldCBzOiRpeCAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAoJICAgIH0KCSAgICBpbmNyIGxldgoJfQoJaWYgeyR0YWlsIG5lIHt9fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJaW5jciBodAoJCXNldCBzdHIgIlxuIgoJCWZvciB7c2V0IGkgMH0geyRpIDwgJGxldn0ge2luY3IgaX0ge2FwcGVuZCBzdHIgIlx0In0KCQkkdyBpbnNlcnQgZW5kICRzdHIKCQkkdyBpbnNlcnQgZW5kICR0YWlsIFtoaWdobGlnaHRfdGFnICRmXQoJICAgIH0KCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAoJfQogICAgfQogICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CglzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCWluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCglzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KICAgIH0KICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbGluZXRvZWx0IHtsfSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKCiAgICBzZXQgeSAyCiAgICBzZXQgcHJlZml4IHt9CiAgICB3aGlsZSB7MX0gewoJZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJICAgIGlmIHskeSA9PSAkbH0gewoJCXJldHVybiAiJHByZWZpeCRlIgoJICAgIH0KCSAgICBzZXQgbiAxCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyJ9IHsKCQlzZXQgbiAkdHJlZWhlaWdodCgkcHJlZml4JGUpCgkJaWYgeyR5ICsgJG4gPiAkbH0gewoJCSAgICBhcHBlbmQgcHJlZml4ICRlCgkJICAgIGluY3IgeQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaW5jciB5ICRuCgl9CiAgICB9Cn0KCnByb2MgaGlnaGxpZ2h0X3RyZWUge3kgcHJlZml4fSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CgogICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJc2V0IHBhdGggJHByZWZpeCRlCglpZiB7W2hpZ2hsaWdodF90YWcgJHBhdGhdIG5lIHt9fSB7CgkgICAgJGNmbGlzdCB0YWcgYWRkIGJvbGQgJHkuMCAiJHkuMCBsaW5lZW5kIgoJfQoJaW5jciB5CglpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIiAmJiAkdHJlZWhlaWdodCgkcGF0aCkgPiAxfSB7CgkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQoJfQogICAgfQogICAgcmV0dXJuICR5Cn0KCnByb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKCiAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkdyBkZWxldGUgczokaXggZTokaXgKICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCiAgICAkdyBpbWFnZSBjb25maWd1cmUgYTokaXggLWltYWdlIHRyaS1ydAogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQogICAgd2hpbGUgeyRkaXIgbmUge319IHsKCWluY3IgdHJlZWhlaWdodCgkZGlyKSAkbgoJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQogICAgfQp9Cgpwcm9jIHRyZWVvcGVuZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlY29udGVudHMgdHJlZWluZGV4CgogICAgc2V0IGl4ICR0cmVlaW5kZXgoJGRpcikKICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KICAgICR3IG1hcmsgc2V0IGU6JGl4IHM6JGl4CiAgICAkdyBtYXJrIGdyYXZpdHkgZTokaXggcmlnaHQKICAgIHNldCBsZXYgMAogICAgc2V0IHN0ciAiXG4iCiAgICBzZXQgbiBbbGxlbmd0aCAkdHJlZWNvbnRlbnRzKCRkaXIpXQogICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKCWluY3IgbGV2CglhcHBlbmQgc3RyICJcdCIKCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KICAgIH0KICAgIGZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRkaXIpIHsKCXNldCBkZSAkZGlyJGUKCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CgkgICAgc2V0IGl5ICR0cmVlaW5kZXgoJGRlKQoJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CgkgICAgJHcgbWFyayBncmF2aXR5IGQ6JGl5IGxlZnQKCSAgICAkdyBpbnNlcnQgZTokaXggJHN0cgoJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKCSAgICAkdyBpbWFnZSBjcmVhdGUgZTokaXggLWFsaWduIGNlbnRlciAtaW1hZ2UgdHJpLXJ0IC1wYWR4IDEgXAoJCS1uYW1lIGE6JGl5CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCSAgICAkdyBtYXJrIHNldCBzOiRpeSBlOiRpeAoJICAgICR3IG1hcmsgZ3Jhdml0eSBzOiRpeSBsZWZ0CgkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCgl9IGVsc2UgewoJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCX0KICAgIH0KICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IHRyZWVkaXJvcGVuKCRkaXIpIDEKICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCiAgICBzZXQgaHQgWyR3IGNnZXQgLWhlaWdodF0KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBzOiRpeF0gLl0gMF0KICAgIGlmIHskbCA8ICR0b3B9IHsKCSR3IHl2aWV3ICRsLjAKICAgIH0gZWxzZWlmIHskbCArICRuICsgMSA+ICR0b3AgKyAkaHR9IHsKCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KCWlmIHskbCA8ICR0b3B9IHsKCSAgICBzZXQgdG9wICRsCgl9CgkkdyB5dmlldyAkdG9wLjAKICAgIH0KfQoKcHJvYyB0cmVlY2xpY2sge3cgeCB5fSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKCXJldHVybgogICAgfQogICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gbmUgIi8ifSB7CglzaG93ZmlsZSAkZQogICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKCXRyZWVjbG9zZWRpciAkdyAkZQogICAgfSBlbHNlIHsKCXRyZWVvcGVuZGlyICR3ICRlCiAgICB9Cn0KCnByb2Mgc2V0ZmlsZWxpc3Qge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IGNmbGlzdAoKICAgIHRyZWV2aWV3ICRjZmxpc3QgJHRyZWVmaWxlbGlzdCgkaWQpIDAKfQoKaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktcnQgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1ydF93aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktcnRfYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhmMCwgMHgwMCwKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnQtbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1ydC1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCiAgICAgICAweGY4LCAweDAzLCAweGY4LCAweDAxLCAweGY4LCAweDAwLCAweDc4LCAweDAwLCAweDM4LCAweDAwLCAweDE4LCAweDAwLAogICAgICAgMHgwOCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktZG4gLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1kbl93aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktZG5fYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwNywgMHhmOCwgMHgwMywKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG4tbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1kbi1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCiAgICAgICAweGY4LCAweDAzLCAweGYwLCAweDAxLCAweGUwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0KCnByb2MgaW5pdF9mbGlzdCB7Zmlyc3R9IHsKICAgIGdsb2JhbCBjZmxpc3QgY2ZsaXN0X3RvcCBzZWxlY3RlZGxpbmUgZGlmZmZpbGVzdGFydAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IGRlbGV0ZSAwLjAgZW5kCiAgICBpZiB7JGZpcnN0IG5lIHt9fSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGZpcnN0CglzZXQgY2ZsaXN0X3RvcCAxCgkkY2ZsaXN0IHRhZyBhZGQgaGlnaGxpZ2h0IDEuMCAiMS4wIGxpbmVlbmQiCiAgICB9IGVsc2UgewoJY2F0Y2gge3Vuc2V0IGNmbGlzdF90b3B9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgZGlmZmZpbGVzdGFydCB7fQp9Cgpwcm9jIGhpZ2hsaWdodF90YWcge2Z9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcGF0aHMKCiAgICBmb3JlYWNoIHAgJGhpZ2hsaWdodF9wYXRocyB7CglpZiB7W3N0cmluZyBtYXRjaCAkcCAkZl19IHsKCSAgICByZXR1cm4gImJvbGQiCgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBoaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNtaXRtb2RlIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJc2V0IGVuZCBbbGluZGV4IFtzcGxpdCBbJGNmbGlzdCBpbmRleCBlbmRdIC5dIDBdCglmb3Ige3NldCBsIDJ9IHskbCA8ICRlbmR9IHtpbmNyIGx9IHsKCSAgICBzZXQgbGluZSBbJGNmbGlzdCBnZXQgJGwuMCAiJGwuMCBsaW5lZW5kIl0KCSAgICBpZiB7W2hpZ2hsaWdodF90YWcgJGxpbmVdIG5lIHt9fSB7CgkJJGNmbGlzdCB0YWcgYWRkIGJvbGQgJGwuMCAiJGwuMCBsaW5lZW5kIgoJICAgIH0KCX0KICAgIH0gZWxzZSB7CgloaWdobGlnaHRfdHJlZSAyIHt9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgdW5oaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgYm9sZCAxLjAgZW5kCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgYWRkX2ZsaXN0IHtmbH0gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGZsIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAiXG4iCgkkY2ZsaXN0IGluc2VydCBlbmQgJGYgW2hpZ2hsaWdodF90YWcgJGZdCiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2Mgc2VsX2ZsaXN0IHt3IHggeX0gewogICAgZ2xvYmFsIGN0ZXh0IGRpZmZmaWxlc3RhcnQgY2ZsaXN0IGNmbGlzdF90b3AgY21pdG1vZGUKCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKICAgIH0gZWxzZSB7CgljYXRjaCB7JGN0ZXh0IHl2aWV3IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgW2V4cHIgeyRsIC0gMn1dXX0KICAgIH0KfQoKIyBGdW5jdGlvbnMgZm9yIGFkZGluZyBhbmQgcmVtb3Zpbmcgc2hlbGwtdHlwZSBxdW90aW5nCgpwcm9jIHNoZWxscXVvdGUge3N0cn0gewogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqXFsnXCJcXCBcdF0qIiAkc3RyXX0gewoJcmV0dXJuICRzdHIKICAgIH0KICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFxdKiIgJHN0cl19IHsKCXJldHVybiAiXCIkc3RyXCIiCiAgICB9CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIionKiIgJHN0cl19IHsKCXJldHVybiAiJyRzdHInIgogICAgfQogICAgcmV0dXJuICJcIltzdHJpbmcgbWFwIHtcIiBcXFwiIFxcIFxcXFx9ICRzdHJdXCIiCn0KCnByb2Mgc2hlbGxhcmdsaXN0IHtsfSB7CiAgICBzZXQgc3RyIHt9CiAgICBmb3JlYWNoIGEgJGwgewoJaWYgeyRzdHIgbmUge319IHsKCSAgICBhcHBlbmQgc3RyICIgIgoJfQoJYXBwZW5kIHN0ciBbc2hlbGxxdW90ZSAkYV0KICAgIH0KICAgIHJldHVybiAkc3RyCn0KCnByb2Mgc2hlbGxkZXF1b3RlIHtzdHJ9IHsKICAgIHNldCByZXQge30KICAgIHNldCB1c2VkIC0xCiAgICB3aGlsZSB7MX0gewoJaW5jciB1c2VkCglpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcWydcIlxcXFwgXHRdIiAkc3RyIGZpcnN0XX0gewoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIGVuZF0KCSAgICBzZXQgdXNlZCBbc3RyaW5nIGxlbmd0aCAkc3RyXQoJICAgIGJyZWFrCgl9CglzZXQgZmlyc3QgW2xpbmRleCAkZmlyc3QgMF0KCXNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJaWYgeyRmaXJzdCA+ICR1c2VkfSB7CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KCSAgICBzZXQgdXNlZCAkZmlyc3QKCX0KCWlmIHskY2ggZXEgIiAiIHx8ICRjaCBlcSAiXHQifSBicmVhawoJaW5jciB1c2VkCglpZiB7JGNoIGVxICInIn0gewoJICAgIHNldCBmaXJzdCBbc3RyaW5nIGZpcnN0ICInIiAkc3RyICR1c2VkXQoJICAgIGlmIHskZmlyc3QgPCAwfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBzaW5nbGUtcXVvdGUiCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkgICAgc2V0IHVzZWQgJGZpcnN0CgkgICAgY29udGludWUKCX0KCWlmIHskY2ggZXEgIlxcIn0gewoJICAgIGlmIHskdXNlZCA+PSBbc3RyaW5nIGxlbmd0aCAkc3RyXX0gewoJCWVycm9yICJ0cmFpbGluZyBiYWNrc2xhc2giCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQoJICAgIGNvbnRpbnVlCgl9CgkjIGhlcmUgY2ggPT0gIlwiIgoJd2hpbGUgezF9IHsKCSAgICBpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcW1wiXFxcXF0iICRzdHIgZmlyc3RdfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBkb3VibGUtcXVvdGUiCgkgICAgfQoJICAgIHNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQoJICAgIHNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJICAgIGlmIHskZmlyc3QgPiAkdXNlZH0gewoJCWFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkJc2V0IHVzZWQgJGZpcnN0CgkgICAgfQoJICAgIGlmIHskY2ggZXEgIlwiIn0gYnJlYWsKCSAgICBpbmNyIHVzZWQKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KCSAgICBpbmNyIHVzZWQKCX0KICAgIH0KICAgIHJldHVybiBbbGlzdCAkdXNlZCAkcmV0XQp9Cgpwcm9jIHNoZWxsc3BsaXQge3N0cn0gewogICAgc2V0IGwge30KICAgIHdoaWxlIHsxfSB7CglzZXQgc3RyIFtzdHJpbmcgdHJpbWxlZnQgJHN0cl0KCWlmIHskc3RyIGVxIHt9fSBicmVhawoJc2V0IGRxIFtzaGVsbGRlcXVvdGUgJHN0cl0KCXNldCBuIFtsaW5kZXggJGRxIDBdCglzZXQgd29yZCBbbGluZGV4ICRkcSAxXQoJc2V0IHN0ciBbc3RyaW5nIHJhbmdlICRzdHIgJG4gZW5kXQoJbGFwcGVuZCBsICR3b3JkCiAgICB9CiAgICByZXR1cm4gJGwKfQoKIyBDb2RlIHRvIGltcGxlbWVudCBtdWx0aXBsZSB2aWV3cwoKcHJvYyBuZXd2aWV3IHtpc2hpZ2hsaWdodH0gewogICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHVpZm9udCBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIG5ld3ZpZXdhcmdzIHJldnRyZWVhcmdzCgogICAgc2V0IG5ld2lzaGlnaGxpZ2h0ICRpc2hpZ2hsaWdodAogICAgc2V0IHRvcCAuZ2l0a3ZpZXcKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXd2aWV3bmFtZSgkbmV4dHZpZXdudW0pICJWaWV3ICRuZXh0dmlld251bSIKICAgIHNldCBuZXd2aWV3cGVybSgkbmV4dHZpZXdudW0pIDAKICAgIHNldCBuZXd2aWV3YXJncygkbmV4dHZpZXdudW0pIFtzaGVsbGFyZ2xpc3QgJHJldnRyZWVhcmdzXQogICAgdmlld2VkaXRvciAkdG9wICRuZXh0dmlld251bSAiR2l0ayB2aWV3IGRlZmluaXRpb24iIAp9Cgpwcm9jIGVkaXR2aWV3IHt9IHsKICAgIGdsb2JhbCBjdXJ2aWV3CiAgICBnbG9iYWwgdmlld25hbWUgdmlld3Blcm0gbmV3dmlld25hbWUgbmV3dmlld3Blcm0KICAgIGdsb2JhbCB2aWV3YXJncyBuZXd2aWV3YXJncwoKICAgIHNldCB0b3AgLmdpdGt2ZWRpdC0kY3VydmlldwogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgc2V0IG5ld3ZpZXduYW1lKCRjdXJ2aWV3KSAkdmlld25hbWUoJGN1cnZpZXcpCiAgICBzZXQgbmV3dmlld3Blcm0oJGN1cnZpZXcpICR2aWV3cGVybSgkY3VydmlldykKICAgIHNldCBuZXd2aWV3YXJncygkY3VydmlldykgW3NoZWxsYXJnbGlzdCAkdmlld2FyZ3MoJGN1cnZpZXcpXQogICAgdmlld2VkaXRvciAkdG9wICRjdXJ2aWV3ICJHaXRrOiBlZGl0IHZpZXcgJHZpZXduYW1lKCRjdXJ2aWV3KSIKfQoKcHJvYyB2aWV3ZWRpdG9yIHt0b3AgbiB0aXRsZX0gewogICAgZ2xvYmFsIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHZpZXdmaWxlcwogICAgZ2xvYmFsIHVpZm9udAoKICAgIHRvcGxldmVsICR0b3AKICAgIHdtIHRpdGxlICR0b3AgJHRpdGxlCiAgICBsYWJlbCAkdG9wLm5sIC10ZXh0ICJOYW1lIiAtZm9udCAkdWlmb250CiAgICBlbnRyeSAkdG9wLm5hbWUgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgbmV3dmlld25hbWUoJG4pCiAgICBncmlkICR0b3AubmwgJHRvcC5uYW1lIC1zdGlja3kgdyAtcGFkeSA1CiAgICBjaGVja2J1dHRvbiAkdG9wLnBlcm0gLXRleHQgIlJlbWVtYmVyIHRoaXMgdmlldyIgLXZhcmlhYmxlIG5ld3ZpZXdwZXJtKCRuKQogICAgZ3JpZCAkdG9wLnBlcm0gLSAtcGFkeSA1IC1zdGlja3kgdwogICAgbWVzc2FnZSAkdG9wLmFsIC1hc3BlY3QgMTAwMCAtZm9udCAkdWlmb250IFwKCS10ZXh0ICJDb21taXRzIHRvIGluY2x1ZGUgKGFyZ3VtZW50cyB0byBnaXQgcmV2LWxpc3QpOiIKICAgIGdyaWQgJHRvcC5hbCAtIC1zdGlja3kgdyAtcGFkeSA1CiAgICBlbnRyeSAkdG9wLmFyZ3MgLXdpZHRoIDUwIC10ZXh0dmFyaWFibGUgbmV3dmlld2FyZ3MoJG4pIFwKCS1iYWNrZ3JvdW5kIHdoaXRlCiAgICBncmlkICR0b3AuYXJncyAtIC1zdGlja3kgZXcgLXBhZHggNQogICAgbWVzc2FnZSAkdG9wLmwgLWFzcGVjdCAxMDAwIC1mb250ICR1aWZvbnQgXAoJLXRleHQgIkVudGVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBpbmNsdWRlLCBvbmUgcGVyIGxpbmU6IgogICAgZ3JpZCAkdG9wLmwgLSAtc3RpY2t5IHcKICAgIHRleHQgJHRvcC50IC13aWR0aCA0MCAtaGVpZ2h0IDEwIC1iYWNrZ3JvdW5kIHdoaXRlCiAgICBpZiB7W2luZm8gZXhpc3RzIHZpZXdmaWxlcygkbildfSB7Cglmb3JlYWNoIGYgJHZpZXdmaWxlcygkbikgewoJICAgICR0b3AudCBpbnNlcnQgZW5kICRmCgkgICAgJHRvcC50IGluc2VydCBlbmQgIlxuIgoJfQoJJHRvcC50IGRlbGV0ZSB7ZW5kIC0gMWN9IGVuZAoJJHRvcC50IG1hcmsgc2V0IGluc2VydCAwLjAKICAgIH0KICAgIGdyaWQgJHRvcC50IC0gLXN0aWNreSBldyAtcGFkeCA1CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBbbGlzdCBuZXd2aWV3b2sgJHRvcCAkbl0KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHRvcF0KICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnQKfQoKcHJvYyBkb3ZpZXdtZW51IHttIGZpcnN0IGNtZCBvcCBhcmd2fSB7CiAgICBzZXQgbm1lbnUgWyRtIGluZGV4IGVuZF0KICAgIGZvciB7c2V0IGkgJGZpcnN0fSB7JGkgPD0gJG5tZW51fSB7aW5jciBpfSB7CglpZiB7WyRtIGVudHJ5Y2dldCAkaSAtY29tbWFuZF0gZXEgJGNtZH0gewoJICAgIGV2YWwgJG0gJG9wICRpICRhcmd2CgkgICAgYnJlYWsKCX0KICAgIH0KfQoKcHJvYyBhbGx2aWV3bWVudXMge24gb3AgYXJnc30gewogICAgZ2xvYmFsIHZpZXdobG1lbnUKCiAgICBkb3ZpZXdtZW51IC5iYXIudmlldyA1IFtsaXN0IHNob3d2aWV3ICRuXSAkb3AgJGFyZ3MKICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSAkb3AgJGFyZ3MKfQoKcHJvYyBuZXd2aWV3b2sge3RvcCBufSB7CiAgICBnbG9iYWwgbmV4dHZpZXdudW0gbmV3dmlld3Blcm0gbmV3dmlld25hbWUgbmV3aXNoaWdobGlnaHQKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3ZmlsZXMgdmlld3Blcm0gc2VsZWN0ZWR2aWV3IGN1cnZpZXcKICAgIGdsb2JhbCB2aWV3YXJncyBuZXd2aWV3YXJncyB2aWV3aGxtZW51CgogICAgaWYge1tjYXRjaCB7CglzZXQgbmV3YXJncyBbc2hlbGxzcGxpdCAkbmV3dmlld2FyZ3MoJG4pXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgaW4gY29tbWl0IHNlbGVjdGlvbiBhcmd1bWVudHM6ICRlcnIiCgl3bSByYWlzZSAkdG9wCglmb2N1cyAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlcyB7fQogICAgZm9yZWFjaCBmIFtzcGxpdCBbJHRvcC50IGdldCAwLjAgZW5kXSAiXG4iXSB7CglzZXQgZnQgW3N0cmluZyB0cmltICRmXQoJaWYgeyRmdCBuZSB7fX0gewoJICAgIGxhcHBlbmQgZmlsZXMgJGZ0Cgl9CiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZmlsZXMoJG4pXX0gewoJIyBjcmVhdGluZyBhIG5ldyB2aWV3CglpbmNyIG5leHR2aWV3bnVtCglzZXQgdmlld25hbWUoJG4pICRuZXd2aWV3bmFtZSgkbikKCXNldCB2aWV3cGVybSgkbikgJG5ld3ZpZXdwZXJtKCRuKQoJc2V0IHZpZXdmaWxlcygkbikgJGZpbGVzCglzZXQgdmlld2FyZ3MoJG4pICRuZXdhcmdzCglhZGR2aWV3bWVudSAkbgoJaWYgeyEkbmV3aXNoaWdobGlnaHR9IHsKCSAgICBhZnRlciBpZGxlIHNob3d2aWV3ICRuCgl9IGVsc2UgewoJICAgIGFmdGVyIGlkbGUgYWRkdmhpZ2hsaWdodCAkbgoJfQogICAgfSBlbHNlIHsKCSMgZWRpdGluZyBhbiBleGlzdGluZyB2aWV3CglzZXQgdmlld3Blcm0oJG4pICRuZXd2aWV3cGVybSgkbikKCWlmIHskbmV3dmlld25hbWUoJG4pIG5lICR2aWV3bmFtZSgkbil9IHsKCSAgICBzZXQgdmlld25hbWUoJG4pICRuZXd2aWV3bmFtZSgkbikKCSAgICBkb3ZpZXdtZW51IC5iYXIudmlldyA1IFtsaXN0IHNob3d2aWV3ICRuXSBcCgkJZW50cnljb25mIFtsaXN0IC1sYWJlbCAkdmlld25hbWUoJG4pXQoJICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSBcCgkJZW50cnljb25mIFtsaXN0IC1sYWJlbCAkdmlld25hbWUoJG4pIC12YWx1ZSAkdmlld25hbWUoJG4pXQoJfQoJaWYgeyRmaWxlcyBuZSAkdmlld2ZpbGVzKCRuKSB8fCAkbmV3YXJncyBuZSAkdmlld2FyZ3MoJG4pfSB7CgkgICAgc2V0IHZpZXdmaWxlcygkbikgJGZpbGVzCgkgICAgc2V0IHZpZXdhcmdzKCRuKSAkbmV3YXJncwoJICAgIGlmIHskY3VydmlldyA9PSAkbn0gewoJCWFmdGVyIGlkbGUgdXBkYXRlY29tbWl0cwoJICAgIH0KCX0KICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9Cn0KCnByb2MgZGVsdmlldyB7fSB7CiAgICBnbG9iYWwgY3VydmlldyB2aWV3ZGF0YSB2aWV3cGVybSBobHZpZXcgc2VsZWN0ZWRobHZpZXcKCiAgICBpZiB7JGN1cnZpZXcgPT0gMH0gcmV0dXJuCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJGhsdmlldyA9PSAkY3Vydmlld30gewoJc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKCXVuc2V0IGhsdmlldwogICAgfQogICAgYWxsdmlld21lbnVzICRjdXJ2aWV3IGRlbGV0ZQogICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSB7fQogICAgc2V0IHZpZXdwZXJtKCRjdXJ2aWV3KSAwCiAgICBzaG93dmlldyAwCn0KCnByb2MgYWRkdmlld21lbnUge259IHsKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3aGxtZW51CgogICAgLmJhci52aWV3IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJHZpZXduYW1lKCRuKSBcCgktY29tbWFuZCBbbGlzdCBzaG93dmlldyAkbl0gLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgJG4KICAgICR2aWV3aGxtZW51IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJHZpZXduYW1lKCRuKSBcCgktY29tbWFuZCBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSAtdmFyaWFibGUgc2VsZWN0ZWRobHZpZXcKfQoKcHJvYyBmbGF0dGVuIHt2YXJ9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgc2V0IHJldCB7fQogICAgZm9yZWFjaCBpIFthcnJheSBuYW1lcyAkdmFyXSB7CglsYXBwZW5kIHJldCAkaSBbc2V0ICR2YXJcKCRpXCldCiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIHVuZmxhdHRlbiB7dmFyIGx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgY2F0Y2gge3Vuc2V0ICR2YXJ9CiAgICBmb3JlYWNoIHtpIHZ9ICRsIHsKCXNldCAkdmFyXCgkaVwpICR2CiAgICB9Cn0KCnByb2Mgc2hvd3ZpZXcge259IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHZpZXdkYXRhIHZpZXdmaWxlcwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBwYXJlbnRsaXN0IGNoaWxkbGlzdCByb3dpZGxpc3Qgcm93b2Zmc2V0cwogICAgZ2xvYmFsIGNvbG9ybWFwIHJvd3RleHR4IGNvbW1pdHJvdyBuZXh0Y29sb3IgY2FudnhtYXgKICAgIGdsb2JhbCBudW1jb21taXRzIHJvd3JhbmdlbGlzdCBjb21taXRsaXN0ZWQgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkIGNhbnYgY2FudnkwCiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyB0cmVlZGlmZnMKICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdCBwaGFzZQogICAgZ2xvYmFsIGNvbW1pdGlkeCByb3dsYWlkb3V0IHJvd29wdGltIGxpbmVzZWdlbmRzCiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzZWxlY3RlZHZpZXcKICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKICAgIGdsb2JhbCBobHZpZXcgc2VsZWN0ZWRobHZpZXcKCiAgICBpZiB7JG4gPT0gJGN1cnZpZXd9IHJldHVybgogICAgc2V0IHNlbGlkIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBzZWxpZCAkY3VycmVudGlkCglzZXQgeSBbeWMgJHNlbGVjdGVkbGluZV0KCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCXNldCBzcGFuIFskY2FudiB5dmlld10KCXNldCB5dG9wIFtleHByIHtbbGluZGV4ICRzcGFuIDBdICogJHltYXh9XQoJc2V0IHlib3QgW2V4cHIge1tsaW5kZXggJHNwYW4gMV0gKiAkeW1heH1dCglpZiB7JHl0b3AgPCAkeSAmJiAkeSA8ICR5Ym90fSB7CgkgICAgc2V0IHlzY3JlZW4gW2V4cHIgeyR5IC0gJHl0b3B9XQoJfSBlbHNlIHsKCSAgICBzZXQgeXNjcmVlbiBbZXhwciB7KCR5Ym90IC0gJHl0b3ApIC8gMn1dCgl9CiAgICB9CiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgIHN0b3BmaW5kcHJvYwogICAgaWYgeyRjdXJ2aWV3ID49IDB9IHsKCXNldCB2cGFyZW50bGlzdCgkY3VydmlldykgJHBhcmVudGxpc3QKCXNldCB2Y2hpbGRsaXN0KCRjdXJ2aWV3KSAkY2hpbGRsaXN0CglzZXQgdmRpc3BvcmRlcigkY3VydmlldykgJGRpc3BsYXlvcmRlcgoJc2V0IHZjbWl0bGlzdGVkKCRjdXJ2aWV3KSAkY29tbWl0bGlzdGVkCglpZiB7JHBoYXNlIG5lIHt9fSB7CgkgICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSBcCgkJW2xpc3QgJHBoYXNlICRyb3dpZGxpc3QgJHJvd29mZnNldHMgJHJvd3JhbmdlbGlzdCBcCgkJICAgICBbZmxhdHRlbiBpZHJvd3Jhbmdlc10gW2ZsYXR0ZW4gaWRpbmxpc3RdIFwKCQkgICAgICRyb3dsYWlkb3V0ICRyb3dvcHRpbSAkbnVtY29tbWl0cyAkbGluZXNlZ2VuZHNdCgl9IGVsc2VpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkY3VydmlldyldCgkJICB8fCBbbGluZGV4ICR2aWV3ZGF0YSgkY3VydmlldykgMF0gbmUge319IHsKCSAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIFwKCQlbbGlzdCB7fSAkcm93aWRsaXN0ICRyb3dvZmZzZXRzICRyb3dyYW5nZWxpc3RdCgl9CiAgICB9CiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCB0cmVlZGlmZnN9CiAgICBjbGVhcl9kaXNwbGF5CiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJGhsdmlldyA9PSAkbn0gewoJdW5zZXQgaGx2aWV3CglzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQogICAgfQoKICAgIHNldCBjdXJ2aWV3ICRuCiAgICBzZXQgc2VsZWN0ZWR2aWV3ICRuCiAgICAuYmFyLnZpZXcgZW50cnljb25mIEVkaXQqIC1zdGF0ZSBbZXhwciB7JG4gPT0gMD8gImRpc2FibGVkIjogIm5vcm1hbCJ9XQogICAgLmJhci52aWV3IGVudHJ5Y29uZiBEZWxldGUqIC1zdGF0ZSBbZXhwciB7JG4gPT0gMD8gImRpc2FibGVkIjogIm5vcm1hbCJ9XQoKICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKCXNldCBwZW5kaW5nX3NlbGVjdCAkc2VsaWQKCWdldGNvbW1pdHMKCXJldHVybgogICAgfQoKICAgIHNldCB2ICR2aWV3ZGF0YSgkbikKICAgIHNldCBwaGFzZSBbbGluZGV4ICR2IDBdCiAgICBzZXQgZGlzcGxheW9yZGVyICR2ZGlzcG9yZGVyKCRuKQogICAgc2V0IHBhcmVudGxpc3QgJHZwYXJlbnRsaXN0KCRuKQogICAgc2V0IGNoaWxkbGlzdCAkdmNoaWxkbGlzdCgkbikKICAgIHNldCBjb21taXRsaXN0ZWQgJHZjbWl0bGlzdGVkKCRuKQogICAgc2V0IHJvd2lkbGlzdCBbbGluZGV4ICR2IDFdCiAgICBzZXQgcm93b2Zmc2V0cyBbbGluZGV4ICR2IDJdCiAgICBzZXQgcm93cmFuZ2VsaXN0IFtsaW5kZXggJHYgM10KICAgIGlmIHskcGhhc2UgZXEge319IHsKCXNldCBudW1jb21taXRzIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCgljYXRjaCB7dW5zZXQgaWRyb3dyYW5nZXN9CiAgICB9IGVsc2UgewoJdW5mbGF0dGVuIGlkcm93cmFuZ2VzIFtsaW5kZXggJHYgNF0KCXVuZmxhdHRlbiBpZGlubGlzdCBbbGluZGV4ICR2IDVdCglzZXQgcm93bGFpZG91dCBbbGluZGV4ICR2IDZdCglzZXQgcm93b3B0aW0gW2xpbmRleCAkdiA3XQoJc2V0IG51bWNvbW1pdHMgW2xpbmRleCAkdiA4XQoJc2V0IGxpbmVzZWdlbmRzIFtsaW5kZXggJHYgOV0KICAgIH0KCiAgICBjYXRjaCB7dW5zZXQgY29sb3JtYXB9CiAgICBjYXRjaCB7dW5zZXQgcm93dGV4dHh9CiAgICBzZXQgbmV4dGNvbG9yIDAKICAgIHNldCBjYW52eG1heCBbJGNhbnYgY2dldCAtd2lkdGhdCiAgICBzZXQgY3VydmlldyAkbgogICAgc2V0IHJvdyAwCiAgICBzZXRjYW52c2Nyb2xsCiAgICBzZXQgeWYgMAogICAgc2V0IHJvdyAwCiAgICBpZiB7JHNlbGlkIG5lIHt9ICYmIFtpbmZvIGV4aXN0cyBjb21taXRyb3coJG4sJHNlbGlkKV19IHsKCXNldCByb3cgJGNvbW1pdHJvdygkbiwkc2VsaWQpCgkjIHRyeSB0byBnZXQgdGhlIHNlbGVjdGVkIHJvdyBpbiB0aGUgc2FtZSBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuCglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglzZXQgeXRvcCBbZXhwciB7W3ljICRyb3ddIC0gJHlzY3JlZW59XQoJaWYgeyR5dG9wIDwgMH0gewoJICAgIHNldCB5dG9wIDAKCX0KCXNldCB5ZiBbZXhwciB7JHl0b3AgKiAxLjAgLyAkeW1heH1dCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gJHlmCiAgICBkcmF3dmlzaWJsZQogICAgc2VsZWN0bGluZSAkcm93IDAKICAgIGlmIHskcGhhc2UgbmUge319IHsKCWlmIHskcGhhc2UgZXEgImdldGNvbW1pdHMifSB7CgkgICAgc2hvd19zdGF0dXMgIlJlYWRpbmcgY29tbWl0cy4uLiIKCX0KCWlmIHtbaW5mbyBleGlzdHMgY29tbWZkKCRuKV19IHsKCSAgICBsYXlvdXRtb3JlIHt9Cgl9IGVsc2UgewoJICAgIGZpbmlzaGNvbW1pdHMKCX0KICAgIH0gZWxzZWlmIHskbnVtY29tbWl0cyA9PSAwfSB7CglzaG93X3N0YXR1cyAiTm8gY29tbWl0cyBzZWxlY3RlZCIKICAgIH0KfQoKIyBTdHVmZiByZWxhdGluZyB0byB0aGUgaGlnaGxpZ2h0aW5nIGZhY2lsaXR5Cgpwcm9jIGlzaGlnaGxpZ2h0ZWQge3Jvd30gewogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCgogICAgaWYge1tpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV0gJiYgJG5oaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRuaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV0gJiYgJHZoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICR2aGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV0gJiYgJGZoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRmaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV0gJiYgJHJoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRyaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgcmV0dXJuIDAKfQoKcHJvYyBib2xkZW4ge3JvdyBmb250fSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBzZWxlY3RlZGxpbmUgYm9sZHJvd3MKCiAgICBsYXBwZW5kIGJvbGRyb3dzICRyb3cKICAgICRjYW52IGl0ZW1jb25mICRsaW5laHRhZygkcm93KSAtZm9udCAkZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRyb3cgPT0gJHNlbGVjdGVkbGluZX0gewoJJGNhbnYgZGVsZXRlIHNlY3NlbAoJc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRyb3cpXSBcCgkJICAgLW91dGxpbmUge3t9fSAtdGFncyBzZWNzZWwgXAoJCSAgIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KCSRjYW52IGxvd2VyICR0CiAgICB9Cn0KCnByb2MgYm9sZGVuX25hbWUge3JvdyBmb250fSB7CiAgICBnbG9iYWwgY2FudjIgbGluZW50YWcgc2VsZWN0ZWRsaW5lIGJvbGRuYW1lcm93cwoKICAgIGxhcHBlbmQgYm9sZG5hbWVyb3dzICRyb3cKICAgICRjYW52MiBpdGVtY29uZiAkbGluZW50YWcoJHJvdykgLWZvbnQgJGZvbnQKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKCSRjYW52MiBkZWxldGUgc2Vjc2VsCglzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkcm93KV0gXAoJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKCQkgICAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQoJJGNhbnYyIGxvd2VyICR0CiAgICB9Cn0KCnByb2MgdW5ib2xkZW4ge30gewogICAgZ2xvYmFsIG1haW5mb250IGJvbGRyb3dzCgogICAgc2V0IHN0aWxsYm9sZCB7fQogICAgZm9yZWFjaCByb3cgJGJvbGRyb3dzIHsKCWlmIHshW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyAkbWFpbmZvbnQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBzdGlsbGJvbGQgJHJvdwoJfQogICAgfQogICAgc2V0IGJvbGRyb3dzICRzdGlsbGJvbGQKfQoKcHJvYyBhZGR2aGlnaGxpZ2h0IHtufSB7CiAgICBnbG9iYWwgaGx2aWV3IGN1cnZpZXcgdmlld2RhdGEgdmhsX2RvbmUgdmhpZ2hsaWdodHMgY29tbWl0aWR4CgogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddfSB7CglkZWx2aGlnaGxpZ2h0CiAgICB9CiAgICBzZXQgaGx2aWV3ICRuCiAgICBpZiB7JG4gIT0gJGN1cnZpZXcgJiYgIVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkbildfSB7CglzZXQgdmlld2RhdGEoJG4pIFtsaXN0IGdldGNvbW1pdHMge3t9fSB7e319IHt9IHt9IHt9IDAgMCAwIHt9XQoJc2V0IHZwYXJlbnRsaXN0KCRuKSB7fQoJc2V0IHZjaGlsZGxpc3QoJG4pIHt9CglzZXQgdmRpc3BvcmRlcigkbikge30KCXNldCB2Y21pdGxpc3RlZCgkbikge30KCXN0YXJ0X3Jldl9saXN0ICRuCiAgICB9CiAgICBzZXQgdmhsX2RvbmUgJGNvbW1pdGlkeCgkaGx2aWV3KQogICAgaWYgeyR2aGxfZG9uZSA+IDB9IHsKCWRyYXd2aXNpYmxlCiAgICB9Cn0KCnByb2MgZGVsdmhpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgaGx2aWV3XX0gcmV0dXJuCiAgICB1bnNldCBobHZpZXcKICAgIGNhdGNoIHt1bnNldCB2aGlnaGxpZ2h0c30KICAgIHVuYm9sZGVuCn0KCnByb2MgdmhpZ2hsaWdodG1vcmUge30gewogICAgZ2xvYmFsIGhsdmlldyB2aGxfZG9uZSBjb21taXRpZHggdmhpZ2hsaWdodHMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgdmRpc3BvcmRlciBjdXJ2aWV3IG1haW5mb250CgogICAgc2V0IGZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KICAgIHNldCBtYXggJGNvbW1pdGlkeCgkaGx2aWV3KQogICAgaWYgeyRobHZpZXcgPT0gJGN1cnZpZXd9IHsKCXNldCBkaXNwICRkaXNwbGF5b3JkZXIKICAgIH0gZWxzZSB7CglzZXQgZGlzcCAkdmRpc3BvcmRlcigkaGx2aWV3KQogICAgfQogICAgc2V0IHZyIFt2aXNpYmxlcm93c10KICAgIHNldCByMCBbbGluZGV4ICR2ciAwXQogICAgc2V0IHIxIFtsaW5kZXggJHZyIDFdCiAgICBmb3Ige3NldCBpICR2aGxfZG9uZX0geyRpIDwgJG1heH0ge2luY3IgaX0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3AgJGldCglpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJICAgIHNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCgkgICAgaWYgeyRyMCA8PSAkcm93ICYmICRyb3cgPD0gJHIxfSB7CgkJaWYgeyFbaGlnaGxpZ2h0ZWQgJHJvd119IHsKCQkgICAgYm9sZGVuICRyb3cgJGZvbnQKCQl9CgkJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgdmhsX2RvbmUgJG1heAp9Cgpwcm9jIGFza3ZoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cyBjb21taXRyb3cgaWRkcmF3biBtYWluZm9udAoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRobHZpZXcsJGlkKV19IHsKCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXSAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKICAgIH0gZWxzZSB7CglzZXQgdmhpZ2hsaWdodHMoJHJvdykgMAogICAgfQp9Cgpwcm9jIGhmaWxlc19jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaF9zZXJpYWwKICAgIGdsb2JhbCBtYWluZm9udCBoaWdobGlnaHRfcGF0aHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CgkjIGRlbGV0ZSBwcmV2aW91cyBoaWdobGlnaHRzCgljYXRjaCB7Y2xvc2UgJGZpbGVoaWdobGlnaHR9Cgl1bnNldCBmaWxlaGlnaGxpZ2h0CgljYXRjaCB7dW5zZXQgZmhpZ2hsaWdodHN9Cgl1bmJvbGRlbgoJdW5oaWdobGlnaHRfZmlsZWxpc3QKICAgIH0KICAgIHNldCBoaWdobGlnaHRfcGF0aHMge30KICAgIGFmdGVyIGNhbmNlbCBkb19maWxlX2hsICRmaF9zZXJpYWwKICAgIGluY3IgZmhfc2VyaWFsCiAgICBpZiB7JGhpZ2hsaWdodF9maWxlcyBuZSB7fX0gewoJYWZ0ZXIgMzAwIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAogICAgfQp9Cgpwcm9jIG1ha2VwYXR0ZXJucyB7bH0gewogICAgc2V0IHJldCB7fQogICAgZm9yZWFjaCBlICRsIHsKCXNldCBlZSBbc3RyaW5nIG1hcCB7IioiICJcXCoiICI/IiAiXFw/IiAiXFsiICJcXFxbIiAiXFwiICJcXFxcIn0gJGVdCglpZiB7W3N0cmluZyBpbmRleCAkZWUgZW5kXSBlcSAiLyJ9IHsKCSAgICBsYXBwZW5kIHJldCAiJGVlKiIKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCByZXQgJGVlCgkgICAgbGFwcGVuZCByZXQgIiRlZS8qIgoJfQogICAgfQogICAgcmV0dXJuICRyZXQKfQoKcHJvYyBkb19maWxlX2hsIHtzZXJpYWx9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBoaWdobGlnaHRfcGF0aHMgZ2R0dHlwZSBmaGxfbGlzdAoKICAgIGlmIHskZ2R0dHlwZSBlcSAidG91Y2hpbmcgcGF0aHM6In0gewoJaWYge1tjYXRjaCB7c2V0IHBhdGhzIFtzaGVsbHNwbGl0ICRoaWdobGlnaHRfZmlsZXNdfV19IHJldHVybgoJc2V0IGhpZ2hsaWdodF9wYXRocyBbbWFrZXBhdHRlcm5zICRwYXRoc10KCWhpZ2hsaWdodF9maWxlbGlzdAoJc2V0IGdkdGFyZ3MgW2NvbmNhdCAtLSAkcGF0aHNdCiAgICB9IGVsc2UgewoJc2V0IGdkdGFyZ3MgW2xpc3QgIi1TJGhpZ2hsaWdodF9maWxlcyJdCiAgICB9CiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQtZGlmZi10cmVlIC1yIC1zIC0tc3RkaW4gJGdkdGFyZ3NdCiAgICBzZXQgZmlsZWhpZ2hsaWdodCBbb3BlbiAkY21kIHIrXQogICAgZmNvbmZpZ3VyZSAkZmlsZWhpZ2hsaWdodCAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmaWxlaGlnaGxpZ2h0IHJlYWRhYmxlIHJlYWRmaGlnaGxpZ2h0CiAgICBzZXQgZmhsX2xpc3Qge30KICAgIGRyYXd2aXNpYmxlCiAgICBmbHVzaGhpZ2hsaWdodHMKfQoKcHJvYyBmbHVzaGhpZ2hsaWdodHMge30gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhsX2xpc3QKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CglsYXBwZW5kIGZobF9saXN0IHt9CglwdXRzICRmaWxlaGlnaGxpZ2h0ICIiCglmbHVzaCAkZmlsZWhpZ2hsaWdodAogICAgfQp9Cgpwcm9jIGFza2ZpbGVoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmhsX2xpc3QKCiAgICBsYXBwZW5kIGZobF9saXN0ICRpZAogICAgc2V0IGZoaWdobGlnaHRzKCRyb3cpIC0xCiAgICBwdXRzICRmaWxlaGlnaGxpZ2h0ICRpZAp9Cgpwcm9jIHJlYWRmaGlnaGxpZ2h0IHt9IHsKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGNvbW1pdHJvdyBjdXJ2aWV3IG1haW5mb250IGlkZHJhd24KICAgIGdsb2JhbCBmaGxfbGlzdAoKICAgIHdoaWxlIHtbZ2V0cyAkZmlsZWhpZ2hsaWdodCBsaW5lXSA+PSAwfSB7CglzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGZobF9saXN0ICRsaW5lXQoJaWYgeyRpIDwgMH0gY29udGludWUKCWZvciB7c2V0IGogMH0geyRqIDwgJGl9IHtpbmNyIGp9IHsKCSAgICBzZXQgaWQgW2xpbmRleCAkZmhsX2xpc3QgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCQlzZXQgZmhpZ2hsaWdodHMoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAwCgkgICAgfQoJfQoJc2V0IGZobF9saXN0IFtscmFuZ2UgJGZobF9saXN0IFtleHByIHskaSsxfV0gZW5kXQoJaWYgeyRsaW5lIGVxIHt9fSBjb250aW51ZQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKV19IGNvbnRpbnVlCglzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGxpbmUpCglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGxpbmUpXSAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJc2V0IGZoaWdobGlnaHRzKCRyb3cpIDEKICAgIH0KICAgIGlmIHtbZW9mICRmaWxlaGlnaGxpZ2h0XX0gewoJIyBzdHJhbmdlLi4uCglwdXRzICJvb3BzLCBnaXQtZGlmZi10cmVlIGRpZWQiCgljYXRjaCB7Y2xvc2UgJGZpbGVoaWdobGlnaHR9Cgl1bnNldCBmaWxlaGlnaGxpZ2h0CiAgICB9CiAgICBuZXh0X2hsY29udAp9Cgpwcm9jIGZpbmRfY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgbmhpZ2hsaWdodHMgbWFpbmZvbnQgYm9sZG5hbWVyb3dzCiAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kcGF0dGVybiBmaW5kdHlwZQoKICAgICMgZGVsZXRlIHByZXZpb3VzIGhpZ2hsaWdodHMsIGlmIGFueQogICAgZm9yZWFjaCByb3cgJGJvbGRuYW1lcm93cyB7Cglib2xkZW5fbmFtZSAkcm93ICRtYWluZm9udAogICAgfQogICAgc2V0IGJvbGRuYW1lcm93cyB7fQogICAgY2F0Y2gge3Vuc2V0IG5oaWdobGlnaHRzfQogICAgdW5ib2xkZW4KICAgIGlmIHskZmluZHR5cGUgbmUgIlJlZ2V4cCJ9IHsKCXNldCBlIFtzdHJpbmcgbWFwIHsiKiIgIlxcKiIgIj8iICJcXD8iICJcWyIgIlxcXFsiICJcXCIgIlxcXFwifSBcCgkJICAgJGZpbmRzdHJpbmddCglzZXQgZmluZHBhdHRlcm4gIiokZSoiCiAgICB9CiAgICBkcmF3dmlzaWJsZQp9Cgpwcm9jIGFza2ZpbmRoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIG5oaWdobGlnaHRzIGNvbW1pdGluZm8gaWRkcmF3biBtYWluZm9udAogICAgZ2xvYmFsIGZpbmRzdHJpbmcgZmluZHR5cGUgZmluZGxvYyBmaW5kcGF0dGVybgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCWdldGNvbW1pdCAkaWQKICAgIH0KICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgIHNldCBpc2JvbGQgMAogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudHN9CiAgICBmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCWlmIHskZmluZGxvYyBuZSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgbmUgJHR5fSB7CgkgICAgY29udGludWUKCX0KCWlmIHskZmluZHR5cGUgZXEgIlJlZ2V4cCJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtyZWdleHAgJGZpbmRzdHJpbmcgJGZdCgl9IGVsc2VpZiB7JGZpbmR0eXBlIGVxICJJZ25DYXNlIn0gewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAtbm9jYXNlICRmaW5kcGF0dGVybiAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoICRmaW5kcGF0dGVybiAkZl0KCX0KCWlmIHskZG9lc21hdGNofSB7CgkgICAgaWYgeyR0eSBlcSAiQXV0aG9yIn0gewoJCXNldCBpc2JvbGQgMgoJICAgIH0gZWxzZSB7CgkJc2V0IGlzYm9sZCAxCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSB7CglpZiB7JGlzYm9sZCAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJaWYgeyRpc2JvbGQgPj0gMn0gewoJICAgIGJvbGRlbl9uYW1lICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KICAgIH0KICAgIHNldCBuaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCn0KCnByb2MgdnJlbF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZAoKICAgIHJoaWdobGlnaHRfbm9uZQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSJ9IHsKCWFmdGVyIGlkbGUgZHJhd3Zpc2libGUKICAgIH0KfQoKIyBwcmVwYXJlIGZvciB0ZXN0aW5nIHdoZXRoZXIgY29tbWl0cyBhcmUgZGVzY2VuZGVudHMgb3IgYW5jZXN0b3JzIG9mIGEKcHJvYyByaGlnaGxpZ2h0X3NlbCB7YX0gewogICAgZ2xvYmFsIGRlc2NlbmRlbnQgZGVzY190b2RvIGFuY2VzdG9yIGFuY190b2RvCiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQgcmhpZ2hsaWdodHMKCiAgICBjYXRjaCB7dW5zZXQgZGVzY2VuZGVudH0KICAgIHNldCBkZXNjX3RvZG8gW2xpc3QgJGFdCiAgICBjYXRjaCB7dW5zZXQgYW5jZXN0b3J9CiAgICBzZXQgYW5jX3RvZG8gW2xpc3QgJGFdCiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0gewoJcmhpZ2hsaWdodF9ub25lCglhZnRlciBpZGxlIGRyYXd2aXNpYmxlCiAgICB9Cn0KCnByb2MgcmhpZ2hsaWdodF9ub25lIHt9IHsKICAgIGdsb2JhbCByaGlnaGxpZ2h0cwoKICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KICAgIHVuYm9sZGVuCn0KCnByb2MgaXNfZGVzY2VuZGVudCB7YX0gewogICAgZ2xvYmFsIGN1cnZpZXcgY2hpbGRyZW4gY29tbWl0cm93IGRlc2NlbmRlbnQgZGVzY190b2RvCgogICAgc2V0IHYgJGN1cnZpZXcKICAgIHNldCBsYSAkY29tbWl0cm93KCR2LCRhKQogICAgc2V0IHRvZG8gJGRlc2NfdG9kbwogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBzZXQgZG9uZSAwCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gJGldCglpZiB7JGNvbW1pdHJvdygkdiwkZG8pIDwgJGxhfSB7CgkgICAgbGFwcGVuZCBsZWZ0b3ZlciAkZG8KCSAgICBjb250aW51ZQoJfQoJZm9yZWFjaCBuayAkY2hpbGRyZW4oJHYsJGRvKSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVzY2VuZGVudCgkbmspXX0gewoJCXNldCBkZXNjZW5kZW50KCRuaykgMQoJCWxhcHBlbmQgdG9kbyAkbmsKCQlpZiB7JG5rIGVxICRhfSB7CgkJICAgIHNldCBkb25lIDEKCQl9CgkgICAgfQoJfQoJaWYgeyRkb25lfSB7CgkgICAgc2V0IGRlc2NfdG9kbyBbY29uY2F0ICRsZWZ0b3ZlciBbbHJhbmdlICR0b2RvIFtleHByIHskaSsxfV0gZW5kXV0KCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBkZXNjZW5kZW50KCRhKSAwCiAgICBzZXQgZGVzY190b2RvICRsZWZ0b3Zlcgp9Cgpwcm9jIGlzX2FuY2VzdG9yIHthfSB7CiAgICBnbG9iYWwgY3VydmlldyBwYXJlbnRsaXN0IGNvbW1pdHJvdyBhbmNlc3RvciBhbmNfdG9kbwoKICAgIHNldCB2ICRjdXJ2aWV3CiAgICBzZXQgbGEgJGNvbW1pdHJvdygkdiwkYSkKICAgIHNldCB0b2RvICRhbmNfdG9kbwogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBzZXQgZG9uZSAwCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gJGldCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJHYsJGRvKV0gfHwgJGNvbW1pdHJvdygkdiwkZG8pID4gJGxhfSB7CgkgICAgbGFwcGVuZCBsZWZ0b3ZlciAkZG8KCSAgICBjb250aW51ZQoJfQoJZm9yZWFjaCBucCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJHYsJGRvKV0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRucCldfSB7CgkJc2V0IGFuY2VzdG9yKCRucCkgMQoJCWxhcHBlbmQgdG9kbyAkbnAKCQlpZiB7JG5wIGVxICRhfSB7CgkJICAgIHNldCBkb25lIDEKCQl9CgkgICAgfQoJfQoJaWYgeyRkb25lfSB7CgkgICAgc2V0IGFuY190b2RvIFtjb25jYXQgJGxlZnRvdmVyIFtscmFuZ2UgJHRvZG8gW2V4cHIgeyRpKzF9XSBlbmRdXQoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGFuY2VzdG9yKCRhKSAwCiAgICBzZXQgYW5jX3RvZG8gJGxlZnRvdmVyCn0KCnByb2MgYXNrcmVsaGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBkZXNjZW5kZW50IGhpZ2hsaWdodF9yZWxhdGVkIGlkZHJhd24gbWFpbmZvbnQgcmhpZ2hsaWdodHMKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgYW5jZXN0b3IKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBpc2JvbGQgMAogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBlcSAiRGVzY2VuZGVudCIgfHwKCSRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGRlc2NlbmRlbnQifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjZW5kZW50KCRpZCldfSB7CgkgICAgaXNfZGVzY2VuZGVudCAkaWQKCX0KCWlmIHskZGVzY2VuZGVudCgkaWQpID09ICgkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkRlc2NlbmRlbnQiKX0gewoJICAgIHNldCBpc2JvbGQgMQoJfQogICAgfSBlbHNlaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBlcSAiQW5jZXN0b3IiIHx8CgkgICAgICAkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIk5vdCBhbmNlc3RvciJ9IHsKCWlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRpZCldfSB7CgkgICAgaXNfYW5jZXN0b3IgJGlkCgl9CglpZiB7JGFuY2VzdG9yKCRpZCkgPT0gKCRoaWdobGlnaHRfcmVsYXRlZCBlcSAiQW5jZXN0b3IiKX0gewoJICAgIHNldCBpc2JvbGQgMQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSB7CglpZiB7JGlzYm9sZCAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQogICAgfQogICAgc2V0IHJoaWdobGlnaHRzKCRyb3cpICRpc2JvbGQKfQoKcHJvYyBuZXh0X2hsY29udCB7fSB7CiAgICBnbG9iYWwgZmhsX3JvdyBmaGxfZGlybiBkaXNwbGF5b3JkZXIgbnVtY29tbWl0cwogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCiAgICBnbG9iYWwgaGx2aWV3IGZpbGVoaWdobGlnaHQgZmluZHN0cmluZyBoaWdobGlnaHRfcmVsYXRlZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIGZobF9kaXJuXSB8fCAkZmhsX2Rpcm4gPT0gMH0gcmV0dXJuCiAgICBzZXQgcm93ICRmaGxfcm93CiAgICB3aGlsZSB7MX0gewoJaWYgeyRyb3cgPCAwIHx8ICRyb3cgPj0gJG51bWNvbW1pdHN9IHsKCSAgICBiZWxsCgkgICAgc2V0IGZobF9kaXJuIDAKCSAgICByZXR1cm4KCX0KCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCWlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXX0gewoJCWFza3ZoaWdobGlnaHQgJHJvdyAkaWQKCSAgICB9CgkgICAgaWYgeyR2aGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpZiB7JGZpbmRzdHJpbmcgbmUge319IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV19IHsKCQlhc2tmaW5kaGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskbmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSJ9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKCQlhc2tyZWxoaWdobGlnaHQgJHJvdyAkaWQKCSAgICB9CgkgICAgaWYgeyRyaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJIyBhc2sgZm9yIGEgZmV3IG1vcmUgd2hpbGUgd2UncmUgYXQgaXQuLi4KCQlzZXQgciAkcm93CgkJZm9yIHtzZXQgbiAwfSB7JG4gPCAxMDB9IHtpbmNyIG59IHsKCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHIpXX0gewoJCQlhc2tmaWxlaGlnaGxpZ2h0ICRyIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcl0KCQkgICAgfQoJCSAgICBpbmNyIHIgJGZobF9kaXJuCgkJICAgIGlmIHskciA8IDAgfHwgJHIgPj0gJG51bWNvbW1pdHN9IGJyZWFrCgkJfQoJCWZsdXNoaGlnaGxpZ2h0cwoJICAgIH0KCSAgICBpZiB7JGZoaWdobGlnaHRzKCRyb3cpIDwgMH0gewoJCXNldCBmaGxfcm93ICRyb3cKCQlyZXR1cm4KCSAgICB9CgkgICAgaWYgeyRmaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpbmNyIHJvdyAkZmhsX2Rpcm4KICAgIH0KICAgIHNldCBmaGxfZGlybiAwCiAgICBzZWxlY3RsaW5lICRyb3cgMQp9Cgpwcm9jIG5leHRfaGlnaGxpZ2h0IHtkaXJufSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGZobF9yb3cgZmhsX2Rpcm4KICAgIGdsb2JhbCBobHZpZXcgZmlsZWhpZ2hsaWdodCBmaW5kc3RyaW5nIGhpZ2hsaWdodF9yZWxhdGVkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7IShbaW5mbyBleGlzdHMgaGx2aWV3XSB8fCAkZmluZHN0cmluZyBuZSB7fSB8fAoJICAkaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUiIHx8IFtpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XSl9IHJldHVybgogICAgc2V0IGZobF9yb3cgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlybn1dCiAgICBzZXQgZmhsX2Rpcm4gJGRpcm4KICAgIG5leHRfaGxjb250Cn0KCnByb2MgY2FuY2VsX25leHRfaGlnaGxpZ2h0IHt9IHsKICAgIGdsb2JhbCBmaGxfZGlybgoKICAgIHNldCBmaGxfZGlybiAwCn0KCiMgR3JhcGggbGF5b3V0IGZ1bmN0aW9ucwoKcHJvYyBzaG9ydGlkcyB7aWRzfSB7CiAgICBzZXQgcmVzIHt9CiAgICBmb3JlYWNoIGlkICRpZHMgewoJaWYge1tsbGVuZ3RoICRpZF0gPiAxfSB7CgkgICAgbGFwcGVuZCByZXMgW3Nob3J0aWRzICRpZF0KCX0gZWxzZWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9JH0gJGlkXX0gewoJICAgIGxhcHBlbmQgcmVzIFtzdHJpbmcgcmFuZ2UgJGlkIDAgN10KCX0gZWxzZSB7CgkgICAgbGFwcGVuZCByZXMgJGlkCgl9CiAgICB9CiAgICByZXR1cm4gJHJlcwp9Cgpwcm9jIGluY3JhbmdlIHtsIHggb30gewogICAgc2V0IG4gW2xsZW5ndGggJGxdCiAgICB3aGlsZSB7JHggPCAkbn0gewoJc2V0IGUgW2xpbmRleCAkbCAkeF0KCWlmIHskZSBuZSB7fX0gewoJICAgIGxzZXQgbCAkeCBbZXhwciB7JGUgKyAkb31dCgl9CglpbmNyIHgKICAgIH0KICAgIHJldHVybiAkbAp9Cgpwcm9jIG50aW1lcyB7biBvfSB7CiAgICBzZXQgcmV0IHt9CiAgICBmb3Ige30geyRuID4gMH0ge2luY3IgbiAtMX0gewoJbGFwcGVuZCByZXQgJG8KICAgIH0KICAgIHJldHVybiAkcmV0Cn0KCnByb2MgdXNlZGlucmFuZ2Uge2lkIGwxIGwyfSB7CiAgICBnbG9iYWwgY2hpbGRyZW4gY29tbWl0cm93IGNoaWxkbGlzdCBjdXJ2aWV3CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQoJaWYgeyRsMSA8PSAkciAmJiAkciA8PSAkbDJ9IHsKCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCgl9CglzZXQga2lkcyBbbGluZGV4ICRjaGlsZGxpc3QgJHJdCiAgICB9IGVsc2UgewoJc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKICAgIH0KICAgIGZvcmVhY2ggYyAka2lkcyB7CglzZXQgciAkY29tbWl0cm93KCRjdXJ2aWV3LCRjKQoJaWYgeyRsMSA8PSAkciAmJiAkciA8PSAkbDJ9IHsKCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCgl9CiAgICB9CiAgICByZXR1cm4gMAp9Cgpwcm9jIHNhbml0eSB7cm93IHtmdWxsIDB9fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMKCiAgICBzZXQgY29sIC0xCiAgICBzZXQgaWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWluY3IgY29sCglpZiB7JGlkIGVxIHt9fSBjb250aW51ZQoJaWYgeyRjb2wgPCBbbGxlbmd0aCAkaWRzXSAtIDEgJiYKCSAgICBbbHNlYXJjaCAtZXhhY3QgLXN0YXJ0IFtleHByIHskY29sKzF9XSAkaWRzICRpZF0gPj0gMH0gewoJICAgIHB1dHMgIm9vcHM6IFtzaG9ydGlkcyAkaWRdIHJlcGVhdGVkIGluIHJvdyAkcm93IGNvbCAkY29sOiB7W3Nob3J0aWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV19IgoJfQoJc2V0IG8gW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICRjb2xdCglzZXQgeSAkcm93CglzZXQgeCAkY29sCgl3aGlsZSB7JG8gbmUge319IHsKCSAgICBpbmNyIHkgLTEKCSAgICBpbmNyIHggJG8KCSAgICBpZiB7W2xpbmRleCAkcm93aWRsaXN0ICR5ICR4XSAhPSAkaWR9IHsKCQlwdXRzICJvb3BzOiByb3dvZmZzZXRzIHdyb25nIGF0IHJvdyBbZXhwciB7JHkrMX1dIGNvbCBbZXhwciB7JHgtJG99XSIKCQlwdXRzICIgIGlkPVtzaG9ydGlkcyAkaWRdIGNoZWNrIHN0YXJ0ZWQgYXQgcm93ICRyb3ciCgkJZm9yIHtzZXQgaSAkcm93fSB7JGkgPj0gJHl9IHtpbmNyIGkgLTF9IHsKCQkgICAgcHV0cyAiICByb3cgJGkgaWRzPXtbc2hvcnRpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRpXV19IG9mZnM9e1tsaW5kZXggJHJvd29mZnNldHMgJGldfSIKCQl9CgkJYnJlYWsKCSAgICB9CgkgICAgaWYgeyEkZnVsbH0gYnJlYWsKCSAgICBzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICR5ICR4XQoJfQogICAgfQp9Cgpwcm9jIG1ha2V1cGFycm93IHtvaWQgeCB5IHp9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyB1cGFycm93bGVuIGlkcm93cmFuZ2VzCgogICAgZm9yIHtzZXQgaSAxfSB7JGkgPCAkdXBhcnJvd2xlbiAmJiAkeSA+IDF9IHtpbmNyIGl9IHsKCWluY3IgeSAtMQoJaW5jciB4ICR6CglzZXQgb2ZmMCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XQoJZm9yIHtzZXQgeDAgJHh9IHsxfSB7aW5jciB4MH0gewoJICAgIGlmIHskeDAgPj0gW2xsZW5ndGggJG9mZjBdfSB7CgkJc2V0IHgwIFtsbGVuZ3RoIFtsaW5kZXggJHJvd29mZnNldHMgW2V4cHIgeyR5LTF9XV1dCgkJYnJlYWsKCSAgICB9CgkgICAgc2V0IHogW2xpbmRleCAkb2ZmMCAkeDBdCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJaW5jciB4MCAkegoJCWJyZWFrCgkgICAgfQoJfQoJc2V0IHogW2V4cHIgeyR4MCAtICR4fV0KCWxzZXQgcm93aWRsaXN0ICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd2lkbGlzdCAkeV0gJHggJG9pZF0KCWxzZXQgcm93b2Zmc2V0cyAkeSBbbGluc2VydCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XSAkeCAkel0KICAgIH0KICAgIHNldCB0bXAgW2xyZXBsYWNlIFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR4IHt9XQogICAgbHNldCByb3dvZmZzZXRzICR5IFtpbmNyYW5nZSAkdG1wIFtleHByIHskeCsxfV0gLTFdCiAgICBsYXBwZW5kIGlkcm93cmFuZ2VzKCRvaWQpICR5Cn0KCnByb2MgaW5pdGxheW91dCB7fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIHJvd2xhaWRvdXQgcm93b3B0aW0KICAgIGdsb2JhbCBpZGlubGlzdCByb3djaGsgcm93cmFuZ2VsaXN0IGlkcm93cmFuZ2VzCiAgICBnbG9iYWwgbnVtY29tbWl0cyBjYW52eG1heCBjYW52CiAgICBnbG9iYWwgbmV4dGNvbG9yCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4KICAgIGdsb2JhbCBjb2xvcm1hcCByb3d0ZXh0eAogICAgZ2xvYmFsIGxpbmVzZWdlbmRzCgogICAgc2V0IG51bWNvbW1pdHMgMAogICAgc2V0IGRpc3BsYXlvcmRlciB7fQogICAgc2V0IGNvbW1pdGxpc3RlZCB7fQogICAgc2V0IHBhcmVudGxpc3Qge30KICAgIHNldCBjaGlsZGxpc3Qge30KICAgIHNldCByb3dyYW5nZWxpc3Qge30KICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IHJvd2lkbGlzdCB7e319CiAgICBzZXQgcm93b2Zmc2V0cyB7e319CiAgICBjYXRjaCB7dW5zZXQgaWRpbmxpc3R9CiAgICBjYXRjaCB7dW5zZXQgcm93Y2hrfQogICAgc2V0IHJvd2xhaWRvdXQgMAogICAgc2V0IHJvd29wdGltIDAKICAgIHNldCBjYW52eG1heCBbJGNhbnYgY2dldCAtd2lkdGhdCiAgICBjYXRjaCB7dW5zZXQgY29sb3JtYXB9CiAgICBjYXRjaCB7dW5zZXQgcm93dGV4dHh9CiAgICBjYXRjaCB7dW5zZXQgaWRyb3dyYW5nZXN9CiAgICBzZXQgbGluZXNlZ2VuZHMge30KfQoKcHJvYyBzZXRjYW52c2Nyb2xsIHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG51bWNvbW1pdHMgbGluZXNwYyBjYW52eG1heCBjYW52eTAKCiAgICBzZXQgeW1heCBbZXhwciB7JGNhbnZ5MCArICgkbnVtY29tbWl0cyAtIDAuNSkgKiAkbGluZXNwYyArIDJ9XQogICAgJGNhbnYgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAkY2FudnhtYXggJHltYXhdCiAgICAkY2FudjIgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQogICAgJGNhbnYzIGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgMCAkeW1heF0KfQoKcHJvYyB2aXNpYmxlcm93cyB7fSB7CiAgICBnbG9iYWwgY2FudiBudW1jb21taXRzIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgZiBbJGNhbnYgeXZpZXddCiAgICBzZXQgeTAgW2V4cHIge2ludChbbGluZGV4ICRmIDBdICogJHltYXgpfV0KICAgIHNldCByMCBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyMCA8IDB9IHsKCXNldCByMCAwCiAgICB9CiAgICBzZXQgeTEgW2V4cHIge2ludChbbGluZGV4ICRmIDFdICogJHltYXgpfV0KICAgIHNldCByMSBbZXhwciB7aW50KCgkeTEgLSAzKSAvICRsaW5lc3BjKSArIDF9XQogICAgaWYgeyRyMSA+PSAkbnVtY29tbWl0c30gewoJc2V0IHIxIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQogICAgcmV0dXJuIFtsaXN0ICRyMCAkcjFdCn0KCnByb2MgbGF5b3V0bW9yZSB7dG1heH0gewogICAgZ2xvYmFsIHJvd2xhaWRvdXQgcm93b3B0aW0gY29tbWl0aWR4IG51bWNvbW1pdHMgb3B0aW1fZGVsYXkKICAgIGdsb2JhbCB1cGFycm93bGVuIGN1cnZpZXcKCiAgICB3aGlsZSB7MX0gewoJaWYgeyRyb3dvcHRpbSAtICRvcHRpbV9kZWxheSA+ICRudW1jb21taXRzfSB7CgkgICAgc2hvd3N0dWZmIFtleHByIHskcm93b3B0aW0gLSAkb3B0aW1fZGVsYXl9XQoJfSBlbHNlaWYgeyRyb3dsYWlkb3V0IC0gJHVwYXJyb3dsZW4gLSAxID4gJHJvd29wdGltfSB7CgkgICAgc2V0IG5yIFtleHByIHskcm93bGFpZG91dCAtICR1cGFycm93bGVuIC0gMSAtICRyb3dvcHRpbX1dCgkgICAgaWYgeyRuciA+IDEwMH0gewoJCXNldCBuciAxMDAKCSAgICB9CgkgICAgb3B0aW1pemVfcm93cyAkcm93b3B0aW0gMCBbZXhwciB7JHJvd29wdGltICsgJG5yfV0KCSAgICBpbmNyIHJvd29wdGltICRucgoJfSBlbHNlaWYgeyRjb21taXRpZHgoJGN1cnZpZXcpID4gJHJvd2xhaWRvdXR9IHsKCSAgICBzZXQgbnIgW2V4cHIgeyRjb21taXRpZHgoJGN1cnZpZXcpIC0gJHJvd2xhaWRvdXR9XQoJICAgICMgbWF5IG5lZWQgdG8gaW5jcmVhc2UgdGhpcyB0aHJlc2hvbGQgaWYgdXBhcnJvd2xlbiBvcgoJICAgICMgbWluZ2FwbGVuIGFyZSBpbmNyZWFzZWQuLi4KCSAgICBpZiB7JG5yID4gMTUwfSB7CgkJc2V0IG5yIDE1MAoJICAgIH0KCSAgICBzZXQgcm93ICRyb3dsYWlkb3V0CgkgICAgc2V0IHJvd2xhaWRvdXQgW2xheW91dHJvd3MgJHJvdyBbZXhwciB7JHJvdyArICRucn1dIDBdCgkgICAgaWYgeyRyb3dsYWlkb3V0ID09ICRyb3d9IHsKCQlyZXR1cm4gMAoJICAgIH0KCX0gZWxzZSB7CgkgICAgcmV0dXJuIDAKCX0KCWlmIHskdG1heCBuZSB7fSAmJiBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICR0bWF4fSB7CgkgICAgcmV0dXJuIDEKCX0KICAgIH0KfQoKcHJvYyBzaG93c3R1ZmYge2NhbnNob3d9IHsKICAgIGdsb2JhbCBudW1jb21taXRzIGNvbW1pdHJvdyBwZW5kaW5nX3NlbGVjdCBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBsaW5lc2VnZW5kcyBpZHJvd3JhbmdlcyBpZHJhbmdlZHJhd24gY3VydmlldwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSB7CglnbG9iYWwgcGhhc2UKCXNldCBwaGFzZSAiaW5jcmRyYXciCglhbGxjYW52cyBkZWxldGUgYWxsCiAgICB9CiAgICBzZXQgcm93ICRudW1jb21taXRzCiAgICBzZXQgbnVtY29tbWl0cyAkY2Fuc2hvdwogICAgc2V0Y2FudnNjcm9sbAogICAgc2V0IHJvd3MgW3Zpc2libGVyb3dzXQogICAgc2V0IHIwIFtsaW5kZXggJHJvd3MgMF0KICAgIHNldCByMSBbbGluZGV4ICRyb3dzIDFdCiAgICBzZXQgc2Vscm93IC0xCiAgICBmb3Ige3NldCByICRyb3d9IHskciA8ICRjYW5zaG93fSB7aW5jciByfSB7Cglmb3JlYWNoIGlkIFtsaW5kZXggJGxpbmVzZWdlbmRzIFtleHByIHskcisxfV1dIHsKCSAgICBzZXQgaSAtMQoJICAgIGZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKCQlpbmNyIGkKCQlpZiB7JGUgbmUge30gJiYgJGUgPCAkbnVtY29tbWl0cyAmJiAkcyA8PSAkcjEgJiYgJGUgPj0gJHIwCgkJICAgICYmICFbaW5mbyBleGlzdHMgaWRyYW5nZWRyYXduKCRpZCwkaSldfSB7CgkJICAgIGRyYXdsaW5lc2VnICRpZCAkaQoJCSAgICBzZXQgaWRyYW5nZWRyYXduKCRpZCwkaSkgMQoJCX0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JGNhbnNob3cgPiAkcjF9IHsKCXNldCBjYW5zaG93ICRyMQogICAgfQogICAgd2hpbGUgeyRyb3cgPCAkY2Fuc2hvd30gewoJZHJhd2NtaXRyb3cgJHJvdwoJaW5jciByb3cKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdICYmCglbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCldICYmCgkkY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCkgPCAkbnVtY29tbWl0c30gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRwZW5kaW5nX3NlbGVjdCkgMQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAhW2luZm8gZXhpc3RzIHBlbmRpbmdfc2VsZWN0XX0gewoJc2VsZWN0bGluZSAwIDEKICAgIH0KfQoKcHJvYyBsYXlvdXRyb3dzIHtyb3cgZW5kcm93IGxhc3R9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCB1cGFycm93bGVuIGRvd25hcnJvd2xlbiBtYXh3aWR0aCBtaW5nYXBsZW4KICAgIGdsb2JhbCBjaGlsZGxpc3QgcGFyZW50bGlzdAogICAgZ2xvYmFsIGlkcm93cmFuZ2VzIGxpbmVzZWdlbmRzCiAgICBnbG9iYWwgY29tbWl0aWR4IGN1cnZpZXcKICAgIGdsb2JhbCBpZGlubGlzdCByb3djaGsgcm93cmFuZ2VsaXN0CgogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KICAgIHdoaWxlIHskcm93IDwgJGVuZHJvd30gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJc2V0IG9sZG9sZHMge30KCXNldCBuZXdvbGRzIHt9Cglmb3JlYWNoIHAgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgaWRpbmxpc3QoJHApXX0gewoJCWxhcHBlbmQgbmV3b2xkcyAkcAoJICAgIH0gZWxzZWlmIHshJGlkaW5saXN0KCRwKX0gewoJCWxhcHBlbmQgb2xkb2xkcyAkcAoJICAgIH0KCX0KCXNldCBsc2Uge30KCXNldCBuZXYgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdICsgW2xsZW5ndGggJG5ld29sZHNdCgkJICAgICAgICsgW2xsZW5ndGggJG9sZG9sZHNdIC0gJG1heHdpZHRoICsgMX1dCglpZiB7JG5ldiA+IDB9IHsKCSAgICBpZiB7ISRsYXN0ICYmCgkJJHJvdyArICR1cGFycm93bGVuICsgJG1pbmdhcGxlbiA+PSAkY29tbWl0aWR4KCRjdXJ2aWV3KX0gYnJlYWsKCSAgICBmb3Ige3NldCB4IFtsbGVuZ3RoICRpZGxpc3RdfSB7W2luY3IgeCAtMV0gPj0gMH0ge30gewoJCXNldCBpIFtsaW5kZXggJGlkbGlzdCAkeF0KCQlpZiB7IVtpbmZvIGV4aXN0cyByb3djaGsoJGkpXSB8fCAkcm93ID49ICRyb3djaGsoJGkpfSB7CgkJICAgIHNldCByIFt1c2VkaW5yYW5nZSAkaSBbZXhwciB7JHJvdyAtICRkb3duYXJyb3dsZW59XSBcCgkJCSAgICAgICBbZXhwciB7JHJvdyArICR1cGFycm93bGVuICsgJG1pbmdhcGxlbn1dXQoJCSAgICBpZiB7JHIgPT0gMH0gewoJCQlzZXQgaWRsaXN0IFtscmVwbGFjZSAkaWRsaXN0ICR4ICR4XQoJCQlzZXQgb2ZmcyBbbHJlcGxhY2UgJG9mZnMgJHggJHhdCgkJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkeCAxXQoJCQlzZXQgaWRpbmxpc3QoJGkpIDAKCQkJc2V0IHJtMSBbZXhwciB7JHJvdyAtIDF9XQoJCQlsYXBwZW5kIGxzZSAkaQoJCQlsYXBwZW5kIGlkcm93cmFuZ2VzKCRpKSAkcm0xCgkJCWlmIHtbaW5jciBuZXYgLTFdIDw9IDB9IGJyZWFrCgkJCWNvbnRpbnVlCgkJICAgIH0KCQkgICAgc2V0IHJvd2NoaygkaWQpIFtleHByIHskcm93ICsgJHJ9XQoJCX0KCSAgICB9CgkgICAgbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0CgkgICAgbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKCX0KCWxhcHBlbmQgbGluZXNlZ2VuZHMgJGxzZQoJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgJGlkbGlzdCAkaWRdCglpZiB7JGNvbCA8IDB9IHsKCSAgICBzZXQgY29sIFtsbGVuZ3RoICRpZGxpc3RdCgkgICAgbGFwcGVuZCBpZGxpc3QgJGlkCgkgICAgbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0CgkgICAgc2V0IHoge30KCSAgICBpZiB7W2xpbmRleCAkY2hpbGRsaXN0ICRyb3ddIG5lIHt9fSB7CgkJc2V0IHogW2V4cHIge1tsbGVuZ3RoIFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdy0xfV1dXSAtICRjb2x9XQoJCXVuc2V0IGlkaW5saXN0KCRpZCkKCSAgICB9CgkgICAgbGFwcGVuZCBvZmZzICR6CgkgICAgbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKCSAgICBpZiB7JHogbmUge319IHsKCQltYWtldXBhcnJvdyAkaWQgJGNvbCAkcm93ICR6CgkgICAgfQoJfSBlbHNlIHsKCSAgICB1bnNldCBpZGlubGlzdCgkaWQpCgl9CglzZXQgcmFuZ2VzIHt9CglpZiB7W2luZm8gZXhpc3RzIGlkcm93cmFuZ2VzKCRpZCldfSB7CgkgICAgc2V0IHJhbmdlcyAkaWRyb3dyYW5nZXMoJGlkKQoJICAgIGxhcHBlbmQgcmFuZ2VzICRyb3cKCSAgICB1bnNldCBpZHJvd3JhbmdlcygkaWQpCgl9CglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkcmFuZ2VzCglpbmNyIHJvdwoJc2V0IG9mZnMgW250aW1lcyBbbGxlbmd0aCAkaWRsaXN0XSAwXQoJc2V0IGwgW2xsZW5ndGggJG5ld29sZHNdCglzZXQgaWRsaXN0IFtldmFsIGxyZXBsYWNlIFwkaWRsaXN0ICRjb2wgJGNvbCAkbmV3b2xkc10KCXNldCBvIDAKCWlmIHskbCAhPSAxfSB7CgkgICAgc2V0IG9mZnMgW2xyYW5nZSAkb2ZmcyAwIFtleHByIHskY29sIC0gMX1dXQoJICAgIGZvcmVhY2ggeCAkbmV3b2xkcyB7CgkJbGFwcGVuZCBvZmZzIHt9CgkJaW5jciBvIC0xCgkgICAgfQoJICAgIGluY3IgbwoJICAgIHNldCB0bXAgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdIC0gW2xsZW5ndGggJG9mZnNdfV0KCSAgICBpZiB7JHRtcCA+IDB9IHsKCQlzZXQgb2ZmcyBbY29uY2F0ICRvZmZzIFtudGltZXMgJHRtcCAkb11dCgkgICAgfQoJfSBlbHNlIHsKCSAgICBsc2V0IG9mZnMgJGNvbCB7fQoJfQoJZm9yZWFjaCBpICRuZXdvbGRzIHsKCSAgICBzZXQgaWRpbmxpc3QoJGkpIDEKCSAgICBzZXQgaWRyb3dyYW5nZXMoJGkpICRyb3cKCX0KCWluY3IgY29sICRsCglmb3JlYWNoIG9pZCAkb2xkb2xkcyB7CgkgICAgc2V0IGlkaW5saXN0KCRvaWQpIDEKCSAgICBzZXQgaWRsaXN0IFtsaW5zZXJ0ICRpZGxpc3QgJGNvbCAkb2lkXQoJICAgIHNldCBvZmZzIFtsaW5zZXJ0ICRvZmZzICRjb2wgJG9dCgkgICAgbWFrZXVwYXJyb3cgJG9pZCAkY29sICRyb3cgJG8KCSAgICBpbmNyIGNvbAoJfQoJbGFwcGVuZCByb3dpZGxpc3QgJGlkbGlzdAoJbGFwcGVuZCByb3dvZmZzZXRzICRvZmZzCiAgICB9CiAgICByZXR1cm4gJHJvdwp9Cgpwcm9jIGFkZGV4dHJhaWQge2lkIHJvd30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBjb21taXRyb3cgY29tbWl0aW5mbwogICAgZ2xvYmFsIGNvbW1pdGlkeCBjb21taXRsaXN0ZWQKICAgIGdsb2JhbCBwYXJlbnRsaXN0IGNoaWxkbGlzdCBjaGlsZHJlbiBjdXJ2aWV3CgogICAgaW5jciBjb21taXRpZHgoJGN1cnZpZXcpCiAgICBsYXBwZW5kIGRpc3BsYXlvcmRlciAkaWQKICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkIDAKICAgIGxhcHBlbmQgcGFyZW50bGlzdCB7fQogICAgc2V0IGNvbW1pdHJvdygkY3VydmlldywkaWQpICRyb3cKICAgIHJlYWRjb21taXQgJGlkCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkY3VydmlldywkaWQpXX0gewoJc2V0IGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkge30KICAgIH0KICAgIGxhcHBlbmQgY2hpbGRsaXN0ICRjaGlsZHJlbigkY3VydmlldywkaWQpCn0KCnByb2MgbGF5b3V0dGFpbCB7fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgaWRpbmxpc3QgY29tbWl0aWR4IGN1cnZpZXcKICAgIGdsb2JhbCBpZHJvd3JhbmdlcyByb3dyYW5nZWxpc3QKCiAgICBzZXQgcm93ICRjb21taXRpZHgoJGN1cnZpZXcpCiAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgd2hpbGUgeyRpZGxpc3QgbmUge319IHsKCXNldCBjb2wgW2V4cHIge1tsbGVuZ3RoICRpZGxpc3RdIC0gMX1dCglzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCglhZGRleHRyYWlkICRpZCAkcm93Cgl1bnNldCBpZGlubGlzdCgkaWQpCglsYXBwZW5kIGlkcm93cmFuZ2VzKCRpZCkgJHJvdwoJbGFwcGVuZCByb3dyYW5nZWxpc3QgJGlkcm93cmFuZ2VzKCRpZCkKCXVuc2V0IGlkcm93cmFuZ2VzKCRpZCkKCWluY3Igcm93CglzZXQgb2ZmcyBbbnRpbWVzICRjb2wgMF0KCXNldCBpZGxpc3QgW2xyZXBsYWNlICRpZGxpc3QgJGNvbCAkY29sXQoJbGFwcGVuZCByb3dpZGxpc3QgJGlkbGlzdAoJbGFwcGVuZCByb3dvZmZzZXRzICRvZmZzCiAgICB9CgogICAgZm9yZWFjaCBpZCBbYXJyYXkgbmFtZXMgaWRpbmxpc3RdIHsKCWFkZGV4dHJhaWQgJGlkICRyb3cKCWxzZXQgcm93aWRsaXN0ICRyb3cgW2xpc3QgJGlkXQoJbHNldCByb3dvZmZzZXRzICRyb3cgMAoJbWFrZXVwYXJyb3cgJGlkIDAgJHJvdyAwCglsYXBwZW5kIGlkcm93cmFuZ2VzKCRpZCkgJHJvdwoJbGFwcGVuZCByb3dyYW5nZWxpc3QgJGlkcm93cmFuZ2VzKCRpZCkKCXVuc2V0IGlkcm93cmFuZ2VzKCRpZCkKCWluY3Igcm93CglsYXBwZW5kIHJvd2lkbGlzdCB7fQoJbGFwcGVuZCByb3dvZmZzZXRzIHt9CiAgICB9Cn0KCnByb2MgaW5zZXJ0X3BhZCB7cm93IGNvbCBucGFkfSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMKCiAgICBzZXQgcGFkIFtudGltZXMgJG5wYWQge31dCiAgICBsc2V0IHJvd2lkbGlzdCAkcm93IFtldmFsIGxpbnNlcnQgW2xpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXSAkY29sICRwYWRdCiAgICBzZXQgdG1wIFtldmFsIGxpbnNlcnQgW2xpc3QgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XV0gJGNvbCAkcGFkXQogICAgbHNldCByb3dvZmZzZXRzICRyb3cgW2luY3JhbmdlICR0bXAgW2V4cHIgeyRjb2wgKyAkbnBhZH1dIFtleHByIHstJG5wYWR9XV0KfQoKcHJvYyBvcHRpbWl6ZV9yb3dzIHtyb3cgY29sIGVuZHJvd30gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGlkcm93cmFuZ2VzIGRpc3BsYXlvcmRlcgoKICAgIGZvciB7fSB7JHJvdyA8ICRlbmRyb3d9IHtpbmNyIHJvd30gewoJc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KCXNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KCXNldCBoYXNwYWQgMAoJZm9yIHt9IHskY29sIDwgW2xsZW5ndGggJG9mZnNdfSB7aW5jciBjb2x9IHsKCSAgICBpZiB7W2xpbmRleCAkaWRsaXN0ICRjb2xdIGVxIHt9fSB7CgkJc2V0IGhhc3BhZCAxCgkJY29udGludWUKCSAgICB9CgkgICAgc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQoJICAgIGlmIHskeiBlcSB7fX0gY29udGludWUKCSAgICBzZXQgaXNhcnJvdyAwCgkgICAgc2V0IHgwIFtleHByIHskY29sICsgJHp9XQoJICAgIHNldCB5MCBbZXhwciB7JHJvdyAtIDF9XQoJICAgIHNldCB6MCBbbGluZGV4ICRyb3dvZmZzZXRzICR5MCAkeDBdCgkgICAgaWYgeyR6MCBlcSB7fX0gewoJCXNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KCQlzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQoJCWlmIHskcmFuZ2VzIG5lIHt9ICYmICR5MCA+IFtsaW5kZXggJHJhbmdlcyAwXX0gewoJCSAgICBzZXQgaXNhcnJvdyAxCgkJfQoJICAgIH0KCSAgICBpZiB7JHogPCAtMSB8fCAoJHogPCAwICYmICRpc2Fycm93KX0gewoJCXNldCBucGFkIFtleHByIHstMSAtICR6ICsgJGlzYXJyb3d9XQoJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkY29sICRucGFkXQoJCWluc2VydF9wYWQgJHkwICR4MCAkbnBhZAoJCWlmIHskeTAgPiAwfSB7CgkJICAgIG9wdGltaXplX3Jvd3MgJHkwICR4MCAkcm93CgkJfQoJCXNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCQlzZXQgeDAgW2V4cHIgeyRjb2wgKyAken1dCgkJc2V0IHowIFtsaW5kZXggJHJvd29mZnNldHMgJHkwICR4MF0KCSAgICB9IGVsc2VpZiB7JHogPiAxIHx8ICgkeiA+IDAgJiYgJGlzYXJyb3cpfSB7CgkJc2V0IG5wYWQgW2V4cHIgeyR6IC0gMSArICRpc2Fycm93fV0KCQlzZXQgeTEgW2V4cHIgeyRyb3cgKyAxfV0KCQlzZXQgb2ZmczIgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTFdCgkJc2V0IHgxIC0xCgkJZm9yZWFjaCB6ICRvZmZzMiB7CgkJICAgIGluY3IgeDEKCQkgICAgaWYgeyR6IGVxIHt9IHx8ICR4MSArICR6IDwgJGNvbH0gY29udGludWUKCQkgICAgaWYgeyR4MSArICR6ID4gJGNvbH0gewoJCQlpbmNyIG5wYWQKCQkgICAgfQoJCSAgICBsc2V0IHJvd29mZnNldHMgJHkxIFtpbmNyYW5nZSAkb2ZmczIgJHgxICRucGFkXQoJCSAgICBicmVhawoJCX0KCQlzZXQgcGFkIFtudGltZXMgJG5wYWQge31dCgkJc2V0IGlkbGlzdCBbZXZhbCBsaW5zZXJ0IFwkaWRsaXN0ICRjb2wgJHBhZF0KCQlzZXQgdG1wIFtldmFsIGxpbnNlcnQgXCRvZmZzICRjb2wgJHBhZF0KCQlpbmNyIGNvbCAkbnBhZAoJCXNldCBvZmZzIFtpbmNyYW5nZSAkdG1wICRjb2wgW2V4cHIgey0kbnBhZH1dXQoJCXNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCQlzZXQgaGFzcGFkIDEKCSAgICB9CgkgICAgaWYgeyR6MCBlcSB7fSAmJiAhJGlzYXJyb3d9IHsKCQkjIHRoaXMgbGluZSBsaW5rcyB0byBpdHMgZmlyc3QgY2hpbGQgb24gcm93ICRyb3ctMgoJCXNldCBybTIgW2V4cHIgeyRyb3cgLSAyfV0KCQlzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRybTJdCgkJc2V0IHhjIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJtMl0gJGlkXQoJCWlmIHskeGMgPj0gMH0gewoJCSAgICBzZXQgejAgW2V4cHIgeyR4YyAtICR4MH1dCgkJfQoJICAgIH0KCSAgICBpZiB7JHowIG5lIHt9ICYmICR6IDwgMCAmJiAkejAgPiAwfSB7CgkJaW5zZXJ0X3BhZCAkeTAgJHgwIDEKCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJG9mZnMgJGNvbCAxXQoJCW9wdGltaXplX3Jvd3MgJHkwIFtleHByIHskeDAgKyAxfV0gJHJvdwoJICAgIH0KCX0KCWlmIHshJGhhc3BhZH0gewoJICAgIHNldCBvIHt9CgkgICAgZm9yIHtzZXQgY29sIFtsbGVuZ3RoICRpZGxpc3RdfSB7W2luY3IgY29sIC0xXSA+PSAwfSB7fSB7CgkJc2V0IG8gW2xpbmRleCAkb2ZmcyAkY29sXQoJCWlmIHskbyBlcSB7fX0gewoJCSAgICAjIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxpbmsgdG8gdGhlIGZpcnN0IGNoaWxkCgkJICAgIHNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KCQkgICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KCQkgICAgaWYgeyRyYW5nZXMgbmUge30gJiYgJHJvdyA9PSBbbGluZGV4ICRyYW5nZXMgMF19IHsKCQkJIyBpdCBpcywgd29yayBvdXQgb2Zmc2V0IHRvIGNoaWxkCgkJCXNldCB5MCBbZXhwciB7JHJvdyAtIDF9XQoJCQlzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICR5MF0KCQkJc2V0IHgwIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHkwXSAkaWRdCgkJCWlmIHskeDAgPj0gMH0gewoJCQkgICAgc2V0IG8gW2V4cHIgeyR4MCAtICRjb2x9XQoJCQl9CgkJICAgIH0KCQl9CgkJaWYgeyRvIGVxIHt9IHx8ICRvIDw9IDB9IGJyZWFrCgkgICAgfQoJICAgIGlmIHskbyBuZSB7fSAmJiBbaW5jciBjb2xdIDwgW2xsZW5ndGggJGlkbGlzdF19IHsKCQlzZXQgeTEgW2V4cHIgeyRyb3cgKyAxfV0KCQlzZXQgb2ZmczIgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTFdCgkJc2V0IHgxIC0xCgkJZm9yZWFjaCB6ICRvZmZzMiB7CgkJICAgIGluY3IgeDEKCQkgICAgaWYgeyR6IGVxIHt9IHx8ICR4MSArICR6IDwgJGNvbH0gY29udGludWUKCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAxXQoJCSAgICBicmVhawoJCX0KCQlzZXQgaWRsaXN0IFtsaW5zZXJ0ICRpZGxpc3QgJGNvbCB7fV0KCQlzZXQgdG1wIFtsaW5zZXJ0ICRvZmZzICRjb2wge31dCgkJaW5jciBjb2wKCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIC0xXQoJICAgIH0KCX0KCWxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJbHNldCByb3dvZmZzZXRzICRyb3cgJG9mZnMKCXNldCBjb2wgMAogICAgfQp9Cgpwcm9jIHhjIHtyb3cgY29sfSB7CiAgICBnbG9iYWwgY2FudngwIGxpbmVzcGMKICAgIHJldHVybiBbZXhwciB7JGNhbnZ4MCArICRjb2wgKiAkbGluZXNwY31dCn0KCnByb2MgeWMge3Jvd30gewogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjCiAgICByZXR1cm4gW2V4cHIgeyRjYW52eTAgKyAkcm93ICogJGxpbmVzcGN9XQp9Cgpwcm9jIGxpbmV3aWR0aCB7aWR9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZSBsdGhpY2tuZXNzCgogICAgc2V0IHdpZCAkbHRoaWNrbmVzcwogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV0gJiYgJGlkIGVxICR0aGlja2VybGluZX0gewoJc2V0IHdpZCBbZXhwciB7MiAqICRsdGhpY2tuZXNzfV0KICAgIH0KICAgIHJldHVybiAkd2lkCn0KCnByb2Mgcm93cmFuZ2VzIHtpZH0gewogICAgZ2xvYmFsIHBoYXNlIGlkcm93cmFuZ2VzIGNvbW1pdHJvdyByb3dsYWlkb3V0IHJvd3JhbmdlbGlzdCBjdXJ2aWV3CgogICAgc2V0IHJhbmdlcyB7fQogICAgaWYgeyRwaGFzZSBlcSB7fSB8fAoJKFtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KCSAmJiAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgPCAkcm93bGFpZG91dCl9IHsKCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV19IHsKCXNldCByYW5nZXMgJGlkcm93cmFuZ2VzKCRpZCkKICAgIH0KICAgIHJldHVybiAkcmFuZ2VzCn0KCnByb2MgZHJhd2xpbmVzZWcge2lkIGl9IHsKICAgIGdsb2JhbCByb3dvZmZzZXRzIHJvd2lkbGlzdAogICAgZ2xvYmFsIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIGNhbnYgY29sb3JtYXAgbGluZXNwYwogICAgZ2xvYmFsIG51bWNvbW1pdHMgY29tbWl0cm93IGN1cnZpZXcKCiAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQogICAgc2V0IGRvd25hcnJvdyAxCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXQoJJiYgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDwgJG51bWNvbW1pdHN9IHsKCXNldCBkb3duYXJyb3cgW2V4cHIgeyRpIDwgW2xsZW5ndGggJHJhbmdlc10gLyAyIC0gMX1dCiAgICB9IGVsc2UgewoJc2V0IGRvd25hcnJvdyAxCiAgICB9CiAgICBzZXQgc3RhcnRyb3cgW2xpbmRleCAkcmFuZ2VzIFtleHByIHsyICogJGl9XV0KICAgIHNldCByb3cgW2xpbmRleCAkcmFuZ2VzIFtleHByIHsyICogJGkgKyAxfV1dCiAgICBpZiB7JHN0YXJ0cm93ID09ICRyb3d9IHJldHVybgogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgY29vcmRzIHt9CiAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGlkXQogICAgaWYgeyRjb2wgPCAwfSB7CglwdXRzICJvb3BzOiBkcmF3bGluZTogaWQgJGlkIG5vdCBvbiByb3cgJHJvdyIKCXJldHVybgogICAgfQogICAgc2V0IGxhc3RvIHt9CiAgICBzZXQgbnMgMAogICAgd2hpbGUgezF9IHsKCXNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHJvdyAkY29sXQoJaWYgeyRvIGVxIHt9fSBicmVhawoJaWYgeyRvIG5lICRsYXN0b30gewoJICAgICMgY2hhbmdpbmcgZGlyZWN0aW9uCgkgICAgc2V0IHggW3hjICRyb3cgJGNvbF0KCSAgICBzZXQgeSBbeWMgJHJvd10KCSAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQoJICAgIHNldCBsYXN0byAkbwoJfQoJaW5jciBjb2wgJG8KCWluY3Igcm93IC0xCiAgICB9CiAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQogICAgc2V0IHkgW3ljICRyb3ddCiAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQogICAgaWYgeyRpID09IDB9IHsKCSMgZHJhdyB0aGUgbGluayB0byB0aGUgZmlyc3QgY2hpbGQgYXMgcGFydCBvZiB0aGlzIGxpbmUKCWluY3Igcm93IC0xCglzZXQgY2hpbGQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglzZXQgY2NvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRjaGlsZF0KCWlmIHskY2NvbCA+PSAwfSB7CgkgICAgc2V0IHggW3hjICRyb3cgJGNjb2xdCgkgICAgc2V0IHkgW3ljICRyb3ddCgkgICAgaWYgeyRjY29sIDwgJGNvbCAtIDF9IHsKCQlsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGNvbCAtIDF9XV0gW3ljICRyb3ddCgkgICAgfSBlbHNlaWYgeyRjY29sID4gJGNvbCArIDF9IHsKCQlsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGNvbCArIDF9XV0gW3ljICRyb3ddCgkgICAgfQoJICAgIGxhcHBlbmQgY29vcmRzICR4ICR5Cgl9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGNvb3Jkc10gPCA0fSByZXR1cm4KICAgIGlmIHskZG93bmFycm93fSB7CgkjIFRoaXMgbGluZSBoYXMgYW4gYXJyb3cgYXQgdGhlIGxvd2VyIGVuZDogY2hlY2sgaWYgdGhlIGFycm93IGlzCgkjIG9uIGEgZGlhZ29uYWwgc2VnbWVudCwgYW5kIGlmIHNvLCB3b3JrIGFyb3VuZCB0aGUgVGsgOC40CgkjIHJlZnVzYWwgdG8gZHJhdyBhcnJvd3Mgb24gZGlhZ29uYWwgbGluZXMuCglzZXQgeDAgW2xpbmRleCAkY29vcmRzIDBdCglzZXQgeDEgW2xpbmRleCAkY29vcmRzIDJdCglpZiB7JHgwICE9ICR4MX0gewoJICAgIHNldCB5MCBbbGluZGV4ICRjb29yZHMgMV0KCSAgICBzZXQgeTEgW2xpbmRleCAkY29vcmRzIDNdCgkgICAgaWYgeyR5MCAtICR5MSA8PSAyICogJGxpbmVzcGMgJiYgJHgxID09IFtsaW5kZXggJGNvb3JkcyA0XX0gewoJCSMgd2UgaGF2ZSBhIG5lYXJieSB2ZXJ0aWNhbCBzZWdtZW50LCBqdXN0IHRyaW0gb2ZmIHRoZSBkaWFnIGJpdAoJCXNldCBjb29yZHMgW2xyYW5nZSAkY29vcmRzIDIgZW5kXQoJICAgIH0gZWxzZSB7CgkJc2V0IHNsb3BlIFtleHByIHsoJHgwIC0gJHgxKSAvICgkeTAgLSAkeTEpfV0KCQlzZXQgeGkgW2V4cHIgeyR4MCAtICRzbG9wZSAqICRsaW5lc3BjIC8gMn1dCgkJc2V0IHlpIFtleHByIHskeTAgLSAkbGluZXNwYyAvIDJ9XQoJCXNldCBjb29yZHMgW2xyZXBsYWNlICRjb29yZHMgMCAxICR4aSAkeTAgJHhpICR5aV0KCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgYXJyb3cgW2V4cHIgezIgKiAoJGkgPiAwKSArICRkb3duYXJyb3d9XQogICAgc2V0IGFycm93IFtsaW5kZXgge25vbmUgZmlyc3QgbGFzdCBib3RofSAkYXJyb3ddCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtd2lkdGggW2xpbmV3aWR0aCAkaWRdIFwKCSAgICAgICAtZmlsbCAkY29sb3JtYXAoJGlkKSAtdGFncyBsaW5lcy4kaWQgLWFycm93ICRhcnJvd10KICAgICRjYW52IGxvd2VyICR0CiAgICBiaW5kbGluZSAkdCAkaWQKfQoKcHJvYyBkcmF3cGFyZW50bGlua3Mge2lkIHJvdyBjb2wgb2xkc30gewogICAgZ2xvYmFsIHJvd2lkbGlzdCBjYW52IGNvbG9ybWFwCgogICAgc2V0IHJvdzIgW2V4cHIgeyRyb3cgKyAxfV0KICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCiAgICBzZXQgeSBbeWMgJHJvd10KICAgIHNldCB5MiBbeWMgJHJvdzJdCiAgICBzZXQgaWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93Ml0KICAgICMgcm14ID0gcmlnaHQtbW9zdCBYIGNvb3JkIHVzZWQKICAgIHNldCBybXggMAogICAgZm9yZWFjaCBwICRvbGRzIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRzICRwXQoJaWYgeyRpIDwgMH0gewoJICAgIHB1dHMgIm9vcHMsIHBhcmVudCAkcCBvZiAkaWQgbm90IGluIGxpc3QiCgkgICAgY29udGludWUKCX0KCXNldCB4MiBbeGMgJHJvdzIgJGldCglpZiB7JHgyID4gJHJteH0gewoJICAgIHNldCBybXggJHgyCgl9CglzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJHBdCglpZiB7JHJhbmdlcyBuZSB7fSAmJiAkcm93MiA9PSBbbGluZGV4ICRyYW5nZXMgMF0KCSAgICAmJiAkcm93MiA8IFtsaW5kZXggJHJhbmdlcyAxXX0gewoJICAgICMgZHJhd2xpbmVzZWcgd2lsbCBkbyB0aGlzIG9uZSBmb3IgdXMKCSAgICBjb250aW51ZQoJfQoJYXNzaWduY29sb3IgJHAKCSMgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGVkIHBhcmVudHMgaGVyZS4uLgoJc2V0IGNvb3JkcyBbbGlzdCAkeCAkeV0KCWlmIHskaSA8ICRjb2wgLSAxfSB7CgkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRpICsgMX1dXSAkeQoJfSBlbHNlaWYgeyRpID4gJGNvbCArIDF9IHsKCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGkgLSAxfV1dICR5Cgl9CglsYXBwZW5kIGNvb3JkcyAkeDIgJHkyCglzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtd2lkdGggW2xpbmV3aWR0aCAkcF0gXAoJCSAgIC1maWxsICRjb2xvcm1hcCgkcCkgLXRhZ3MgbGluZXMuJHBdCgkkY2FudiBsb3dlciAkdAoJYmluZGxpbmUgJHQgJHAKICAgIH0KICAgIHJldHVybiAkcm14Cn0KCnByb2MgZHJhd2xpbmVzIHtpZH0gewogICAgZ2xvYmFsIGNvbG9ybWFwIGNhbnYKICAgIGdsb2JhbCBpZHJhbmdlZHJhd24KICAgIGdsb2JhbCBjaGlsZHJlbiBpZGRyYXduIGNvbW1pdHJvdyByb3dpZGxpc3QgY3VydmlldwoKICAgICRjYW52IGRlbGV0ZSBsaW5lcy4kaWQKICAgIHNldCBuciBbZXhwciB7W2xsZW5ndGggW3Jvd3JhbmdlcyAkaWRdXSAvIDJ9XQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnJ9IHtpbmNyIGl9IHsKCWlmIHtbaW5mbyBleGlzdHMgaWRyYW5nZWRyYXduKCRpZCwkaSldfSB7CgkgICAgZHJhd2xpbmVzZWcgJGlkICRpCgl9CiAgICB9CiAgICBmb3JlYWNoIGNoaWxkICRjaGlsZHJlbigkY3VydmlldywkaWQpIHsKCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkY2hpbGQpXX0gewoJICAgIHNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpCgkgICAgc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRjaGlsZF0KCSAgICBpZiB7JGNvbCA+PSAwfSB7CgkJZHJhd3BhcmVudGxpbmtzICRjaGlsZCAkcm93ICRjb2wgW2xpc3QgJGlkXQoJICAgIH0KCX0KICAgIH0KfQoKcHJvYyBkcmF3Y21pdHRleHQge2lkIHJvdyBjb2wgcm14fSB7CiAgICBnbG9iYWwgbGluZXNwYyBjYW52IGNhbnYyIGNhbnYzIGNhbnZ5MCBmZ2NvbG9yCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIGNvbW1pdGluZm8gcm93aWRsaXN0CiAgICBnbG9iYWwgcm93dGV4dHggaWRwb3MgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKICAgIGdsb2JhbCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIG1haW5mb250IGNhbnZ4bWF4IGJvbGRyb3dzIGJvbGRuYW1lcm93cyBmZ2NvbG9yCgogICAgc2V0IG9maWxsIFtleHByIHtbbGluZGV4ICRjb21taXRsaXN0ZWQgJHJvd10/ICJibHVlIjogIndoaXRlIn1dCiAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQogICAgc2V0IHkgW3ljICRyb3ddCiAgICBzZXQgb3JhZCBbZXhwciB7JGxpbmVzcGMgLyAzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgb3ZhbCBbZXhwciB7JHggLSAkb3JhZH1dIFtleHByIHskeSAtICRvcmFkfV0gXAoJICAgICAgIFtleHByIHskeCArICRvcmFkIC0gMX1dIFtleHByIHskeSArICRvcmFkIC0gMX1dIFwKCSAgICAgICAtZmlsbCAkb2ZpbGwgLW91dGxpbmUgJGZnY29sb3IgLXdpZHRoIDEgLXRhZ3MgY2lyY2xlXQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCB4dCBbeGMgJHJvdyBbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dXQogICAgaWYgeyR4dCA8ICRybXh9IHsKCXNldCB4dCAkcm14CiAgICB9CiAgICBzZXQgcm93dGV4dHgoJHJvdykgJHh0CiAgICBzZXQgaWRwb3MoJGlkKSBbbGlzdCAkeCAkeHQgJHldCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXQoJfHwgW2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeHQgW2RyYXd0YWdzICRpZCAkeCAkeHQgJHldCiAgICB9CiAgICBzZXQgaGVhZGxpbmUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDBdCiAgICBzZXQgbmFtZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMV0KICAgIHNldCBkYXRlIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAyXQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgJGRhdGVdCiAgICBzZXQgZm9udCAkbWFpbmZvbnQKICAgIHNldCBuZm9udCAkbWFpbmZvbnQKICAgIHNldCBpc2JvbGQgW2lzaGlnaGxpZ2h0ZWQgJHJvd10KICAgIGlmIHskaXNib2xkID4gMH0gewoJbGFwcGVuZCBib2xkcm93cyAkcm93CglsYXBwZW5kIGZvbnQgYm9sZAoJaWYgeyRpc2JvbGQgPiAxfSB7CgkgICAgbGFwcGVuZCBib2xkbmFtZXJvd3MgJHJvdwoJICAgIGxhcHBlbmQgbmZvbnQgYm9sZAoJfQogICAgfQogICAgc2V0IGxpbmVodGFnKCRyb3cpIFskY2FudiBjcmVhdGUgdGV4dCAkeHQgJHkgLWFuY2hvciB3IC1maWxsICRmZ2NvbG9yIFwKCQkJICAgIC10ZXh0ICRoZWFkbGluZSAtZm9udCAkZm9udCAtdGFncyB0ZXh0XQogICAgJGNhbnYgYmluZCAkbGluZWh0YWcoJHJvdykgPEJ1dHRvbi0zPiAicm93bWVudSAlWCAlWSAkaWQiCiAgICBzZXQgbGluZW50YWcoJHJvdykgWyRjYW52MiBjcmVhdGUgdGV4dCAzICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCgkJCSAgICAtdGV4dCAkbmFtZSAtZm9udCAkbmZvbnQgLXRhZ3MgdGV4dF0KICAgIHNldCBsaW5lZHRhZygkcm93KSBbJGNhbnYzIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IC1maWxsICRmZ2NvbG9yIFwKCQkJICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udCAtdGFncyB0ZXh0XQogICAgc2V0IHhyIFtleHByIHskeHQgKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkaGVhZGxpbmVdfV0KICAgIGlmIHskeHIgPiAkY2FudnhtYXh9IHsKCXNldCBjYW52eG1heCAkeHIKCXNldGNhbnZzY3JvbGwKICAgIH0KfQoKcHJvYyBkcmF3Y21pdHJvdyB7cm93fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHJvd2lkbGlzdAogICAgZ2xvYmFsIGlkcmFuZ2VkcmF3biBpZGRyYXduCiAgICBnbG9iYWwgY29tbWl0aW5mbyBwYXJlbnRsaXN0IG51bWNvbW1pdHMKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZpbmRzdHJpbmcgbmhpZ2hsaWdodHMKICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMKICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZCByaGlnaGxpZ2h0cwoKICAgIGlmIHskcm93ID49ICRudW1jb21taXRzfSByZXR1cm4KICAgIGZvcmVhY2ggaWQgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddIHsKCWlmIHskaWQgZXEge319IGNvbnRpbnVlCglzZXQgaSAtMQoJZm9yZWFjaCB7cyBlfSBbcm93cmFuZ2VzICRpZF0gewoJICAgIGluY3IgaQoJICAgIGlmIHskcm93IDwgJHN9IGNvbnRpbnVlCgkgICAgaWYgeyRlIGVxIHt9fSBicmVhawoJICAgIGlmIHskcm93IDw9ICRlfSB7CgkJaWYgeyRlIDwgJG51bWNvbW1pdHMgJiYgIVtpbmZvIGV4aXN0cyBpZHJhbmdlZHJhd24oJGlkLCRpKV19IHsKCQkgICAgZHJhd2xpbmVzZWcgJGlkICRpCgkJICAgIHNldCBpZHJhbmdlZHJhd24oJGlkLCRpKSAxCgkJfQoJCWJyZWFrCgkgICAgfQoJfQogICAgfQoKICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KICAgIGlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAhW2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrdmhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XSAmJiAhW2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrZmlsZWhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYgeyRmaW5kc3RyaW5nIG5lIHt9ICYmICFbaW5mbyBleGlzdHMgbmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2tmaW5kaGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIiAmJiAhW2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrcmVsaGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHJldHVybgogICAgc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF0KICAgIGlmIHskY29sIDwgMH0gewoJcHV0cyAib29wcywgcm93ICRyb3cgaWQgJGlkIG5vdCBpbiBsaXN0IgoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CglnZXRjb21taXQgJGlkCiAgICB9CiAgICBhc3NpZ25jb2xvciAkaWQKICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJHJvd10KICAgIGlmIHskb2xkcyBuZSB7fX0gewoJc2V0IHJteCBbZHJhd3BhcmVudGxpbmtzICRpZCAkcm93ICRjb2wgJG9sZHNdCiAgICB9IGVsc2UgewoJc2V0IHJteCAwCiAgICB9CiAgICBkcmF3Y21pdHRleHQgJGlkICRyb3cgJGNvbCAkcm14CiAgICBzZXQgaWRkcmF3bigkaWQpIDEKfQoKcHJvYyBkcmF3ZnJhYyB7ZjAgZjF9IHsKICAgIGdsb2JhbCBudW1jb21taXRzIGNhbnYKICAgIGdsb2JhbCBsaW5lc3BjCgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4ID09IDB9IHJldHVybgogICAgc2V0IHkwIFtleHByIHtpbnQoJGYwICogJHltYXgpfV0KICAgIHNldCByb3cgW2V4cHIge2ludCgoJHkwIC0gMykgLyAkbGluZXNwYykgLSAxfV0KICAgIGlmIHskcm93IDwgMH0gewoJc2V0IHJvdyAwCiAgICB9CiAgICBzZXQgeTEgW2V4cHIge2ludCgkZjEgKiAkeW1heCl9XQogICAgc2V0IGVuZHJvdyBbZXhwciB7aW50KCgkeTEgLSAzKSAvICRsaW5lc3BjKSArIDF9XQogICAgaWYgeyRlbmRyb3cgPj0gJG51bWNvbW1pdHN9IHsKCXNldCBlbmRyb3cgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCiAgICB9CiAgICBmb3Ige30geyRyb3cgPD0gJGVuZHJvd30ge2luY3Igcm93fSB7CglkcmF3Y21pdHJvdyAkcm93CiAgICB9Cn0KCnByb2MgZHJhd3Zpc2libGUge30gewogICAgZ2xvYmFsIGNhbnYKICAgIGV2YWwgZHJhd2ZyYWMgWyRjYW52IHl2aWV3XQp9Cgpwcm9jIGNsZWFyX2Rpc3BsYXkge30gewogICAgZ2xvYmFsIGlkZHJhd24gaWRyYW5nZWRyYXduCiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKCiAgICBhbGxjYW52cyBkZWxldGUgYWxsCiAgICBjYXRjaCB7dW5zZXQgaWRkcmF3bn0KICAgIGNhdGNoIHt1bnNldCBpZHJhbmdlZHJhd259CiAgICBjYXRjaCB7dW5zZXQgdmhpZ2hsaWdodHN9CiAgICBjYXRjaCB7dW5zZXQgZmhpZ2hsaWdodHN9CiAgICBjYXRjaCB7dW5zZXQgbmhpZ2hsaWdodHN9CiAgICBjYXRjaCB7dW5zZXQgcmhpZ2hsaWdodHN9Cn0KCnByb2MgZmluZGNyb3NzaW5ncyB7aWR9IHsKICAgIGdsb2JhbCByb3dpZGxpc3QgcGFyZW50bGlzdCBudW1jb21taXRzIHJvd29mZnNldHMgZGlzcGxheW9yZGVyCgogICAgc2V0IGNyb3NzIHt9CiAgICBzZXQgY2Nyb3NzIHt9CiAgICBmb3JlYWNoIHtzIGV9IFtyb3dyYW5nZXMgJGlkXSB7CglpZiB7JGUgPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgZSBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KCX0KCWlmIHskZSA8PSAkc30gY29udGludWUKCXNldCB4IFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJGVdICRpZF0KCWlmIHskeCA8IDB9IHsKCSAgICBwdXRzICJmaW5kY3Jvc3NpbmdzOiBvb3BzLCBubyBbc2hvcnRpZHMgJGlkXSBpbiByb3cgJGUiCgkgICAgY29udGludWUKCX0KCWZvciB7c2V0IHJvdyAkZX0ge1tpbmNyIHJvdyAtMV0gPj0gJHN9IHt9IHsKCSAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCgkgICAgc2V0IGtpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCSAgICBzZXQga2lkeCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRraWRdCgkgICAgaWYgeyRraWR4IDwgMH0gY29udGludWUKCSAgICBzZXQgbmV4dHJvdyBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3cgKyAxfV1dCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlzZXQgcHggW2xzZWFyY2ggLWV4YWN0ICRuZXh0cm93ICRwXQoJCWlmIHskcHggPCAwfSBjb250aW51ZQoJCWlmIHsoJGtpZHggPCAkeCAmJiAkeCA8ICRweCkgfHwgKCRweCA8ICR4ICYmICR4IDwgJGtpZHgpfSB7CgkJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGNjcm9zcyAkcF0gPj0gMH0gY29udGludWUKCQkgICAgaWYgeyR4ID09ICRweCArICgka2lkeCA8ICRweD8gLTE6IDEpfSB7CgkJCWxhcHBlbmQgY2Nyb3NzICRwCgkJICAgIH0gZWxzZWlmIHtbbHNlYXJjaCAtZXhhY3QgJGNyb3NzICRwXSA8IDB9IHsKCQkJbGFwcGVuZCBjcm9zcyAkcAoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBzZXQgaW5jIFtsaW5kZXggJHJvd29mZnNldHMgJHJvdyAkeF0KCSAgICBpZiB7JGluYyBlcSB7fX0gYnJlYWsKCSAgICBpbmNyIHggJGluYwoJfQogICAgfQogICAgcmV0dXJuIFtjb25jYXQgJGNjcm9zcyB7e319ICRjcm9zc10KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjb2xvcnMgbmV4dGNvbG9yCiAgICBnbG9iYWwgY29tbWl0cm93IHBhcmVudGxpc3QgY2hpbGRyZW4gY2hpbGRyZW4gY3VydmlldwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGlkKV19IHJldHVybgogICAgc2V0IG5jb2xvcnMgW2xsZW5ndGggJGNvbG9yc10KICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKV19IHsKCXNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCiAgICB9IGVsc2UgewoJc2V0IGtpZHMge30KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGtpZHMgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiBbbGxlbmd0aCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKV1dID09IDF9IHsKCSAgICBzZXQgY29sb3JtYXAoJGlkKSAkY29sb3JtYXAoJGNoaWxkKQoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGJhZGNvbG9ycyB7fQogICAgc2V0IG9yaWdiYWQge30KICAgIGZvcmVhY2ggeCBbZmluZGNyb3NzaW5ncyAkaWRdIHsKCWlmIHskeCBlcSB7fX0gewoJICAgICMgZGVsaW1pdGVyIGJldHdlZW4gY29ybmVyIGNyb3NzaW5ncyBhbmQgb3RoZXIgY3Jvc3NpbmdzCgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzIC0gMX0gYnJlYWsKCSAgICBzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCgl9CglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCSAgICBsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgl9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCXNldCBiYWRjb2xvcnMgJG9yaWdiYWQKICAgIH0KICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAka2lkcyB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBmb3JlYWNoIHAgW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCRjdXJ2aWV3LCRjaGlsZCldIHsKCQlpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRwKV0KCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKV0gPCAwfSB7CgkJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkcCkKCQl9CgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJfQogICAgfQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPD0gJG5jb2xvcnN9IHtpbmNyIGl9IHsKCXNldCBjIFtsaW5kZXggJGNvbG9ycyAkbmV4dGNvbG9yXQoJaWYge1tpbmNyIG5leHRjb2xvcl0gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgbmV4dGNvbG9yIDAKCX0KCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY119IGJyZWFrCiAgICB9CiAgICBzZXQgY29sb3JtYXAoJGlkKSAkYwp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIDEiCn0KCnByb2MgZHJhd3RhZ3Mge2lkIHggeHQgeTF9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcyBtYWluaGVhZAogICAgZ2xvYmFsIGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgY29tbWl0cm93IHJvd3RleHR4IGN1cnZpZXcgZmdjb2xvciBiZ2NvbG9yCgogICAgc2V0IG1hcmtzIHt9CiAgICBzZXQgbnRhZ3MgMAogICAgc2V0IG5oZWFkcyAwCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IG1hcmtzICRpZHRhZ3MoJGlkKQoJc2V0IG50YWdzIFtsbGVuZ3RoICRtYXJrc10KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZGhlYWRzKCRpZCldCglzZXQgbmhlYWRzIFtsbGVuZ3RoICRpZGhlYWRzKCRpZCldCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkb3RoZXJyZWZzKCRpZCldCiAgICB9CiAgICBpZiB7JG1hcmtzIGVxIHt9fSB7CglyZXR1cm4gJHh0CiAgICB9CgogICAgc2V0IGRlbHRhIFtleHByIHtpbnQoMC41ICogKCRsaW5lc3BjIC0gJGx0aGlja25lc3MpKX1dCiAgICBzZXQgeXQgW2V4cHIgeyR5MSAtIDAuNSAqICRsaW5lc3BjfV0KICAgIHNldCB5YiBbZXhwciB7JHl0ICsgJGxpbmVzcGMgLSAxfV0KICAgIHNldCB4dmFscyB7fQogICAgc2V0IHd2YWxzIHt9CiAgICBzZXQgaSAtMQogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHsKCWluY3IgaQoJaWYgeyRpID49ICRudGFncyAmJiAkaSA8ICRudGFncyArICRuaGVhZHMgJiYgJHRhZyBlcSAkbWFpbmhlYWR9IHsKCSAgICBzZXQgd2lkIFtmb250IG1lYXN1cmUgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0gJHRhZ10KCX0gZWxzZSB7CgkgICAgc2V0IHdpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGFnXQoJfQoJbGFwcGVuZCB4dmFscyAkeHQKCWxhcHBlbmQgd3ZhbHMgJHdpZAoJc2V0IHh0IFtleHByIHskeHQgKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3MgKyAkbGluZXNwY31dCiAgICB9CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJHggJHkxIFtsaW5kZXggJHh2YWxzIGVuZF0gJHkxIFwKCSAgICAgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgYmxhY2sgLXRhZ3MgdGFnLiRpZF0KICAgICRjYW52IGxvd2VyICR0CiAgICBmb3JlYWNoIHRhZyAkbWFya3MgeCAkeHZhbHMgd2lkICR3dmFscyB7CglzZXQgeGwgW2V4cHIgeyR4ICsgJGRlbHRhfV0KCXNldCB4ciBbZXhwciB7JHggKyAkZGVsdGEgKyAkd2lkICsgJGx0aGlja25lc3N9XQoJc2V0IGZvbnQgJG1haW5mb250CglpZiB7W2luY3IgbnRhZ3MgLTFdID49IDB9IHsKCSAgICAjIGRyYXcgYSB0YWcKCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgeyR5dCArICRkZWx0YX1dICR4bCAkeXQgXAoJCSAgICAgICAkeHIgJHl0ICR4ciAkeWIgJHhsICR5YiAkeCBbZXhwciB7JHliIC0gJGRlbHRhfV0gXAoJCSAgICAgICAtd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCB5ZWxsb3cgLXRhZ3MgdGFnLiRpZF0KCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCSAgICBzZXQgcm93dGV4dHgoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSBbZXhwciB7JHhyICsgJGxpbmVzcGN9XQoJfSBlbHNlIHsKCSAgICAjIGRyYXcgYSBoZWFkIG9yIG90aGVyIHJlZgoJICAgIGlmIHtbaW5jciBuaGVhZHMgLTFdID49IDB9IHsKCQlzZXQgY29sIGdyZWVuCgkJaWYgeyR0YWcgZXEgJG1haW5oZWFkfSB7CgkJICAgIGxhcHBlbmQgZm9udCBib2xkCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGNvbCAiI2RkZGRmZiIKCSAgICB9CgkgICAgc2V0IHhsIFtleHByIHskeGwgLSAkZGVsdGEvMn1dCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggJHl0ICR4ciAkeXQgJHhyICR5YiAkeCAkeWIgXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsICRjb2wgLXRhZ3MgdGFnLiRpZAoJICAgIGlmIHtbcmVnZXhwIHteKHJlbW90ZXMvLiovfHJlbW90ZXMvKX0gJHRhZyBtYXRjaCByZW1vdGVwcmVmaXhdfSB7CgkgICAgICAgIHNldCByd2lkIFtmb250IG1lYXN1cmUgJG1haW5mb250ICRyZW1vdGVwcmVmaXhdCgkJc2V0IHhpIFtleHByIHskeCArIDF9XQoJCXNldCB5dGkgW2V4cHIgeyR5dCArIDF9XQoJCXNldCB4cmkgW2V4cHIgeyR4ICsgJHJ3aWR9XQoJCSRjYW52IGNyZWF0ZSBwb2x5Z29uICR4aSAkeXRpICR4cmkgJHl0aSAkeHJpICR5YiAkeGkgJHliIFwKCQkJLXdpZHRoIDAgLWZpbGwgIiNmZmRkYWEiIC10YWdzIHRhZy4kaWQKCSAgICB9Cgl9CglzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHhsICR5MSAtYW5jaG9yIHcgLXRleHQgJHRhZyAtZmlsbCAkZmdjb2xvciBcCgkJICAgLWZvbnQgJGZvbnQgLXRhZ3MgW2xpc3QgdGFnLiRpZCB0ZXh0XV0KCWlmIHskbnRhZ3MgPj0gMH0gewoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJfSBlbHNlaWYgeyRuaGVhZHMgPj0gMH0gewoJICAgICRjYW52IGJpbmQgJHQgPEJ1dHRvbi0zPiBbbGlzdCBoZWFkbWVudSAlWCAlWSAkaWQgJHRhZ10KCX0KICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKcHJvYyBzaG93X3N0YXR1cyB7bXNnfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBmZ2NvbG9yCgogICAgY2xlYXJfZGlzcGxheQogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgJG1zZyAtZm9udCAkbWFpbmZvbnQgXAoJLXRhZ3MgdGV4dCAtZmlsbCAkZmdjb2xvcgp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIGNvbW1pdGlkeCBwaGFzZSBjdXJ2aWV3CiAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QKCiAgICBpZiB7JGNvbW1pdGlkeCgkY3VydmlldykgPiAwfSB7CglkcmF3cmVzdAogICAgfSBlbHNlIHsKCXNob3dfc3RhdHVzICJObyBjb21taXRzIHNlbGVjdGVkIgogICAgfQogICAgc2V0IHBoYXNlIHt9CiAgICBjYXRjaCB7dW5zZXQgcGVuZGluZ19zZWxlY3R9Cn0KCiMgSW5zZXJ0IGEgbmV3IGNvbW1pdCBhcyB0aGUgY2hpbGQgb2YgdGhlIGNvbW1pdCBvbiByb3cgJHJvdy4KIyBUaGUgbmV3IGNvbW1pdCB3aWxsIGJlIGRpc3BsYXllZCBvbiByb3cgJHJvdyBhbmQgdGhlIGNvbW1pdHMKIyBvbiB0aGF0IHJvdyBhbmQgYmVsb3cgd2lsbCBtb3ZlIGRvd24gb25lIHJvdy4KcHJvYyBpbnNlcnRyb3cge3JvdyBuZXdjbWl0fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIHBhcmVudGxpc3QgY2hpbGRsaXN0IGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIGNvbW1pdHJvdyBjdXJ2aWV3IHJvd2lkbGlzdCByb3dvZmZzZXRzIG51bWNvbW1pdHMKICAgIGdsb2JhbCByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMgcm93bGFpZG91dCByb3dvcHRpbSBudW1jb21taXRzCiAgICBnbG9iYWwgbGluZXNlZ2VuZHMgc2VsZWN0ZWRsaW5lCgogICAgaWYgeyRyb3cgPj0gJG51bWNvbW1pdHN9IHsKCXB1dHMgIm9vcHMsIGluc2VydGluZyBuZXcgcm93ICRyb3cgYnV0IG9ubHkgaGF2ZSAkbnVtY29tbWl0cyByb3dzIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgcCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KICAgIHNldCBkaXNwbGF5b3JkZXIgW2xpbnNlcnQgJGRpc3BsYXlvcmRlciAkcm93ICRuZXdjbWl0XQogICAgc2V0IHBhcmVudGxpc3QgW2xpbnNlcnQgJHBhcmVudGxpc3QgJHJvdyAkcF0KICAgIHNldCBraWRzIFtsaW5kZXggJGNoaWxkbGlzdCAkcm93XQogICAgbGFwcGVuZCBraWRzICRuZXdjbWl0CiAgICBsc2V0IGNoaWxkbGlzdCAkcm93ICRraWRzCiAgICBzZXQgY2hpbGRsaXN0IFtsaW5zZXJ0ICRjaGlsZGxpc3QgJHJvdyB7fV0KICAgIHNldCBjb21taXRsaXN0ZWQgW2xpbnNlcnQgJGNvbW1pdGxpc3RlZCAkcm93IDFdCiAgICBzZXQgbCBbbGxlbmd0aCAkZGlzcGxheW9yZGVyXQogICAgZm9yIHtzZXQgciAkcm93fSB7JHIgPCAkbH0ge2luY3Igcn0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcl0KCXNldCBjb21taXRyb3coJGN1cnZpZXcsJGlkKSAkcgogICAgfQoKICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCiAgICBzZXQgbmV3b2ZmcyB7fQogICAgZm9yZWFjaCB4ICRpZGxpc3QgewoJaWYgeyR4IGVxIHt9IHx8ICgkeCBlcSAkcCAmJiBbbGxlbmd0aCAka2lkc10gPT0gMSl9IHsKCSAgICBsYXBwZW5kIG5ld29mZnMge30KCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBuZXdvZmZzIDAKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPT0gMX0gewoJc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgJGlkbGlzdCAkcF0KCWxzZXQgaWRsaXN0ICRjb2wgJG5ld2NtaXQKICAgIH0gZWxzZSB7CglzZXQgY29sIFtsbGVuZ3RoICRpZGxpc3RdCglsYXBwZW5kIGlkbGlzdCAkbmV3Y21pdAoJbGFwcGVuZCBvZmZzIHt9Cglsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwogICAgfQogICAgc2V0IHJvd2lkbGlzdCBbbGluc2VydCAkcm93aWRsaXN0ICRyb3cgJGlkbGlzdF0KICAgIHNldCByb3dvZmZzZXRzIFtsaW5zZXJ0ICRyb3dvZmZzZXRzIFtleHByIHskcm93KzF9XSAkbmV3b2Zmc10KCiAgICBzZXQgcm93cmFuZ2VsaXN0IFtsaW5zZXJ0ICRyb3dyYW5nZWxpc3QgJHJvdyB7fV0KICAgIHNldCBsIFtsbGVuZ3RoICRyb3dyYW5nZWxpc3RdCiAgICBmb3Ige3NldCByIDB9IHskciA8ICRsfSB7aW5jciByfSB7CglzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkcl0KCWlmIHskcmFuZ2VzIG5lIHt9ICYmIFtsaW5kZXggJHJhbmdlcyBlbmRdID49ICRyb3d9IHsKCSAgICBzZXQgbmV3cmFuZ2VzIHt9CgkgICAgZm9yZWFjaCB4ICRyYW5nZXMgewoJCWlmIHskeCA+PSAkcm93fSB7CgkJICAgIGxhcHBlbmQgbmV3cmFuZ2VzIFtleHByIHskeCArIDF9XQoJCX0gZWxzZSB7CgkJICAgIGxhcHBlbmQgbmV3cmFuZ2VzICR4CgkJfQoJICAgIH0KCSAgICBsc2V0IHJvd3JhbmdlbGlzdCAkciAkbmV3cmFuZ2VzCgl9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGtpZHNdID4gMX0gewoJc2V0IHJwMSBbZXhwciB7JHJvdyArIDF9XQoJc2V0IHJhbmdlcyBbbGluZGV4ICRyb3dyYW5nZWxpc3QgJHJwMV0KCWlmIHskcmFuZ2VzIGVxIHt9fSB7CgkgICAgc2V0IHJhbmdlcyBbbGlzdCAkcm93ICRycDFdCgl9IGVsc2VpZiB7W2xpbmRleCAkcmFuZ2VzIGVuZC0xXSA9PSAkcnAxfSB7CgkgICAgbHNldCByYW5nZXMgZW5kLTEgJHJvdwoJfQoJbHNldCByb3dyYW5nZWxpc3QgJHJwMSAkcmFuZ2VzCiAgICB9CiAgICBmb3JlYWNoIGlkIFthcnJheSBuYW1lcyBpZHJvd3Jhbmdlc10gewoJc2V0IHJhbmdlcyAkaWRyb3dyYW5nZXMoJGlkKQoJaWYgeyRyYW5nZXMgbmUge30gJiYgW2xpbmRleCAkcmFuZ2VzIGVuZF0gPj0gJHJvd30gewoJICAgIHNldCBuZXdyYW5nZXMge30KCSAgICBmb3JlYWNoIHggJHJhbmdlcyB7CgkJaWYgeyR4ID49ICRyb3d9IHsKCQkgICAgbGFwcGVuZCBuZXdyYW5nZXMgW2V4cHIgeyR4ICsgMX1dCgkJfSBlbHNlIHsKCQkgICAgbGFwcGVuZCBuZXdyYW5nZXMgJHgKCQl9CgkgICAgfQoJICAgIHNldCBpZHJvd3JhbmdlcygkaWQpICRuZXdyYW5nZXMKCX0KICAgIH0KCiAgICBzZXQgbGluZXNlZ2VuZHMgW2xpbnNlcnQgJGxpbmVzZWdlbmRzICRyb3cge31dCgogICAgaW5jciByb3dsYWlkb3V0CiAgICBpbmNyIHJvd29wdGltCiAgICBpbmNyIG51bWNvbW1pdHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHNlbGVjdGVkbGluZSA+PSAkcm93fSB7CglpbmNyIHNlbGVjdGVkbGluZQogICAgfQogICAgcmVkaXNwbGF5Cn0KCiMgRG9uJ3QgY2hhbmdlIHRoZSB0ZXh0IHBhbmUgY3Vyc29yIGlmIGl0IGlzIGN1cnJlbnRseSB0aGUgaGFuZCBjdXJzb3IsCiMgc2hvd2luZyB0aGF0IHdlIGFyZSBvdmVyIGEgc2hhMSBJRCBsaW5rLgpwcm9jIHNldHRleHRjdXJzb3Ige2N9IHsKICAgIGdsb2JhbCBjdGV4dCBjdXJ0ZXh0Y3Vyc29yCgogICAgaWYge1skY3RleHQgY2dldCAtY3Vyc29yXSA9PSAkY3VydGV4dGN1cnNvcn0gewoJJGN0ZXh0IGNvbmZpZyAtY3Vyc29yICRjCiAgICB9CiAgICBzZXQgY3VydGV4dGN1cnNvciAkYwp9Cgpwcm9jIG5vd2J1c3kge3doYXR9IHsKICAgIGdsb2JhbCBpc2J1c3kKCiAgICBpZiB7W2FycmF5IG5hbWVzIGlzYnVzeV0gZXEge319IHsKCS4gY29uZmlnIC1jdXJzb3Igd2F0Y2gKCXNldHRleHRjdXJzb3Igd2F0Y2gKICAgIH0KICAgIHNldCBpc2J1c3koJHdoYXQpIDEKfQoKcHJvYyBub3RidXN5IHt3aGF0fSB7CiAgICBnbG9iYWwgaXNidXN5IG1haW5jdXJzb3IgdGV4dGN1cnNvcgoKICAgIGNhdGNoIHt1bnNldCBpc2J1c3koJHdoYXQpfQogICAgaWYge1thcnJheSBuYW1lcyBpc2J1c3ldIGVxIHt9fSB7CgkuIGNvbmZpZyAtY3Vyc29yICRtYWluY3Vyc29yCglzZXR0ZXh0Y3Vyc29yICR0ZXh0Y3Vyc29yCiAgICB9Cn0KCnByb2MgZHJhd3Jlc3Qge30gewogICAgZ2xvYmFsIHN0YXJ0bXNlY3MKICAgIGdsb2JhbCByb3dsYWlkb3V0IGNvbW1pdGlkeCBjdXJ2aWV3CiAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QKCiAgICBzZXQgcm93ICRyb3dsYWlkb3V0CiAgICBsYXlvdXRyb3dzICRyb3dsYWlkb3V0ICRjb21taXRpZHgoJGN1cnZpZXcpIDEKICAgIGxheW91dHRhaWwKICAgIG9wdGltaXplX3Jvd3MgJHJvdyAwICRjb21taXRpZHgoJGN1cnZpZXcpCiAgICBzaG93c3R1ZmYgJGNvbW1pdGlkeCgkY3VydmlldykKICAgIGlmIHtbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdfSB7CglzZWxlY3RsaW5lIDAgMQogICAgfQoKICAgIHNldCBkcmF3bXNlY3MgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc2Vjc31dCiAgICAjZ2xvYmFsIG51bWNvbW1pdHMKICAgICNwdXRzICJvdmVyYWxsICRkcmF3bXNlY3MgbXMgZm9yICRudW1jb21taXRzIGNvbW1pdHMiCn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByIHskaiskZm91bmRzdHJsZW4tMX1dXQoJICAgIHNldCBpIFtleHByIHskaiArICRmb3VuZHN0cmxlbn1dCgl9CiAgICB9CiAgICByZXR1cm4gJG1hdGNoZXMKfQoKcHJvYyBkb2ZpbmQge30gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmRsb2MgZmluZHN0cmluZyBtYXJrZWRtYXRjaGVzIGNvbW1pdGluZm8KICAgIGdsb2JhbCBudW1jb21taXRzIGRpc3BsYXlvcmRlciBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIG1haW5mb250IGNhbnYgY2FudjIgY2FudjMgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbiBtYXRjaHN0cmluZwogICAgZ2xvYmFsIGNvbW1pdGRhdGEKCiAgICBzdG9wZmluZHByb2MKICAgIHVubWFya21hdGNoZXMKICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAogICAgZm9jdXMgLgogICAgc2V0IG1hdGNoaW5nbGluZXMge30KICAgIGlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CglzZXQgZm91bmRzdHJpbmcgW3N0cmluZyB0b2xvd2VyICRmaW5kc3RyaW5nXQogICAgfSBlbHNlIHsKCXNldCBmb3VuZHN0cmluZyAkZmluZHN0cmluZwogICAgfQogICAgc2V0IGZvdW5kc3RybGVuIFtzdHJpbmcgbGVuZ3RoICRmaW5kc3RyaW5nXQogICAgaWYgeyRmb3VuZHN0cmxlbiA9PSAwfSByZXR1cm4KICAgIHJlZ3N1YiAtYWxsIHtbKj9cW1xcXX0gJGZvdW5kc3RyaW5nIHtcXCZ9IG1hdGNoc3RyaW5nCiAgICBzZXQgbWF0Y2hzdHJpbmcgIiokbWF0Y2hzdHJpbmcqIgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IG9sZHNlbCAtMQogICAgfSBlbHNlIHsKCXNldCBvbGRzZWwgJHNlbGVjdGVkbGluZQogICAgfQogICAgc2V0IGRpZHNlbCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KICAgIHNldCBsIC0xCiAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgewoJc2V0IGQgJGNvbW1pdGRhdGEoJGlkKQoJaW5jciBsCglpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbcmVnZXhwICRmb3VuZHN0cmluZyAkZF0KCX0gZWxzZWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoIC1ub2Nhc2UgJG1hdGNoc3RyaW5nICRkXQoJfSBlbHNlIHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggJG1hdGNoc3RyaW5nICRkXQoJfQoJaWYgeyEkZG9lc21hdGNofSBjb250aW51ZQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJICAgIGdldGNvbW1pdCAkaWQKCX0KCXNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKCXNldCBkb2VzbWF0Y2ggMAoJZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CgkgICAgaWYgeyRmaW5kbG9jICE9ICJBbGwgZmllbGRzIiAmJiAkZmluZGxvYyAhPSAkdHl9IHsKCQljb250aW51ZQoJICAgIH0KCSAgICBzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCgkgICAgaWYgeyRtYXRjaGVzID09IHt9fSBjb250aW51ZQoJICAgIHNldCBkb2VzbWF0Y2ggMQoJICAgIGlmIHskdHkgPT0gIkhlYWRsaW5lIn0gewoJCWRyYXdjbWl0cm93ICRsCgkJbWFya21hdGNoZXMgJGNhbnYgJGwgJGYgJGxpbmVodGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJBdXRob3IifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudjIgJGwgJGYgJGxpbmVudGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9IGVsc2VpZiB7JHR5ID09ICJEYXRlIn0gewoJCWRyYXdjbWl0cm93ICRsCgkJbWFya21hdGNoZXMgJGNhbnYzICRsICRmICRsaW5lZHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfQoJfQoJaWYgeyRkb2VzbWF0Y2h9IHsKCSAgICBsYXBwZW5kIG1hdGNoaW5nbGluZXMgJGwKCSAgICBpZiB7ISRkaWRzZWwgJiYgJGwgPiAkb2xkc2VsfSB7CgkJZmluZHNlbGVjdGxpbmUgJGwKCQlzZXQgZGlkc2VsIDEKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG1hdGNoaW5nbGluZXMgPT0ge319IHsKCWJlbGwKICAgIH0gZWxzZWlmIHshJGRpZHNlbH0gewoJZmluZHNlbGVjdGxpbmUgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXQogICAgfQp9Cgpwcm9jIGZpbmRzZWxlY3RsaW5lIHtsfSB7CiAgICBnbG9iYWwgZmluZGxvYyBjb21tZW50ZW5kIGN0ZXh0CiAgICBzZWxlY3RsaW5lICRsIDEKICAgIGlmIHskZmluZGxvYyA9PSAiQWxsIGZpZWxkcyIgfHwgJGZpbmRsb2MgPT0gIkNvbW1lbnRzIn0gewoJIyBoaWdobGlnaHQgdGhlIG1hdGNoZXMgaW4gdGhlIGNvbW1lbnRzCglzZXQgZiBbJGN0ZXh0IGdldCAxLjAgJGNvbW1lbnRlbmRdCglzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCglmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkbWF0Y2ggMF0KCSAgICBzZXQgZW5kIFtleHByIHtbbGluZGV4ICRtYXRjaCAxXSArIDF9XQoJICAgICRjdGV4dCB0YWcgYWRkIGZvdW5kICIxLjAgKyAkc3RhcnQgYyIgIjEuMCArICRlbmQgYyIKCX0KICAgIH0KfQoKcHJvYyBmaW5kbmV4dCB7cmVzdGFydH0gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJaWYgeyRyZXN0YXJ0fSB7CgkgICAgZG9maW5kCgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgZm9yZWFjaCBsICRtYXRjaGluZ2xpbmVzIHsKCWlmIHskbCA+ICRzZWxlY3RlZGxpbmV9IHsKCSAgICBmaW5kc2VsZWN0bGluZSAkbAoJICAgIHJldHVybgoJfQogICAgfQogICAgYmVsbAp9Cgpwcm9jIGZpbmRwcmV2IHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgbWF0Y2hpbmdsaW5lc119IHsKCWRvZmluZAoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBwcmV2IHt9CiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID49ICRzZWxlY3RlZGxpbmV9IGJyZWFrCglzZXQgcHJldiAkbAogICAgfQogICAgaWYgeyRwcmV2ICE9IHt9fSB7CglmaW5kc2VsZWN0bGluZSAkcHJldgogICAgfSBlbHNlIHsKCWJlbGwKICAgIH0KfQoKcHJvYyBzdG9wZmluZHByb2Mge3tkb25lIDB9fSB7CiAgICBnbG9iYWwgZmluZHByb2NwaWQgZmluZHByb2NmaWxlIGZpbmRpZHMKICAgIGdsb2JhbCBjdGV4dCBmaW5kb2xkY3Vyc29yIHBoYXNlIG1haW5jdXJzb3IgdGV4dGN1cnNvcgogICAgZ2xvYmFsIGZpbmRpbnByb2dyZXNzCgogICAgY2F0Y2gge3Vuc2V0IGZpbmRpZHN9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRwcm9jcGlkXX0gewoJaWYgeyEkZG9uZX0gewoJICAgIGNhdGNoIHtleGVjIGtpbGwgJGZpbmRwcm9jcGlkfQoJfQoJY2F0Y2gge2Nsb3NlICRmaW5kcHJvY2ZpbGV9Cgl1bnNldCBmaW5kcHJvY3BpZAogICAgfQogICAgY2F0Y2gge3Vuc2V0IGZpbmRpbnByb2dyZXNzfQogICAgbm90YnVzeSBmaW5kCn0KCiMgbWFyayBhIGNvbW1pdCBhcyBtYXRjaGluZyBieSBwdXR0aW5nIGEgeWVsbG93IGJhY2tncm91bmQKIyBiZWhpbmQgdGhlIGhlYWRsaW5lCnByb2MgbWFya2hlYWRsaW5lIHtsIGlkfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBsaW5laHRhZwoKICAgIGRyYXdjbWl0cm93ICRsCiAgICBzZXQgYmJveCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0ICRiYm94IC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQogICAgJGNhbnYgbG93ZXIgJHQKfQoKIyBtYXJrIHRoZSBiaXRzIG9mIGEgaGVhZGxpbmUsIGF1dGhvciBvciBkYXRlIHRoYXQgbWF0Y2ggYSBmaW5kIHN0cmluZwpwcm9jIG1hcmttYXRjaGVzIHtjYW52IGwgc3RyIHRhZyBtYXRjaGVzIGZvbnR9IHsKICAgIHNldCBiYm94IFskY2FudiBiYm94ICR0YWddCiAgICBzZXQgeDAgW2xpbmRleCAkYmJveCAwXQogICAgc2V0IHkwIFtsaW5kZXggJGJib3ggMV0KICAgIHNldCB5MSBbbGluZGV4ICRiYm94IDNdCiAgICBmb3JlYWNoIG1hdGNoICRtYXRjaGVzIHsKCXNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJc2V0IGVuZCBbbGluZGV4ICRtYXRjaCAxXQoJaWYgeyRzdGFydCA+ICRlbmR9IGNvbnRpbnVlCglzZXQgeG9mZiBbZm9udCBtZWFzdXJlICRmb250IFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskc3RhcnQtMX1dXV0KCXNldCB4bGVuIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRlbmR9XV1dCglzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgW2V4cHIgeyR4MCskeG9mZn1dICR5MCBcCgkJICAgW2V4cHIgeyR4MCskeGxlbisyfV0gJHkxIFwKCQkgICAtb3V0bGluZSB7fSAtdGFncyBtYXRjaGVzIC1maWxsIHllbGxvd10KCSRjYW52IGxvd2VyICR0CiAgICB9Cn0KCnByb2MgdW5tYXJrbWF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmaW5kaWRzCiAgICBhbGxjYW52cyBkZWxldGUgbWF0Y2hlcwogICAgY2F0Y2gge3Vuc2V0IG1hdGNoaW5nbGluZXN9CiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KfQoKcHJvYyBzZWxjYW52bGluZSB7dyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnZ5MCBjdGV4dCBsaW5lc3BjCiAgICBnbG9iYWwgcm93dGV4dHgKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICBzZXQgbCBbZXhwciB7aW50KCgkeSAtICRjYW52eTApIC8gJGxpbmVzcGMgKyAwLjUpfV0KICAgIGlmIHskbCA8IDB9IHsKCXNldCBsIDAKICAgIH0KICAgIGlmIHskdyBlcSAkY2Fudn0gewoJaWYgeyFbaW5mbyBleGlzdHMgcm93dGV4dHgoJGwpXSB8fCAkeCA8ICRyb3d0ZXh0eCgkbCl9IHJldHVybgogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2MgY29tbWl0X2Rlc2NyaXB0b3Ige3B9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRwKV19IHsKCWdldGNvbW1pdCAkcAogICAgfQogICAgc2V0IGwgIi4uLiIKICAgIGlmIHtbbGxlbmd0aCAkY29tbWl0aW5mbygkcCldID4gMX0gewoJc2V0IGwgW2xpbmRleCAkY29tbWl0aW5mbygkcCkgMF0KICAgIH0KICAgIHJldHVybiAiJHAgKCRsKVxuIgp9CgojIGFwcGVuZCBzb21lIHRleHQgdG8gdGhlIGN0ZXh0IHdpZGdldCwgYW5kIG1ha2UgYW55IFNIQTEgSUQKIyB0aGF0IHdlIGtub3cgYWJvdXQgYmUgYSBjbGlja2FibGUgbGluay4KcHJvYyBhcHBlbmR3aXRobGlua3Mge3RleHQgdGFnc30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdHJvdyBsaW5rbnVtIGN1cnZpZXcKCiAgICBzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJHRleHQgJHRhZ3MKICAgIHNldCBsaW5rcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSB7WzAtOWEtZl17NDB9fSAkdGV4dF0KICAgIGZvcmVhY2ggbCAkbGlua3MgewoJc2V0IHMgW2xpbmRleCAkbCAwXQoJc2V0IGUgW2xpbmRleCAkbCAxXQoJc2V0IGxpbmtpZCBbc3RyaW5nIHJhbmdlICR0ZXh0ICRzICRlXQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5raWQpXX0gY29udGludWUKCWluY3IgZQoJJGN0ZXh0IHRhZyBhZGQgbGluayAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGFkZCBsaW5rJGxpbmtudW0gIiRzdGFydCArICRzIGMiICIkc3RhcnQgKyAkZSBjIgoJJGN0ZXh0IHRhZyBiaW5kIGxpbmskbGlua251bSA8MT4gXAoJICAgIFtsaXN0IHNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkbGlua2lkKSAxXQoJaW5jciBsaW5rbnVtCiAgICB9CiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9Cn0KCnByb2Mgdmlld25leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMKCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkZGlyICogJGxpbmVzcGN9XQogICAgaWYgeyRuZXd0b3AgPCAwfSB7CglzZXQgbmV3dG9wIDAKICAgIH0gZWxzZWlmIHskbmV3dG9wID4gJHltYXh9IHsKCXNldCBuZXd0b3AgJHltYXgKICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciB7JG5ld3RvcCAqIDEuMCAvICR5bWF4fV0KfQoKIyBhZGQgYSBsaXN0IG9mIHRhZyBvciBicmFuY2ggbmFtZXMgYXQgcG9zaXRpb24gcG9zCiMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5hbWVzIGluc2VydGVkCnByb2MgYXBwZW5kcmVmcyB7cG9zIHRhZ3MgdmFyfSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0gY3VydmlldyAkdmFyCgogICAgaWYge1tjYXRjaCB7JGN0ZXh0IGluZGV4ICRwb3N9XX0gewoJcmV0dXJuIDAKICAgIH0KICAgIHNldCB0YWdzIFtsc29ydCAkdGFnc10KICAgIHNldCBzZXAge30KICAgIGZvcmVhY2ggdGFnICR0YWdzIHsKCXNldCBpZCBbc2V0ICR2YXJcKCR0YWdcKV0KCXNldCBsayBsaW5rJGxpbmtudW0KCWluY3IgbGlua251bQoJJGN0ZXh0IGluc2VydCAkcG9zICRzZXAKCSRjdGV4dCBpbnNlcnQgJHBvcyAkdGFnICRsawoJJGN0ZXh0IHRhZyBjb25mICRsayAtZm9yZWdyb3VuZCBibHVlCglpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJICAgICRjdGV4dCB0YWcgYmluZCAkbGsgPDE+IFwKCQlbbGlzdCBzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSAxXQoJICAgICRjdGV4dCB0YWcgY29uZiAkbGsgLXVuZGVybGluZSAxCgkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQoJICAgICRjdGV4dCB0YWcgYmluZCAkbGsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KCX0KCXNldCBzZXAgIiwgIgogICAgfQogICAgcmV0dXJuIFtsbGVuZ3RoICR0YWdzXQp9Cgpwcm9jIHRhZ2xpc3Qge2lkc30gewogICAgZ2xvYmFsIGlkdGFncwoKICAgIHNldCB0YWdzIHt9CiAgICBmb3JlYWNoIGlkICRpZHMgewoJZm9yZWFjaCB0YWcgJGlkdGFncygkaWQpIHsKCSAgICBsYXBwZW5kIHRhZ3MgJHRhZwoJfQogICAgfQogICAgcmV0dXJuICR0YWdzCn0KCiMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCBjb21wdXRpbmcgdGhlIG5lYXJieSB0YWdzCnByb2MgZGlzcG5lYXJ0YWdzIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkIGN0ZXh0IGFuY190YWdzIGRlc2NfdGFncyBzaG93bmVhcnRhZ3MKICAgIGdsb2JhbCBkZXNjX2hlYWRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSB8fCAhJHNob3duZWFydGFnc30gcmV0dXJuCiAgICBzZXQgaWQgJGN1cnJlbnRpZAogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRpZCldfSB7CglpZiB7W2FwcGVuZHJlZnMgYnJhbmNoICRkZXNjX2hlYWRzKCRpZCkgaGVhZGlkc10gPiAxfSB7CgkgICAgJGN0ZXh0IGluc2VydCAiYnJhbmNoIC0yYyIgImVzIgoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0gewoJYXBwZW5kcmVmcyBmb2xsb3dzIFt0YWdsaXN0ICRhbmNfdGFncygkaWQpXSB0YWdpZHMKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSB7CglhcHBlbmRyZWZzIHByZWNlZGVzIFt0YWdsaXN0ICRkZXNjX3RhZ3MoJGlkKV0gdGFnaWRzCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBzZWxlY3RsaW5lIHtsIGlzbmV3fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudGxpc3QgY2hpbGRsaXN0CiAgICBnbG9iYWwgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzIGxpbmtudW0KICAgIGdsb2JhbCBtZXJnZW1heCBudW1jb21taXRzIHBlbmRpbmdfc2VsZWN0CiAgICBnbG9iYWwgY21pdG1vZGUgZGVzY190YWdzIGFuY190YWdzIHNob3duZWFydGFncyBhbGxjb21taXRzIGRlc2NfaGVhZHMKCiAgICBjYXRjaCB7dW5zZXQgcGVuZGluZ19zZWxlY3R9CiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIG5vcm1hbGxpbmUKICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAogICAgaWYgeyRsIDwgMCB8fCAkbCA+PSAkbnVtY29tbWl0c30gcmV0dXJuCiAgICBzZXQgeSBbZXhwciB7JGNhbnZ5MCArICRsICogJGxpbmVzcGN9XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHl0b3AgW2V4cHIgeyR5IC0gJGxpbmVzcGMgLSAxfV0KICAgIHNldCB5Ym90IFtleHByIHskeSArICRsaW5lc3BjICsgMX1dCiAgICBzZXQgd25vdyBbJGNhbnYgeXZpZXddCiAgICBzZXQgd3RvcCBbZXhwciB7W2xpbmRleCAkd25vdyAwXSAqICR5bWF4fV0KICAgIHNldCB3Ym90IFtleHByIHtbbGluZGV4ICR3bm93IDFdICogJHltYXh9XQogICAgc2V0IHdoIFtleHByIHskd2JvdCAtICR3dG9wfV0KICAgIHNldCBuZXd0b3AgJHd0b3AKICAgIGlmIHskeXRvcCA8ICR3dG9wfSB7CglpZiB7JHlib3QgPCAkd3RvcH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCAkeXRvcAoJICAgIGlmIHskbmV3dG9wID4gJHd0b3AgLSAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wIC0gJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0gZWxzZWlmIHskeWJvdCA+ICR3Ym90fSB7CglpZiB7JHl0b3AgPiAkd2JvdH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHlib3QgLSAkd2h9XQoJICAgIGlmIHskbmV3dG9wIDwgJHd0b3AgKyAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbmV3dG9wICE9ICR3dG9wfSB7CglpZiB7JG5ld3RvcCA8IDB9IHsKCSAgICBzZXQgbmV3dG9wIDAKCX0KCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciB7JG5ld3RvcCAqIDEuMCAvICR5bWF4fV0KCWRyYXd2aXNpYmxlCiAgICB9CgogICAgaWYgeyFbaW5mbyBleGlzdHMgbGluZWh0YWcoJGwpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYgbG93ZXIgJHQKICAgICRjYW52MiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYyIGxvd2VyICR0CiAgICAkY2FudjMgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYzIGNyZWF0ZSByZWN0IFskY2FudjMgYmJveCAkbGluZWR0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MyBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MyBsb3dlciAkdAoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzZWxlY3RsaW5lICRsIDBdCiAgICB9CgogICAgc2V0IHNlbGVjdGVkbGluZSAkbAoKICAgIHNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJGxdCiAgICBzZXQgY3VycmVudGlkICRpZAogICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiBmcm9tIDAKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAogICAgcmhpZ2hsaWdodF9zZWwgJGlkCgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgIHNldCBsaW5rbnVtIDAKICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiQXV0aG9yOiBbbGluZGV4ICRpbmZvIDFdICAkZGF0ZVxuIgogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyA0XV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJDb21taXR0ZXI6IFtsaW5kZXggJGluZm8gM10gICRkYXRlXG4iCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlRhZ3M6IgoJZm9yZWFjaCB0YWcgJGlkdGFncygkaWQpIHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICR0YWciCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICB9CiAKICAgIHNldCBoZWFkZXJzIHt9CiAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRsXQogICAgaWYge1tsbGVuZ3RoICRvbGRzXSA+IDF9IHsKCXNldCBucCAwCglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGlmIHskbnAgPj0gJG1lcmdlbWF4fSB7CgkJc2V0IHRhZyBtbWF4CgkgICAgfSBlbHNlIHsKCQlzZXQgdGFnIG0kbnAKCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlBhcmVudDogIiAkdGFnCgkgICAgYXBwZW5kd2l0aGxpbmtzIFtjb21taXRfZGVzY3JpcHRvciAkcF0ge30KCSAgICBpbmNyIG5wCgl9CiAgICB9IGVsc2UgewoJZm9yZWFjaCBwICRvbGRzIHsKCSAgICBhcHBlbmQgaGVhZGVycyAiUGFyZW50OiBbY29tbWl0X2Rlc2NyaXB0b3IgJHBdIgoJfQogICAgfQoKICAgIGZvcmVhY2ggYyBbbGluZGV4ICRjaGlsZGxpc3QgJGxdIHsKCWFwcGVuZCBoZWFkZXJzICJDaGlsZDogIFtjb21taXRfZGVzY3JpcHRvciAkY10iCiAgICB9CgogICAgIyBtYWtlIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIFNIQTEgSUQgYmUgYSBjbGlja2FibGUgbGluawogICAgYXBwZW5kd2l0aGxpbmtzICRoZWFkZXJzIHt9CiAgICBpZiB7JHNob3duZWFydGFnc30gewoJaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHsKCSAgICBnZXRhbGxjb21taXRzCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiQnJhbmNoOiAiCgkkY3RleHQgbWFyayBzZXQgYnJhbmNoICJlbmQgLTFjIgoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBicmFuY2ggbGVmdAoJaWYge1tpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRpZCldfSB7CgkgICAgaWYge1thcHBlbmRyZWZzIGJyYW5jaCAkZGVzY19oZWFkcygkaWQpIGhlYWRpZHNdID4gMX0gewoJCSMgdHVybiAiQnJhbmNoIiBpbnRvICJCcmFuY2hlcyIKCQkkY3RleHQgaW5zZXJ0ICJicmFuY2ggLTJjIiAiZXMiCgkgICAgfQoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuRm9sbG93czogIgoJJGN0ZXh0IG1hcmsgc2V0IGZvbGxvd3MgImVuZCAtMWMiCgkkY3RleHQgbWFyayBncmF2aXR5IGZvbGxvd3MgbGVmdAoJaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0gewoJICAgIGFwcGVuZHJlZnMgZm9sbG93cyBbdGFnbGlzdCAkYW5jX3RhZ3MoJGlkKV0gdGFnaWRzCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5QcmVjZWRlczogIgoJJGN0ZXh0IG1hcmsgc2V0IHByZWNlZGVzICJlbmQgLTFjIgoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBwcmVjZWRlcyBsZWZ0CglpZiB7W2luZm8gZXhpc3RzIGRlc2NfdGFncygkaWQpXX0gewoJICAgIGFwcGVuZHJlZnMgcHJlY2VkZXMgW3RhZ2xpc3QgJGRlc2NfdGFncygkaWQpXSB0YWdpZHMKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIGFwcGVuZHdpdGhsaW5rcyBbbGluZGV4ICRpbmZvIDVdIHtjb21tZW50fQoKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICBpbml0X2ZsaXN0ICJDb21tZW50cyIKICAgIGlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CglnZXR0cmVlICRpZAogICAgfSBlbHNlaWYge1tsbGVuZ3RoICRvbGRzXSA8PSAxfSB7CglzdGFydGRpZmYgJGlkCiAgICB9IGVsc2UgewoJbWVyZ2VkaWZmICRpZCAkbAogICAgfQp9Cgpwcm9jIHNlbGZpcnN0bGluZSB7fSB7CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lIDAgMQp9Cgpwcm9jIHNlbGxhc3RsaW5lIHt9IHsKICAgIGdsb2JhbCBudW1jb21taXRzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbCBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyfV0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRwYWdlIHtkaXJ9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKCiAgICBzZXQgbHBwIFtleHByIHsoW3dpbmZvIGhlaWdodCAkY2Fudl0gLSAyKSAvICRsaW5lc3BjfV0KICAgIGlmIHskbHBwIDwgMX0gewoJc2V0IGxwcCAxCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBzY3JvbGwgW2V4cHIgeyRkaXIgKiAkbHBwfV0gdW5pdHMKICAgIGRyYXd2aXNpYmxlCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpciAqICRscHB9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfSBlbHNlaWYgeyRsID49ICRudW1jb21taXRzfSB7CiAgICAgICAgc2V0IGwgW2V4cHIgJG51bWNvbW1pdHMgLSAxXQogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxICAgIAp9Cgpwcm9jIHVuc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZAoKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGlkfQogICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAogICAgcmhpZ2hsaWdodF9ub25lCiAgICBjYW5jZWxfbmV4dF9oaWdobGlnaHQKfQoKcHJvYyByZXNlbGVjdGxpbmUge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBhZGR0b2hpc3Rvcnkge2NtZH0gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4IGN1cnZpZXcKCiAgICBzZXQgZWx0IFtsaXN0ICRjdXJ2aWV3ICRjbWRdCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRlbHR9IHsKCXJldHVybgogICAgfQoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGVsdF0KICAgIH0gZWxzZSB7CglsYXBwZW5kIGhpc3RvcnkgJGVsdAogICAgfQogICAgaW5jciBoaXN0b3J5aW5kZXgKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfSBlbHNlIHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQogICAgLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGdvZG8ge2VsdH0gewogICAgZ2xvYmFsIGN1cnZpZXcKCiAgICBzZXQgdmlldyBbbGluZGV4ICRlbHQgMF0KICAgIHNldCBjbWQgW2xpbmRleCAkZWx0IDFdCiAgICBpZiB7JGN1cnZpZXcgIT0gJHZpZXd9IHsKCXNob3d2aWV3ICR2aWV3CiAgICB9CiAgICBldmFsICRjbWQKfQoKcHJvYyBnb2JhY2sge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CglpbmNyIGhpc3RvcnlpbmRleCAtMQoJZ29kbyBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXQoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4IDw9IDF9IHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdvZm9ydyB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5ICRoaXN0b3J5aW5kZXhdCglpbmNyIGhpc3RvcnlpbmRleAoJZ29kbyAkY21kCgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+PSBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnZXR0cmVlIHtpZH0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMgZGlmZm1lcmdlaWQgdHJlZXBlbmRpbmcKCiAgICBzZXQgZGlmZmlkcyAkaWQKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVmaWxlbGlzdCgkaWQpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgaWYge1tjYXRjaCB7c2V0IGd0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGxzLXRyZWUgLXIgJGlkXSByXX1dfSB7CgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCB0cmVlcGVuZGluZyAkaWQKCSAgICBzZXQgdHJlZWZpbGVsaXN0KCRpZCkge30KCSAgICBzZXQgdHJlZWlkbGlzdCgkaWQpIHt9CgkgICAgZmNvbmZpZ3VyZSAkZ3RmIC1ibG9ja2luZyAwCgkgICAgZmlsZWV2ZW50ICRndGYgcmVhZGFibGUgW2xpc3QgZ2V0dHJlZWxpbmUgJGd0ZiAkaWRdCgl9CiAgICB9IGVsc2UgewoJc2V0ZmlsZWxpc3QgJGlkCiAgICB9Cn0KCnByb2MgZ2V0dHJlZWxpbmUge2d0ZiBpZH0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IHRyZWVwZW5kaW5nIGNtaXRtb2RlIGRpZmZpZHMKCiAgICB3aGlsZSB7W2dldHMgJGd0ZiBsaW5lXSA+PSAwfSB7CglpZiB7W2xpbmRleCAkbGluZSAxXSBuZSAiYmxvYiJ9IGNvbnRpbnVlCglzZXQgc2hhMSBbbGluZGV4ICRsaW5lIDJdCglzZXQgZm5hbWUgW2xpbmRleCAkbGluZSAzXQoJbGFwcGVuZCB0cmVlZmlsZWxpc3QoJGlkKSAkZm5hbWUKCWxhcHBlbmQgdHJlZWlkbGlzdCgkaWQpICRzaGExCiAgICB9CiAgICBpZiB7IVtlb2YgJGd0Zl19IHJldHVybgogICAgY2xvc2UgJGd0ZgogICAgdW5zZXQgdHJlZXBlbmRpbmcKICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCSAgICBnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCX0KICAgIH0gZWxzZWlmIHskaWQgbmUgJGRpZmZpZHN9IHsKCWdldHRyZWUgJGRpZmZpZHMKICAgIH0gZWxzZSB7CglzZXRmaWxlbGlzdCAkaWQKICAgIH0KfQoKcHJvYyBzaG93ZmlsZSB7Zn0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMKICAgIGdsb2JhbCBjdGV4dCBjb21tZW50ZW5kCgogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZmlsZWxpc3QoJGRpZmZpZHMpICRmXQogICAgaWYgeyRpIDwgMH0gewoJcHV0cyAib29wcywgJGYgbm90IGluIGxpc3QgZm9yIGlkICRkaWZmaWRzIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgYmxvYiBbbGluZGV4ICR0cmVlaWRsaXN0KCRkaWZmaWRzKSAkaV0KICAgIGlmIHtbY2F0Y2gge3NldCBiZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGNhdC1maWxlIGJsb2IgJGJsb2JdIHJdfSBlcnJdfSB7CglwdXRzICJvb3BzLCBlcnJvciByZWFkaW5nIGJsb2IgJGJsb2I6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIGZjb25maWd1cmUgJGJmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGJmIHJlYWRhYmxlIFtsaXN0IGdldGJsb2JsaW5lICRiZiAkZGlmZmlkc10KICAgICRjdGV4dCBjb25maWcgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQgJGNvbW1lbnRlbmQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICIkZlxuIiBmaWxlc2VwCiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHl2aWV3ICRjb21tZW50ZW5kCn0KCnByb2MgZ2V0YmxvYmxpbmUge2JmIGlkfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBjbWl0bW9kZSBjdGV4dAoKICAgIGlmIHskaWQgbmUgJGRpZmZpZHMgfHwgJGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJY2F0Y2gge2Nsb3NlICRiZn0KCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgbm9ybWFsCiAgICB3aGlsZSB7W2dldHMgJGJmIGxpbmVdID49IDB9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgogICAgfQogICAgaWYge1tlb2YgJGJmXX0gewoJIyBkZWxldGUgbGFzdCBuZXdsaW5lCgkkY3RleHQgZGVsZXRlICJlbmQgLSAyYyIgImVuZCAtIDFjIgoJY2xvc2UgJGJmCiAgICB9CiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIG1lcmdlZGlmZiB7aWQgbH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZvcHRzIG1kaWZmZmQKICAgIGdsb2JhbCBkaWZmaWRzCiAgICBnbG9iYWwgcGFyZW50bGlzdAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmaWRzICRpZAogICAgIyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBhY3R1YWxseSBhZmZlY3QgYW55dGhpbmcuLi4KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC0tY2MgJGlkXQogICAgaWYge1tjYXRjaCB7c2V0IG1kZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgZ2V0dGluZyBtZXJnZSBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgZmNvbmZpZ3VyZSAkbWRmIC1ibG9ja2luZyAwCiAgICBzZXQgbWRpZmZmZCgkaWQpICRtZGYKICAgIHNldCBucCBbbGxlbmd0aCBbbGluZGV4ICRwYXJlbnRsaXN0ICRsXV0KICAgIGZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWQgJG5wXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldG1lcmdlZGlmZmxpbmUge21kZiBpZCBucH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGN0ZXh0IGNmbGlzdCBuZXh0dXBkYXRlIG1lcmdlbWF4CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBtZGlmZmZkCgogICAgc2V0IG4gW2dldHMgJG1kZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJG1kZl19IHsKCSAgICBjbG9zZSAkbWRmCgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXSB8fCAkaWQgIT0gJGRpZmZtZXJnZWlkCgl8fCAkbWRmICE9ICRtZGlmZmZkKCRpZCl9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tY2MgKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCWxhcHBlbmQgZGlmZmZpbGVzdGFydCAkaGVyZQoJYWRkX2ZsaXN0IFtsaXN0ICRmbmFtZV0KCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkZm5hbWVdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGZuYW1lICRwYWRcbiIgZmlsZXNlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQH0gJGxpbmVdfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15bMC05YS1mXXs0MH0kfSAkbGluZV0gfHwgW3JlZ2V4cCB7XmluZGV4fSAkbGluZV19IHsKCSMgZG8gbm90aGluZwogICAgfSBlbHNlIHsKCSMgcGFyc2UgdGhlIHByZWZpeCAtIG9uZSAnICcsICctJyBvciAnKycgZm9yIGVhY2ggcGFyZW50CglzZXQgc3BhY2VzIHt9CglzZXQgbWludXNlcyB7fQoJc2V0IHBsdXNlcyB7fQoJc2V0IGlzYmFkIDAKCWZvciB7c2V0IGogMH0geyRqIDwgJG5wfSB7aW5jciBqfSB7CgkgICAgc2V0IGMgW3N0cmluZyByYW5nZSAkbGluZSAkaiAkal0KCSAgICBpZiB7JGMgPT0gIiAifSB7CgkJbGFwcGVuZCBzcGFjZXMgJGoKCSAgICB9IGVsc2VpZiB7JGMgPT0gIi0ifSB7CgkJbGFwcGVuZCBtaW51c2VzICRqCgkgICAgfSBlbHNlaWYgeyRjID09ICIrIn0gewoJCWxhcHBlbmQgcGx1c2VzICRqCgkgICAgfSBlbHNlIHsKCQlzZXQgaXNiYWQgMQoJCWJyZWFrCgkgICAgfQoJfQoJc2V0IHRhZ3Mge30KCXNldCBudW0ge30KCWlmIHshJGlzYmFkICYmICRtaW51c2VzIG5lIHt9ICYmICRwbHVzZXMgZXEge319IHsKCSAgICAjIGxpbmUgZG9lc24ndCBhcHBlYXIgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRtaW51c2VzIGhhdmUgdGhlIGxpbmUKCSAgICBzZXQgbnVtIFtsaW5kZXggJG1pbnVzZXMgMF0KCX0gZWxzZWlmIHshJGlzYmFkICYmICRwbHVzZXMgbmUge30gJiYgJG1pbnVzZXMgZXEge319IHsKCSAgICAjIGxpbmUgYXBwZWFycyBpbiByZXN1bHQsIHBhcmVudHMgaW4gJHBsdXNlcyBkb24ndCBoYXZlIHRoZSBsaW5lCgkgICAgbGFwcGVuZCB0YWdzIG1yZXN1bHQKCSAgICBzZXQgbnVtIFtsaW5kZXggJHNwYWNlcyAwXQoJfQoJaWYgeyRudW0gbmUge319IHsKCSAgICBpZiB7JG51bSA+PSAkbWVyZ2VtYXh9IHsKCQlzZXQgbnVtICJtYXgiCgkgICAgfQoJICAgIGxhcHBlbmQgdGFncyBtJG51bQoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iICR0YWdzCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZGYgJGlkICRucF0KICAgIH0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkCgogICAgc2V0IGRpZmZpZHMgJGlkcwogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGFkZF9mbGlzdCAkdHJlZWRpZmZzKCRpZHMpCiAgICBnZXRibG9iZGlmZnMgJGlkcwp9Cgpwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmYge30KICAgIGlmIHtbY2F0Y2ggXAoJIHtzZXQgZ2R0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtciAkaWRzXSByXX0gXAoJXX0gcmV0dXJuCiAgICBmY29uZmlndXJlICRnZHRmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGdkdGYgcmVhZGFibGUgW2xpc3QgZ2V0dHJlZWRpZmZsaW5lICRnZHRmICRpZHNdCn0KCnByb2MgZ2V0dHJlZWRpZmZsaW5lIHtnZHRmIGlkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHRyZWVkaWZmcyB0cmVlcGVuZGluZyBkaWZmaWRzIGRpZmZtZXJnZWlkCiAgICBnbG9iYWwgY21pdG1vZGUKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gewoJICAgIGdldHRyZWUgJGRpZmZpZHMKCX0gZWxzZWlmIHskaWRzICE9ICRkaWZmaWRzfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CgkJZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgkgICAgfQoJfSBlbHNlIHsKCSAgICBhZGR0b2NmbGlzdCAkaWRzCgl9CglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlIFtsaW5kZXggJGxpbmUgNV0KICAgIGxhcHBlbmQgdHJlZWRpZmYgJGZpbGUKfQoKcHJvYyBnZXRibG9iZGlmZnMge2lkc30gewogICAgZ2xvYmFsIGRpZmZvcHRzIGJsb2JkaWZmZmQgZGlmZmlkcyBlbnYgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yIC1wIC1DICRpZHNdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCn0KCnByb2Mgc2V0aW5saXN0IHt2YXIgaSB2YWx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgd2hpbGUge1tsbGVuZ3RoIFtzZXQgJHZhcl1dIDwgJGl9IHsKCWxhcHBlbmQgJHZhciB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoIFtzZXQgJHZhcl1dID09ICRpfSB7CglsYXBwZW5kICR2YXIgJHZhbAogICAgfSBlbHNlIHsKCWxzZXQgJHZhciAkaSAkdmFsCiAgICB9Cn0KCnByb2MgZ2V0YmxvYmRpZmZsaW5lIHtiZGYgaWRzfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBibG9iZGlmZmZkIGN0ZXh0IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmbmV4dGhlYWQgZGlmZm5leHRub3RlIGRpZmZmaWxlc3RhcnQKICAgIGdsb2JhbCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkYmRmXX0gewoJICAgIGNsb3NlICRiZGYKCSAgICBpZiB7JGlkcyA9PSAkZGlmZmlkcyAmJiAkYmRmID09ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyRpZHMgIT0gJGRpZmZpZHMgfHwgJGJkZiAhPSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWUgbmV3bmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGN1cnRhZ3N0YXJ0ICRoZXJlCglzZXQgaGVhZGVyICRuZXduYW1lCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkZm5hbWVdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRoZXJlCgl9CglpZiB7JG5ld25hbWUgbmUgJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGlkcykgJG5ld25hbWVdCgkgICAgaWYgeyRpID49IDB9IHsKCQlzZXRpbmxpc3QgZGlmZmZpbGVzdGFydCAkaSAkaGVyZQoJICAgIH0KCX0KCXNldCBjdXJkaWZmdGFnICJmOiRmbmFtZSIKCSRjdGV4dCB0YWcgZGVsZXRlICRjdXJkaWZmdGFnCglzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGhlYWRlcl0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkaGVhZGVyICRwYWRcbiIgZmlsZXNlcAoJc2V0IGRpZmZpbmhkciAxCiAgICB9IGVsc2VpZiB7JGRpZmZpbmhkciAmJiBbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCAzICRsaW5lICItLS0iXSA9PSAwfSB7CgkjIGRvIG5vdGhpbmcKICAgIH0gZWxzZWlmIHskZGlmZmluaGRyICYmIFtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIisrKyJdID09IDB9IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZCR0YWcKCX0gZWxzZWlmIHskeCA9PSAiICJ9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKCX0gZWxzZWlmIHskZGlmZmluaGRyIHx8ICR4ID09ICJcXCJ9IHsKCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfSBlbHNlIHsKCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJCXNldCBjdXJkaWZmdGFnIENvbW1lbnRzCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgfQp9Cgpwcm9jIHByZXZmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgcHJldiBbbGluZGV4ICRkaWZmZmlsZXN0YXJ0IDBdCiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRsb2MgPj0gJGhlcmVdfSB7CgkgICAgJGN0ZXh0IHl2aWV3ICRwcmV2CgkgICAgcmV0dXJuCgl9CglzZXQgcHJldiAkbG9jCiAgICB9CiAgICAkY3RleHQgeXZpZXcgJHByZXYKfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yZWFjaCBsb2MgJGRpZmZmaWxlc3RhcnQgewoJaWYge1skY3RleHQgY29tcGFyZSAkbG9jID4gJGhlcmVdfSB7CgkgICAgJGN0ZXh0IHl2aWV3ICRsb2MKCSAgICByZXR1cm4KCX0KICAgIH0KfQoKcHJvYyBjbGVhcl9jdGV4dCB7e2ZpcnN0IDEuMH19IHsKICAgIGdsb2JhbCBjdGV4dCBzbWFya3RvcCBzbWFya2JvdAoKICAgIHNldCBsIFtsaW5kZXggW3NwbGl0ICRmaXJzdCAuXSAwXQogICAgaWYgeyFbaW5mbyBleGlzdHMgc21hcmt0b3BdIHx8IFskY3RleHQgY29tcGFyZSAkZmlyc3QgPCAkc21hcmt0b3AuMF19IHsKCXNldCBzbWFya3RvcCAkbAogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc21hcmtib3RdIHx8IFskY3RleHQgY29tcGFyZSAkZmlyc3QgPCAkc21hcmtib3QuMF19IHsKCXNldCBzbWFya2JvdCAkbAogICAgfQogICAgJGN0ZXh0IGRlbGV0ZSAkZmlyc3QgZW5kCn0KCnByb2MgaW5jcnNlYXJjaCB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGN0ZXh0IHNlYXJjaHN0cmluZyBzZWFyY2hkaXJuCgogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgaWYge1tjYXRjaCB7JGN0ZXh0IGluZGV4IGFuY2hvcn1dfSB7CgkjIG5vIGFuY2hvciBzZXQsIHVzZSBzdGFydCBvZiBzZWxlY3Rpb24sIG9yIG9mIHZpc2libGUgYXJlYQoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIFtsaW5kZXggJHNlbCAwXQoJfSBlbHNlaWYgeyRzZWFyY2hkaXJuIGVxICItZm9yd2FyZHMifSB7CgkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCwwCgl9IGVsc2UgewoJICAgICRjdGV4dCBtYXJrIHNldCBhbmNob3IgQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdCgl9CiAgICB9CiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IGhlcmUgWyRjdGV4dCBzZWFyY2ggJHNlYXJjaGRpcm4gLS0gJHNlYXJjaHN0cmluZyBhbmNob3JdCglpZiB7JGhlcmUgbmUge319IHsKCSAgICAkY3RleHQgc2VlICRoZXJlCgl9CglzZWFyY2htYXJrdmlzaWJsZSAxCiAgICB9Cn0KCnByb2MgZG9zZWFyY2gge30gewogICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICBmb2N1cyAkc3N0cmluZwogICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKICAgIHNldCBzZWFyY2hkaXJuIC1mb3J3YXJkcwogICAgaWYgeyRzZWFyY2hzdHJpbmcgbmUge319IHsKCXNldCBzZWwgWyRjdGV4dCB0YWcgcmFuZ2VzIHNlbF0KCWlmIHskc2VsIG5lIHt9fSB7CgkgICAgc2V0IHN0YXJ0ICJbbGluZGV4ICRzZWwgMF0gKyAxYyIKCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0gewoJICAgIHNldCBzdGFydCAiQDAsMCIKCX0KCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCglpZiB7JG1hdGNoIGVxIHt9fSB7CgkgICAgYmVsbAoJICAgIHJldHVybgoJfQoJJGN0ZXh0IHNlZSAkbWF0Y2gKCXNldCBtZW5kICIkbWF0Y2ggKyAkbWxlbiBjIgoJJGN0ZXh0IHRhZyBhZGQgc2VsICRtYXRjaCAkbWVuZAoJJGN0ZXh0IG1hcmsgdW5zZXQgYW5jaG9yCiAgICB9Cn0KCnByb2MgZG9zZWFyY2hiYWNrIHt9IHsKICAgIGdsb2JhbCBzc3RyaW5nIGN0ZXh0IHNlYXJjaHN0cmluZyBzZWFyY2hkaXJuCgogICAgZm9jdXMgJHNzdHJpbmcKICAgICRzc3RyaW5nIGljdXJzb3IgZW5kCiAgICBzZXQgc2VhcmNoZGlybiAtYmFja3dhcmRzCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkc2VsIDBdCgl9IGVsc2VpZiB7W2NhdGNoIHtzZXQgc3RhcnQgWyRjdGV4dCBpbmRleCBhbmNob3JdfV19IHsKCSAgICBzZXQgc3RhcnQgQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdCgl9CglzZXQgbWF0Y2ggWyRjdGV4dCBzZWFyY2ggLWJhY2t3YXJkcyAtY291bnQgbWwgLS0gJHNlYXJjaHN0cmluZyAkc3RhcnRdCgkkY3RleHQgdGFnIHJlbW92ZSBzZWwgMS4wIGVuZAoJaWYgeyRtYXRjaCBlcSB7fX0gewoJICAgIGJlbGwKCSAgICByZXR1cm4KCX0KCSRjdGV4dCBzZWUgJG1hdGNoCglzZXQgbWVuZCAiJG1hdGNoICsgJG1sIGMiCgkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCgkkY3RleHQgbWFyayB1bnNldCBhbmNob3IKICAgIH0KfQoKcHJvYyBzZWFyY2htYXJrIHtmaXJzdCBsYXN0fSB7CiAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nCgogICAgc2V0IG1lbmQgJGZpcnN0LjAKICAgIHdoaWxlIHsxfSB7CglzZXQgbWF0Y2ggWyRjdGV4dCBzZWFyY2ggLWNvdW50IG1sZW4gLS0gJHNlYXJjaHN0cmluZyAkbWVuZCAkbGFzdC5lbmRdCglpZiB7JG1hdGNoIGVxIHt9fSBicmVhawoJc2V0IG1lbmQgIiRtYXRjaCArICRtbGVuIGMiCgkkY3RleHQgdGFnIGFkZCBmb3VuZCAkbWF0Y2ggJG1lbmQKICAgIH0KfQoKcHJvYyBzZWFyY2htYXJrdmlzaWJsZSB7ZG9hbGx9IHsKICAgIGdsb2JhbCBjdGV4dCBzbWFya3RvcCBzbWFya2JvdAoKICAgIHNldCB0b3BsaW5lIFtsaW5kZXggW3NwbGl0IFskY3RleHQgaW5kZXggQDAsMF0gLl0gMF0KICAgIHNldCBib3RsaW5lIFtsaW5kZXggW3NwbGl0IFskY3RleHQgaW5kZXggQDAsW3dpbmZvIGhlaWdodCAkY3RleHRdXSAuXSAwXQogICAgaWYgeyRkb2FsbCB8fCAkYm90bGluZSA8ICRzbWFya3RvcCB8fCAkdG9wbGluZSA+ICRzbWFya2JvdH0gewoJIyBubyBvdmVybGFwIHdpdGggcHJldmlvdXMKCXNlYXJjaG1hcmsgJHRvcGxpbmUgJGJvdGxpbmUKCXNldCBzbWFya3RvcCAkdG9wbGluZQoJc2V0IHNtYXJrYm90ICRib3RsaW5lCiAgICB9IGVsc2UgewoJaWYgeyR0b3BsaW5lIDwgJHNtYXJrdG9wfSB7CgkgICAgc2VhcmNobWFyayAkdG9wbGluZSBbZXhwciB7JHNtYXJrdG9wLTF9XQoJICAgIHNldCBzbWFya3RvcCAkdG9wbGluZQoJfQoJaWYgeyRib3RsaW5lID4gJHNtYXJrYm90fSB7CgkgICAgc2VhcmNobWFyayBbZXhwciB7JHNtYXJrYm90KzF9XSAkYm90bGluZQoJICAgIHNldCBzbWFya2JvdCAkYm90bGluZQoJfQogICAgfQp9Cgpwcm9jIHNjcm9sbHRleHQge2YwIGYxfSB7CiAgICBnbG9iYWwgc2VhcmNoc3RyaW5nCgogICAgLmN0b3AuY2RldC5sZWZ0LnNiIHNldCAkZjAgJGYxCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2VhcmNobWFya3Zpc2libGUgMAogICAgfQp9Cgpwcm9jIHNldGNvb3JkcyB7fSB7CiAgICBnbG9iYWwgbGluZXNwYyBjaGFyc3BjIGNhbnZ4MCBjYW52eTAgbWFpbmZvbnQKICAgIGdsb2JhbCB4c3BjMSB4c3BjMiBsdGhpY2tuZXNzCgogICAgc2V0IGxpbmVzcGMgW2ZvbnQgbWV0cmljcyAkbWFpbmZvbnQgLWxpbmVzcGFjZV0KICAgIHNldCBjaGFyc3BjIFtmb250IG1lYXN1cmUgJG1haW5mb250ICJtIl0KICAgIHNldCBjYW52eTAgW2V4cHIge2ludCgzICsgMC41ICogJGxpbmVzcGMpfV0KICAgIHNldCBjYW52eDAgW2V4cHIge2ludCgzICsgMC41ICogJGxpbmVzcGMpfV0KICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgc2V0IHhzcGMxKDApICRsaW5lc3BjCiAgICBzZXQgeHNwYzIgJGxpbmVzcGMKfQoKcHJvYyByZWRpc3BsYXkge30gewogICAgZ2xvYmFsIGNhbnYKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgc3BhbiBbJGNhbnYgeXZpZXddCiAgICBjbGVhcl9kaXNwbGF5CiAgICBzZXRjYW52c2Nyb2xsCiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gW2xpbmRleCAkc3BhbiAwXQogICAgZHJhd3Zpc2libGUKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCiAgICB9Cn0KCnByb2MgaW5jcmZvbnQge2luY30gewogICAgZ2xvYmFsIG1haW5mb250IHRleHRmb250IGN0ZXh0IGNhbnYgcGhhc2UKICAgIGdsb2JhbCBzdG9wcGVkIGVudHJpZXMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBtYWluZm9udCBbbHJlcGxhY2UgJG1haW5mb250IDEgMSBbZXhwciB7W2xpbmRleCAkbWFpbmZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXQgdGV4dGZvbnQgW2xyZXBsYWNlICR0ZXh0Zm9udCAxIDEgW2V4cHIge1tsaW5kZXggJHRleHRmb250IDFdICsgJGluY31dXQogICAgc2V0Y29vcmRzCiAgICAkY3RleHQgY29uZiAtZm9udCAkdGV4dGZvbnQKICAgICRjdGV4dCB0YWcgY29uZiBmaWxlc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJJGUgY29uZiAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIGlmIHskcGhhc2UgZXEgImdldGNvbW1pdHMifSB7CgkkY2FudiBpdGVtY29uZiB0ZXh0aXRlbXMgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICByZWRpc3BsYXkKfQoKcHJvYyBjbGVhcnNoYTEge30gewogICAgZ2xvYmFsIHNoYTFlbnRyeSBzaGExc3RyaW5nCiAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNoYTFzdHJpbmddID09IDQwfSB7Cgkkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgfQp9Cgpwcm9jIHNoYTFjaGFuZ2Uge24xIG4yIG9wfSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgc2hhMWJ1dAogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHtbJHNoYTFidXQgY2dldCAtc3RhdGVdID09ICRzdGF0ZX0gcmV0dXJuCiAgICBpZiB7JHN0YXRlID09ICJub3JtYWwifSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBub3JtYWwgLXJlbGllZiByYWlzZWQgLXRleHQgIkdvdG86ICIKICAgIH0gZWxzZSB7Cgkkc2hhMWJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgLXRleHQgIlNIQTEgSUQ6ICIKICAgIH0KfQoKcHJvYyBnb3RvY29tbWl0IHt9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBjb21taXRyb3cgdGFnaWRzIGhlYWRpZHMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgbnVtY29tbWl0cyBjdXJ2aWV3CgogICAgaWYgeyRzaGExc3RyaW5nID09IHt9Cgl8fCAoW2luZm8gZXhpc3RzIGN1cnJlbnRpZF0gJiYgJHNoYTFzdHJpbmcgPT0gJGN1cnJlbnRpZCl9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICR0YWdpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhlYWRpZHMoJHNoYTFzdHJpbmcpXX0gewoJc2V0IGlkICRoZWFkaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yZWFjaCBpICRkaXNwbGF5b3JkZXIgewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkaQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDEKCXJldHVybgogICAgfQogICAgaWYge1tyZWdleHAge15bMC05YS1mQS1GXXs0LH0kfSAkc2hhMXN0cmluZ119IHsKCXNldCB0eXBlICJTSEExIGlkIgogICAgfSBlbHNlIHsKCXNldCB0eXBlICJUYWcvSGVhZCIKICAgIH0KICAgIGVycm9yX3BvcHVwICIkdHlwZSAkc2hhMXN0cmluZyBpcyBub3Qga25vd24iCn0KCnByb2MgbGluZWVudGVyIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2FudgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCiAgICBzZXQgaG92ZXJ4ICR4CiAgICBzZXQgaG92ZXJ5ICR5CiAgICBzZXQgaG92ZXJpZCAkaWQKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCWFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgogICAgfQogICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICAkY2FudiBkZWxldGUgaG92ZXIKfQoKcHJvYyBsaW5lbW90aW9uIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CglzZXQgaG92ZXJ4ICR4CglzZXQgaG92ZXJ5ICR5CglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgl9CglzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgIH0KfQoKcHJvYyBsaW5lbGVhdmUge2lkfSB7CiAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJJGNhbnYgZGVsZXRlIGhvdmVyCglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgkgICAgdW5zZXQgaG92ZXJ0aW1lcgoJfQoJdW5zZXQgaG92ZXJpZAogICAgfQp9Cgpwcm9jIGxpbmVob3ZlciB7fSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKCiAgICBzZXQgdGV4dCBbbGluZGV4ICRjb21taXRpbmZvKCRob3ZlcmlkKSAwXQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KICAgIHNldCB5IFtleHByIHskaG92ZXJ5ICsgJHlmcmFjICogJHltYXggLSAkbGluZXNwYyAvIDJ9XQogICAgc2V0IHgwIFtleHByIHskeCAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB4MSBbZXhwciB7JHggKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF0gKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkxIFtleHByIHskeSArICRsaW5lc3BjICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCgkgICAgICAgLWZpbGwgXCNmZmZmODAgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDEgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXIgXAoJICAgICAgIC1mb250ICRtYWluZm9udF0KICAgICRjYW52IHJhaXNlICR0Cn0KCnByb2MgY2xpY2tpc29uYXJyb3cge2lkIHl9IHsKICAgIGdsb2JhbCBsdGhpY2tuZXNzCgogICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KICAgIHNldCB0aHJlc2ggW2V4cHIgezIgKiAkbHRoaWNrbmVzcyArIDZ9XQogICAgc2V0IG4gW2V4cHIge1tsbGVuZ3RoICRyYW5nZXNdIC0gMX1dCiAgICBmb3Ige3NldCBpIDF9IHskaSA8ICRufSB7aW5jciBpfSB7CglzZXQgcm93IFtsaW5kZXggJHJhbmdlcyAkaV0KCWlmIHthYnMoW3ljICRyb3ddIC0gJHkpIDwgJHRocmVzaH0gewoJICAgIHJldHVybiAkaQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgYXJyb3dqdW1wIHtpZCBuIHl9IHsKICAgIGdsb2JhbCBjYW52CgogICAgIyAxIDwtPiAyLCAzIDwtPiA0LCBldGMuLi4KICAgIHNldCBuIFtleHByIHsoKCRuIC0gMSkgXiAxKSArIDF9XQogICAgc2V0IHJvdyBbbGluZGV4IFtyb3dyYW5nZXMgJGlkXSAkbl0KICAgIHNldCB5dCBbeWMgJHJvd10KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA8PSAwfSByZXR1cm4KICAgIHNldCB2aWV3IFskY2FudiB5dmlld10KICAgIHNldCB5c3BhbiBbZXhwciB7W2xpbmRleCAkdmlldyAxXSAtIFtsaW5kZXggJHZpZXcgMF19XQogICAgc2V0IHlmcmFjIFtleHByIHskeXQgLyAkeW1heCAtICR5c3BhbiAvIDJ9XQogICAgaWYgeyR5ZnJhYyA8IDB9IHsKCXNldCB5ZnJhYyAwCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gJHlmcmFjCn0KCnByb2MgbGluZWNsaWNrIHt4IHkgaWQgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRpbmZvIGNoaWxkcmVuIGNhbnYgdGhpY2tlcmxpbmUgY3VydmlldwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV0gJiYgIVtnZXRjb21taXQgJGlkXX0gcmV0dXJuCiAgICB1bm1hcmttYXRjaGVzCiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgIyBkcmF3IHRoaXMgbGluZSB0aGlja2VyIHRoYW4gbm9ybWFsCiAgICBzZXQgdGhpY2tlcmxpbmUgJGlkCiAgICBkcmF3bGluZXMgJGlkCiAgICBpZiB7JGlzbmV3fSB7CglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglpZiB7JHltYXggZXEge319IHJldHVybgoJc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQoJc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgfQogICAgc2V0IGRpcm4gW2NsaWNraXNvbmFycm93ICRpZCAkeV0KICAgIGlmIHskZGlybiBuZSB7fX0gewoJYXJyb3dqdW1wICRpZCAkZGlybiAkeQoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IGxpbmVjbGljayAkeCAkeSAkaWQgMF0KICAgIH0KICAgICMgZmlsbCB0aGUgZGV0YWlscyBwYW5lIHdpdGggaW5mbyBhYm91dCB0aGlzIGxpbmUKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50Olx0IgogICAgJGN0ZXh0IGluc2VydCBlbmQgJGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJGlkXQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0RGF0ZTpcdCRkYXRlXG4iCiAgICBzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgaWYgeyRraWRzIG5lIHt9fSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5DaGlsZHJlbjoiCglzZXQgaSAwCglmb3JlYWNoIGNoaWxkICRraWRzIHsKCSAgICBpbmNyIGkKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRjaGlsZCldICYmICFbZ2V0Y29tbWl0ICRjaGlsZF19IGNvbnRpbnVlCgkgICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGNoaWxkKQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0IgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICRjaGlsZCBbbGlzdCBsaW5rIGxpbmskaV0KCSAgICAkY3RleHQgdGFnIGJpbmQgbGluayRpIDwxPiBbbGlzdCBzZWxieWlkICRjaGlsZF0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF0iCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdIgoJICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHREYXRlOlx0JGRhdGVcbiIKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaW5pdF9mbGlzdCB7fQp9Cgpwcm9jIG5vcm1hbGxpbmUge30gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXX0gewoJc2V0IGlkICR0aGlja2VybGluZQoJdW5zZXQgdGhpY2tlcmxpbmUKCWRyYXdsaW5lcyAkaWQKICAgIH0KfQoKcHJvYyBzZWxieWlkIHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdHJvdyBjdXJ2aWV3CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQogICAgfQp9Cgpwcm9jIG1zdGltZSB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc3RpbWUKICAgIGlmIHshW2luZm8gZXhpc3RzIHN0YXJ0bXN0aW1lXX0gewoJc2V0IHN0YXJ0bXN0aW1lIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIH0KICAgIHJldHVybiBbZm9ybWF0ICIlLjNmIiBbZXhwciB7KFtjbG9jayBjbGljayAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zdGltZSkgLyAxMDAwLjB9XV0KfQoKcHJvYyByb3dtZW51IHt4IHkgaWR9IHsKICAgIGdsb2JhbCByb3djdHhtZW51IGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgcm93bWVudWlkIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdCgl8fCAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgZXEgJHNlbGVjdGVkbGluZX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgIkRpZmYgdGhpcyoiIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlICJEaWZmIHNlbGVjdGVkKiIgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgIk1ha2UgcGF0Y2giIC1zdGF0ZSAkc3RhdGUKICAgIHNldCByb3dtZW51aWQgJGlkCiAgICB0a19wb3B1cCAkcm93Y3R4bWVudSAkeCAkeQp9Cgpwcm9jIGRpZmZ2c3NlbCB7ZGlybn0gewogICAgZ2xvYmFsIHJvd21lbnVpZCBzZWxlY3RlZGxpbmUgZGlzcGxheW9yZGVyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KCXNldCBuZXdpZCAkcm93bWVudWlkCiAgICB9IGVsc2UgewoJc2V0IG9sZGlkICRyb3dtZW51aWQKCXNldCBuZXdpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KICAgIH0KICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KICAgIGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkCn0KCnByb2MgZG9zZWxkaWZmIHtvbGRpZCBuZXdpZH0gewogICAgZ2xvYmFsIGN0ZXh0CiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICBpbml0X2ZsaXN0ICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAiCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG9sZGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXG5UbyAgICIKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMSA8MT4gW2xpc3Qgc2VsYnlpZCAkbmV3aWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG9sZGlkICRuZXdpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IGZuYW1lIFskcGF0Y2h0b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQgZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgW2dpdGRpcl0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICByZWRyYXd0YWdzICRpZAogICAgYWRkZWR0YWcgJGlkCn0KCnByb2MgcmVkcmF3dGFncyB7aWR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIGNvbW1pdHJvdyBpZHBvcyBzZWxlY3RlZGxpbmUgY3VydmlldwogICAgZ2xvYmFsIG1haW5mb250IGNhbnZ4bWF4CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSByZXR1cm4KICAgIGRyYXdjbWl0cm93ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQogICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKICAgIHNldCB4dCBbZXZhbCBkcmF3dGFncyAkaWQgJGlkcG9zKCRpZCldCiAgICAkY2FudiBjb29yZHMgJGxpbmVodGFnKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgJHh0IFtsaW5kZXggJGlkcG9zKCRpZCkgMl0KICAgIHNldCB0ZXh0IFskY2FudiBpdGVtY2dldCAkbGluZWh0YWcoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAtdGV4dF0KICAgIHNldCB4ciBbZXhwciB7JHh0ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdfV0KICAgIGlmIHskeHIgPiAkY2FudnhtYXh9IHsKCXNldCBjYW52eG1heCAkeHIKCXNldGNhbnZzY3JvbGwKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQoJJiYgJHNlbGVjdGVkbGluZSA9PSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCl9IHsKCXNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZSAwCiAgICB9Cn0KCnByb2MgbWt0YWdjYW4ge30gewogICAgZ2xvYmFsIG1rdGFndG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJG1rdGFndG9wfQogICAgdW5zZXQgbWt0YWd0b3AKfQoKcHJvYyBta3RhZ2dvIHt9IHsKICAgIGRvbWt0YWcKICAgIG1rdGFnY2FuCn0KCnByb2Mgd3JpdGVjb21taXQge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCB3cmNvbXRvcCBjb21taXRpbmZvIHdyY29tY21kCgogICAgc2V0IHRvcCAud3JpdGVjb21taXQKICAgIHNldCB3cmNvbXRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuY2xhYiAtdGV4dCAiQ29tbWFuZDoiCiAgICBlbnRyeSAkdG9wLmNtZCAtd2lkdGggNjAgLXRleHR2YXJpYWJsZSB3cmNvbWNtZAogICAgZ3JpZCAkdG9wLmNsYWIgJHRvcC5jbWQgLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAiY29tbWl0LVtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDZdIl0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJXcml0ZSIgLWNvbW1hbmQgd3Jjb21nbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgd3Jjb21jYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIHdyY29tZ28ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgc2V0IGlkIFskd3Jjb210b3Auc2hhMSBnZXRdCiAgICBzZXQgY21kICJlY2hvICRpZCB8IFskd3Jjb210b3AuY21kIGdldF0iCiAgICBzZXQgZm5hbWUgWyR3cmNvbXRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIHNoIC1jICRjbWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igd3JpdGluZyBjb21taXQ6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIHdyY29tY2FuIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2MgbWticmFuY2gge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta2JydG9wCgogICAgc2V0IHRvcCAubWFrZWJyYW5jaAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSBuZXcgYnJhbmNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5ubGFiIC10ZXh0ICJOYW1lOiIKICAgIGVudHJ5ICR0b3AubmFtZSAtd2lkdGggNDAKICAgIGdyaWQgJHRvcC5ubGFiICR0b3AubmFtZSAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nbyAtdGV4dCAiQ3JlYXRlIiAtY29tbWFuZCBbbGlzdCBta2JyZ28gJHRvcF0KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kICJjYXRjaCB7ZGVzdHJveSAkdG9wfSIKICAgIGdyaWQgJHRvcC5idXRzLmdvICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLm5hbWUKfQoKcHJvYyBta2JyZ28ge3RvcH0gewogICAgZ2xvYmFsIGhlYWRpZHMgaWRoZWFkcwoKICAgIHNldCBuYW1lIFskdG9wLm5hbWUgZ2V0XQogICAgc2V0IGlkIFskdG9wLnNoYTEgZ2V0XQogICAgaWYgeyRuYW1lIGVxIHt9fSB7CgllcnJvcl9wb3B1cCAiUGxlYXNlIHNwZWNpZnkgYSBuYW1lIGZvciB0aGUgbmV3IGJyYW5jaCIKCXJldHVybgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIG5vd2J1c3kgbmV3YnJhbmNoCiAgICB1cGRhdGUKICAgIGlmIHtbY2F0Y2ggewoJZXhlYyBnaXQgYnJhbmNoICRuYW1lICRpZAogICAgfSBlcnJdfSB7Cglub3RidXN5IG5ld2JyYW5jaAoJZXJyb3JfcG9wdXAgJGVycgogICAgfSBlbHNlIHsKCWFkZGVkaGVhZCAkaWQgJG5hbWUKCSMgWFhYIHNob3VsZCB1cGRhdGUgbGlzdCBvZiBoZWFkcyBkaXNwbGF5ZWQgZm9yIHNlbGVjdGVkIGNvbW1pdAoJbm90YnVzeSBuZXdicmFuY2gKCXJlZHJhd3RhZ3MgJGlkCiAgICB9Cn0KCnByb2MgY2hlcnJ5cGljayB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnZpZXcgY29tbWl0cm93CiAgICBnbG9iYWwgbWFpbmhlYWQgZGVzY19oZWFkcyBhbmNfdGFncyBkZXNjX3RhZ3MgYWxscGFyZW50cyBhbGxjaGlsZHJlbgoKICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcm93bWVudWlkKV0KCSYmIFtsc2VhcmNoIC1leGFjdCAkZGVzY19oZWFkcygkcm93bWVudWlkKSAkbWFpbmhlYWRdID49IDB9IHsKCXNldCBvayBbY29uZmlybV9wb3B1cCAiQ29tbWl0IFtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDddIGlzIGFscmVhZHlcCgkJCWluY2x1ZGVkIGluIGJyYW5jaCAkbWFpbmhlYWQgLS0gcmVhbGx5IHJlLWFwcGx5IGl0PyJdCglpZiB7ISRva30gcmV0dXJuCiAgICB9CiAgICBub3didXN5IGNoZXJyeXBpY2sKICAgIHVwZGF0ZQogICAgc2V0IG9sZGhlYWQgW2V4ZWMgZ2l0IHJldi1wYXJzZSBIRUFEXQogICAgIyBVbmZvcnR1bmF0ZWx5IGdpdC1jaGVycnktcGljayB3cml0ZXMgc3R1ZmYgdG8gc3RkZXJyIGV2ZW4gd2hlbgogICAgIyBubyBlcnJvciBvY2N1cnMsIGFuZCBleGVjIHRha2VzIHRoYXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBlcnJvci4uLgogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAiZ2l0IGNoZXJyeS1waWNrIC1yICRyb3dtZW51aWQgMj4mMSJ9IGVycl19IHsKCW5vdGJ1c3kgY2hlcnJ5cGljawoJZXJyb3JfcG9wdXAgJGVycgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3aGVhZCBbZXhlYyBnaXQgcmV2LXBhcnNlIEhFQURdCiAgICBpZiB7JG5ld2hlYWQgZXEgJG9sZGhlYWR9IHsKCW5vdGJ1c3kgY2hlcnJ5cGljawoJZXJyb3JfcG9wdXAgIk5vIGNoYW5nZXMgY29tbWl0dGVkIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgYWxscGFyZW50cygkbmV3aGVhZCkgJG9sZGhlYWQKICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJG9sZGhlYWQpICRuZXdoZWFkCiAgICBzZXQgZGVzY19oZWFkcygkbmV3aGVhZCkgJG1haW5oZWFkCiAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRvbGRoZWFkKV19IHsKCXNldCBhbmNfdGFncygkbmV3aGVhZCkgJGFuY190YWdzKCRvbGRoZWFkKQogICAgfQogICAgc2V0IGRlc2NfdGFncygkbmV3aGVhZCkge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRvbGRoZWFkKV19IHsKCWluc2VydHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRvbGRoZWFkKSAkbmV3aGVhZAoJaWYgeyRtYWluaGVhZCBuZSB7fX0gewoJICAgIG1vdmVkaGVhZCAkbmV3aGVhZCAkbWFpbmhlYWQKCX0KCXJlZHJhd3RhZ3MgJG9sZGhlYWQKCXJlZHJhd3RhZ3MgJG5ld2hlYWQKICAgIH0KICAgIG5vdGJ1c3kgY2hlcnJ5cGljawp9CgojIGNvbnRleHQgbWVudSBmb3IgYSBoZWFkCnByb2MgaGVhZG1lbnUge3ggeSBpZCBoZWFkfSB7CiAgICBnbG9iYWwgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgaGVhZGN0eG1lbnUKCiAgICBzZXQgaGVhZG1lbnVpZCAkaWQKICAgIHNldCBoZWFkbWVudWhlYWQgJGhlYWQKICAgIHRrX3BvcHVwICRoZWFkY3R4bWVudSAkeCAkeQp9Cgpwcm9jIGNvYnJhbmNoIHt9IHsKICAgIGdsb2JhbCBoZWFkbWVudWlkIGhlYWRtZW51aGVhZCBtYWluaGVhZCBoZWFkaWRzCgogICAgIyBjaGVjayB0aGUgdHJlZSBpcyBjbGVhbiBmaXJzdD8/CiAgICBzZXQgb2xkbWFpbmhlYWQgJG1haW5oZWFkCiAgICBub3didXN5IGNoZWNrb3V0CiAgICB1cGRhdGUKICAgIGlmIHtbY2F0Y2ggewoJZXhlYyBnaXQgY2hlY2tvdXQgJGhlYWRtZW51aGVhZAogICAgfSBlcnJdfSB7Cglub3RidXN5IGNoZWNrb3V0CgllcnJvcl9wb3B1cCAkZXJyCiAgICB9IGVsc2UgewoJbm90YnVzeSBjaGVja291dAoJc2V0IG1haW5oZWFkICRoZWFkbWVudWhlYWQKCWlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkb2xkbWFpbmhlYWQpXX0gewoJICAgIHJlZHJhd3RhZ3MgJGhlYWRpZHMoJG9sZG1haW5oZWFkKQoJfQoJcmVkcmF3dGFncyAkaGVhZG1lbnVpZAogICAgfQp9Cgpwcm9jIHJtYnJhbmNoIHt9IHsKICAgIGdsb2JhbCBkZXNjX2hlYWRzIGhlYWRtZW51aWQgaGVhZG1lbnVoZWFkIG1haW5oZWFkCiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IGhlYWQgJGhlYWRtZW51aGVhZAogICAgc2V0IGlkICRoZWFkbWVudWlkCiAgICBpZiB7JGhlYWQgZXEgJG1haW5oZWFkfSB7CgllcnJvcl9wb3B1cCAiQ2Fubm90IGRlbGV0ZSB0aGUgY3VycmVudGx5IGNoZWNrZWQtb3V0IGJyYW5jaCIKCXJldHVybgogICAgfQogICAgaWYgeyRkZXNjX2hlYWRzKCRpZCkgZXEgJGhlYWR9IHsKCSMgdGhlIHN0dWZmIG9uIHRoaXMgYnJhbmNoIGlzbid0IG9uIGFueSBvdGhlciBicmFuY2gKCWlmIHshW2NvbmZpcm1fcG9wdXAgIlRoZSBjb21taXRzIG9uIGJyYW5jaCAkaGVhZCBhcmVuJ3Qgb24gYW55IG90aGVyXAoJCQlicmFuY2guXG5SZWFsbHkgZGVsZXRlIGJyYW5jaCAkaGVhZD8iXX0gcmV0dXJuCiAgICB9CiAgICBub3didXN5IHJtYnJhbmNoCiAgICB1cGRhdGUKICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0IGJyYW5jaCAtRCAkaGVhZH0gZXJyXX0gewoJbm90YnVzeSBybWJyYW5jaAoJZXJyb3JfcG9wdXAgJGVycgoJcmV0dXJuCiAgICB9CiAgICByZW1vdmVkaGVhZCAkaWQgJGhlYWQKICAgIHJlZHJhd3RhZ3MgJGlkCiAgICBub3RidXN5IHJtYnJhbmNoCn0KCiMgU3R1ZmYgZm9yIGZpbmRpbmcgbmVhcmJ5IHRhZ3MKcHJvYyBnZXRhbGxjb21taXRzIHt9IHsKICAgIGdsb2JhbCBhbGxjc3RhcnQgYWxsY29tbWl0cyBhbGxjZmQgYWxsaWRzCgogICAgc2V0IGFsbGlkcyB7fQogICAgc2V0IGZkIFtvcGVuIFtjb25jYXQgfCBnaXQgcmV2LWxpc3QgLS1hbGwgLS10b3BvLW9yZGVyIC0tcGFyZW50c10gcl0KICAgIHNldCBhbGxjZmQgJGZkCiAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMAogICAgc2V0IGFsbGNvbW1pdHMgInJlYWRpbmciCiAgICBub3didXN5IGFsbGNvbW1pdHMKICAgIHJlc3RhcnRnZXRhbGwgJGZkCn0KCnByb2MgZGlzY2FyZGFsbGNvbW1pdHMge30gewogICAgZ2xvYmFsIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cyBhbGxjZmQKICAgIGdsb2JhbCBkZXNjX3RhZ3MgYW5jX3RhZ3MgYWxsZHRhZ3MgdGFnaXNkZXNjIGFsbGlkcyBkZXNjX2hlYWRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHJldHVybgogICAgaWYgeyRhbGxjb21taXRzIGVxICJyZWFkaW5nIn0gewoJY2F0Y2gge2Nsb3NlICRhbGxjZmR9CiAgICB9CiAgICBmb3JlYWNoIHYge2FsbGNvbW1pdHMgYWxsY2hpbGRyZW4gYWxscGFyZW50cyBhbGxpZHMgZGVzY190YWdzIGFuY190YWdzCgkJYWxsZHRhZ3MgdGFnaXNkZXNjIGRlc2NfaGVhZHN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KfQoKcHJvYyByZXN0YXJ0Z2V0YWxsIHtmZH0gewogICAgZ2xvYmFsIGFsbGNzdGFydAoKICAgIGZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgZ2V0YWxsY2xpbmVzICRmZF0KICAgIHNldCBhbGxjc3RhcnQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQp9Cgpwcm9jIGNvbWJpbmVfZHRhZ3Mge2wxIGwyfSB7CiAgICBnbG9iYWwgdGFnaXNkZXNjIG5vdGZpcnN0ZAoKICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKCXNldCB4IFtsaW5kZXggJHJlcyAkaV0KCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpc2Rlc2MoJHgsJHkpXX0gewoJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA+IDB9IHsKCQkgICAgIyB4IGlzIGEgZGVzY2VuZGVudCBvZiB5LCBleGNsdWRlIHgKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaSAkaV0KCQkgICAgaW5jciBpIC0xCgkJICAgIGJyZWFrCgkJfSBlbHNlIHsKCQkgICAgIyB5IGlzIGEgZGVzY2VuZGVudCBvZiB4LCBleGNsdWRlIHkKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaiAkal0KCQl9CgkgICAgfSBlbHNlIHsKCQkjIG5vIHJlbGF0aW9uLCBrZWVwIGdvaW5nCgkJaW5jciBqCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBjb21iaW5lX2F0YWdzIHtsMSBsMn0gewogICAgZ2xvYmFsIHRhZ2lzZGVzYwoKICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKCXNldCB4IFtsaW5kZXggJHJlcyAkaV0KCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpc2Rlc2MoJHgsJHkpXX0gewoJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA8IDB9IHsKCQkgICAgIyB4IGlzIGFuIGFuY2VzdG9yIG9mIHksIGV4Y2x1ZGUgeAoJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRpICRpXQoJCSAgICBpbmNyIGkgLTEKCQkgICAgYnJlYWsKCQl9IGVsc2UgewoJCSAgICAjIHkgaXMgYW4gYW5jZXN0b3Igb2YgeCwgZXhjbHVkZSB5CgkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGogJGpdCgkJfQoJICAgIH0gZWxzZSB7CgkJIyBubyByZWxhdGlvbiwga2VlcCBnb2luZwoJCWluY3IgagoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkcmVzCn0KCnByb2MgZm9yd2FyZF9wYXNzIHtpZCBjaGlsZHJlbn0gewogICAgZ2xvYmFsIGlkdGFncyBkZXNjX3RhZ3MgaWRoZWFkcyBkZXNjX2hlYWRzIGFsbGR0YWdzIHRhZ2lzZGVzYwoKICAgIHNldCBkdGFncyB7fQogICAgc2V0IGRoZWFkcyB7fQogICAgZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4gewoJaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGNoaWxkKV19IHsKCSAgICBzZXQgY3RhZ3MgW2xpc3QgJGNoaWxkXQoJfSBlbHNlIHsKCSAgICBzZXQgY3RhZ3MgJGRlc2NfdGFncygkY2hpbGQpCgl9CglpZiB7JGR0YWdzIGVxIHt9fSB7CgkgICAgc2V0IGR0YWdzICRjdGFncwoJfSBlbHNlaWYgeyRjdGFncyBuZSAkZHRhZ3N9IHsKCSAgICBzZXQgZHRhZ3MgW2NvbWJpbmVfZHRhZ3MgJGR0YWdzICRjdGFnc10KCX0KCXNldCBjaGVhZHMgJGRlc2NfaGVhZHMoJGNoaWxkKQoJaWYgeyRkaGVhZHMgZXEge319IHsKCSAgICBzZXQgZGhlYWRzICRjaGVhZHMKCX0gZWxzZWlmIHskY2hlYWRzIG5lICRkaGVhZHN9IHsKCSAgICBzZXQgZGhlYWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJGRoZWFkcyAkY2hlYWRzXV0KCX0KICAgIH0KICAgIHNldCBkZXNjX3RhZ3MoJGlkKSAkZHRhZ3MKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgYWR0ICRkdGFncwoJZm9yZWFjaCB0YWcgJGR0YWdzIHsKCSAgICBzZXQgYWR0IFtjb25jYXQgJGFkdCAkYWxsZHRhZ3MoJHRhZyldCgl9CglzZXQgYWR0IFtsc29ydCAtdW5pcXVlICRhZHRdCglzZXQgYWxsZHRhZ3MoJGlkKSAkYWR0Cglmb3JlYWNoIHRhZyAkYWR0IHsKCSAgICBzZXQgdGFnaXNkZXNjKCRpZCwkdGFnKSAtMQoJICAgIHNldCB0YWdpc2Rlc2MoJHRhZywkaWQpIDEKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IGRoZWFkcyBbY29uY2F0ICRkaGVhZHMgJGlkaGVhZHMoJGlkKV0KICAgIH0KICAgIHNldCBkZXNjX2hlYWRzKCRpZCkgJGRoZWFkcwp9Cgpwcm9jIGdldGFsbGNsaW5lcyB7ZmR9IHsKICAgIGdsb2JhbCBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMgYWxsY3N0YXJ0CiAgICBnbG9iYWwgZGVzY190YWdzIGFuY190YWdzIGlkdGFncyB0YWdpc2Rlc2MgYWxsaWRzCiAgICBnbG9iYWwgaWRoZWFkcyB0cmF2aW5kZXgKCiAgICB3aGlsZSB7W2dldHMgJGZkIGxpbmVdID49IDB9IHsKCXNldCBpZCBbbGluZGV4ICRsaW5lIDBdCglsYXBwZW5kIGFsbGlkcyAkaWQKCXNldCBvbGRzIFtscmFuZ2UgJGxpbmUgMSBlbmRdCglzZXQgYWxscGFyZW50cygkaWQpICRvbGRzCglpZiB7IVtpbmZvIGV4aXN0cyBhbGxjaGlsZHJlbigkaWQpXX0gewoJICAgIHNldCBhbGxjaGlsZHJlbigkaWQpIHt9Cgl9Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJHApICRpZAoJfQoJIyBjb21wdXRlIG5lYXJlc3QgdGFnZ2VkIGRlc2NlbmRlbnRzIGFzIHdlIGdvCgkjIGFsc28gY29tcHV0ZSBkZXNjZW5kZW50IGhlYWRzCglmb3J3YXJkX3Bhc3MgJGlkICRhbGxjaGlsZHJlbigkaWQpCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRhbGxjc3RhcnQgPj0gNTB9IHsKCSAgICBmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIHt9CgkgICAgYWZ0ZXIgaWRsZSByZXN0YXJ0Z2V0YWxsICRmZAoJICAgIHJldHVybgoJfQogICAgfQogICAgaWYge1tlb2YgJGZkXX0gewoJc2V0IHRyYXZpbmRleCBbbGxlbmd0aCAkYWxsaWRzXQoJc2V0IGFsbGNvbW1pdHMgInRyYXZlcnNpbmciCglhZnRlciBpZGxlIHJlc3RhcnRhdGFncwoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIHJlYWRpbmcgZnVsbCBjb21taXQgZ3JhcGg6ICRlcnIuXG5cCgkJCSBSZXN1bHRzIG1heSBiZSBpbmNvbXBsZXRlLiIKCX0KICAgIH0KfQoKIyB3YWxrIGJhY2t3YXJkIHRocm91Z2ggdGhlIHRyZWUgYW5kIGNvbXB1dGUgbmVhcmVzdCB0YWdnZWQgYW5jZXN0b3JzCnByb2MgcmVzdGFydGF0YWdzIHt9IHsKICAgIGdsb2JhbCBhbGxpZHMgYWxscGFyZW50cyBpZHRhZ3MgYW5jX3RhZ3MgdHJhdmluZGV4CgogICAgc2V0IHQwIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBpICR0cmF2aW5kZXgKICAgIHdoaWxlIHtbaW5jciBpIC0xXSA+PSAwfSB7CglzZXQgaWQgW2xpbmRleCAkYWxsaWRzICRpXQoJc2V0IGF0YWdzIHt9Cglmb3JlYWNoIHAgJGFsbHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJHApXX0gewoJCXNldCBwdGFncyBbbGlzdCAkcF0KCSAgICB9IGVsc2UgewoJCXNldCBwdGFncyAkYW5jX3RhZ3MoJHApCgkgICAgfQoJICAgIGlmIHskYXRhZ3MgZXEge319IHsKCQlzZXQgYXRhZ3MgJHB0YWdzCgkgICAgfSBlbHNlaWYgeyRwdGFncyBuZSAkYXRhZ3N9IHsKCQlzZXQgYXRhZ3MgW2NvbWJpbmVfYXRhZ3MgJGF0YWdzICRwdGFnc10KCSAgICB9Cgl9CglzZXQgYW5jX3RhZ3MoJGlkKSAkYXRhZ3MKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHQwID49IDUwfSB7CgkgICAgc2V0IHRyYXZpbmRleCAkaQoJICAgIGFmdGVyIGlkbGUgcmVzdGFydGF0YWdzCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYWxsY29tbWl0cyAiZG9uZSIKICAgIHNldCB0cmF2aW5kZXggMAogICAgbm90YnVzeSBhbGxjb21taXRzCiAgICBkaXNwbmVhcnRhZ3MKfQoKIyB1cGRhdGUgdGhlIGRlc2NfdGFncyBhbmQgYW5jX3RhZ3MgYXJyYXlzIGZvciBhIG5ldyB0YWcganVzdCBhZGRlZApwcm9jIGFkZGVkdGFnIHtpZH0gewogICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMKICAgIGdsb2JhbCBpZHRhZ3MgdGFnaXNkZXNjIGFsbGR0YWdzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSByZXR1cm4KICAgIHNldCBhZHQgJGRlc2NfdGFncygkaWQpCiAgICBmb3JlYWNoIHQgJGRlc2NfdGFncygkaWQpIHsKCXNldCBhZHQgW2NvbmNhdCAkYWR0ICRhbGxkdGFncygkdCldCiAgICB9CiAgICBzZXQgYWR0IFtsc29ydCAtdW5pcXVlICRhZHRdCiAgICBzZXQgYWxsZHRhZ3MoJGlkKSAkYWR0CiAgICBmb3JlYWNoIHQgJGFkdCB7CglzZXQgdGFnaXNkZXNjKCRpZCwkdCkgLTEKCXNldCB0YWdpc2Rlc2MoJHQsJGlkKSAxCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSB7CglzZXQgdG9kbyAkYW5jX3RhZ3MoJGlkKQoJd2hpbGUgeyR0b2RvIG5lIHt9fSB7CgkgICAgc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCSAgICBzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCRpZCwkZG8pXX0gY29udGludWUKCSAgICBzZXQgdGFnaXNkZXNjKCRkbywkaWQpIC0xCgkgICAgc2V0IHRhZ2lzZGVzYygkaWQsJGRvKSAxCgkgICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkZG8pXX0gewoJCXNldCB0b2RvIFtjb25jYXQgJHRvZG8gJGFuY190YWdzKCRkbyldCgkgICAgfQoJfQogICAgfQoKICAgIHNldCBsYXN0b2xkICRkZXNjX3RhZ3MoJGlkKQogICAgc2V0IGxhc3RuZXcgW2xpc3QgJGlkXQogICAgc2V0IG51cCAwCiAgICBzZXQgbmNoIDAKICAgIHNldCB0b2RvICRhbGxwYXJlbnRzKCRpZCkKICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGRvKV19IGNvbnRpbnVlCglpZiB7JGRlc2NfdGFncygkZG8pIG5lICRsYXN0b2xkfSB7CgkgICAgc2V0IGxhc3RvbGQgJGRlc2NfdGFncygkZG8pCgkgICAgc2V0IGxhc3RuZXcgW2NvbWJpbmVfZHRhZ3MgJGxhc3RvbGQgW2xpc3QgJGlkXV0KCSAgICBpbmNyIG5jaAoJfQoJaWYgeyRsYXN0b2xkIGVxICRsYXN0bmV3fSBjb250aW51ZQoJc2V0IGRlc2NfdGFncygkZG8pICRsYXN0bmV3CglpbmNyIG51cAoJaWYgeyFbaW5mbyBleGlzdHMgaWR0YWdzKCRkbyldfSB7CgkgICAgc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkYWxscGFyZW50cygkZG8pXQoJfQogICAgfQoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSByZXR1cm4KICAgIHNldCBsYXN0b2xkICRhbmNfdGFncygkaWQpCiAgICBzZXQgbGFzdG5ldyBbbGlzdCAkaWRdCiAgICBzZXQgbnVwIDAKICAgIHNldCBuY2ggMAogICAgc2V0IHRvZG8gJGFsbGNoaWxkcmVuKCRpZCkKICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBhbmNfdGFncygkZG8pXX0gY29udGludWUKCWlmIHskYW5jX3RhZ3MoJGRvKSBuZSAkbGFzdG9sZH0gewoJICAgIHNldCBsYXN0b2xkICRhbmNfdGFncygkZG8pCgkgICAgc2V0IGxhc3RuZXcgW2NvbWJpbmVfYXRhZ3MgJGxhc3RvbGQgW2xpc3QgJGlkXV0KCSAgICBpbmNyIG5jaAoJfQoJaWYgeyRsYXN0b2xkIGVxICRsYXN0bmV3fSBjb250aW51ZQoJc2V0IGFuY190YWdzKCRkbykgJGxhc3RuZXcKCWluY3IgbnVwCglpZiB7IVtpbmZvIGV4aXN0cyBpZHRhZ3MoJGRvKV19IHsKCSAgICBzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRhbGxjaGlsZHJlbigkZG8pXQoJfQogICAgfQp9CgojIHVwZGF0ZSB0aGUgZGVzY19oZWFkcyBhcnJheSBmb3IgYSBuZXcgaGVhZCBqdXN0IGFkZGVkCnByb2MgYWRkZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgaGVhZGlkcygkaGVhZCkgJGhpZAogICAgbGFwcGVuZCBpZGhlYWRzKCRoaWQpICRoZWFkCgogICAgc2V0IHRvZG8gW2xpc3QgJGhpZF0KICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRkbyldIHx8CgkgICAgW2xzZWFyY2ggLWV4YWN0ICRkZXNjX2hlYWRzKCRkbykgJGhlYWRdID49IDB9IGNvbnRpbnVlCglzZXQgb2xkaGVhZHMgJGRlc2NfaGVhZHMoJGRvKQoJbGFwcGVuZCBkZXNjX2hlYWRzKCRkbykgJGhlYWQKCXNldCBoZWFkcyAkZGVzY19oZWFkcygkZG8pCgl3aGlsZSB7MX0gewoJICAgIHNldCBwICRhbGxwYXJlbnRzKCRkbykKCSAgICBpZiB7W2xsZW5ndGggJHBdICE9IDEgfHwgIVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRwKV0gfHwKCQkkZGVzY19oZWFkcygkcCkgbmUgJG9sZGhlYWRzfSBicmVhawoJICAgIHNldCBkbyAkcAoJICAgIHNldCBkZXNjX2hlYWRzKCRkbykgJGhlYWRzCgl9CglzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRwXQogICAgfQp9CgojIHVwZGF0ZSB0aGUgZGVzY19oZWFkcyBhcnJheSBmb3IgYSBoZWFkIGp1c3QgcmVtb3ZlZApwcm9jIHJlbW92ZWRoZWFkIHtoaWQgaGVhZH0gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgYWxscGFyZW50cyBoZWFkaWRzIGlkaGVhZHMKCiAgICB1bnNldCBoZWFkaWRzKCRoZWFkKQogICAgaWYgeyRpZGhlYWRzKCRoaWQpIGVxICRoZWFkfSB7Cgl1bnNldCBpZGhlYWRzKCRoaWQpCiAgICB9IGVsc2UgewoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZGhlYWRzKCRoaWQpICRoZWFkXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkaGlkKSBbbHJlcGxhY2UgJGlkaGVhZHMoJGhpZCkgJGkgJGldCgl9CiAgICB9CgogICAgc2V0IHRvZG8gW2xpc3QgJGhpZF0KICAgIHdoaWxlIHskdG9kbyBuZSB7fX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gMF0KCXNldCB0b2RvIFtscmFuZ2UgJHRvZG8gMSBlbmRdCglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjX2hlYWRzKCRkbyldfSBjb250aW51ZQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRkZXNjX2hlYWRzKCRkbykgJGhlYWRdCglpZiB7JGkgPCAwfSBjb250aW51ZQoJc2V0IG9sZGhlYWRzICRkZXNjX2hlYWRzKCRkbykKCXNldCBoZWFkcyBbbHJlcGxhY2UgJGRlc2NfaGVhZHMoJGRvKSAkaSAkaV0KCXdoaWxlIHsxfSB7CgkgICAgc2V0IGRlc2NfaGVhZHMoJGRvKSAkaGVhZHMKCSAgICBzZXQgcCAkYWxscGFyZW50cygkZG8pCgkgICAgaWYge1tsbGVuZ3RoICRwXSAhPSAxIHx8ICFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcCldIHx8CgkJJGRlc2NfaGVhZHMoJHApIG5lICRvbGRoZWFkc30gYnJlYWsKCSAgICBzZXQgZG8gJHAKCX0KCXNldCB0b2RvIFtjb25jYXQgJHRvZG8gJHBdCiAgICB9Cn0KCiMgdXBkYXRlIHRoaW5ncyBmb3IgYSBoZWFkIG1vdmVkIHRvIGEgY2hpbGQgb2YgaXRzIHByZXZpb3VzIGxvY2F0aW9uCnByb2MgbW92ZWRoZWFkIHtpZCBuYW1lfSB7CiAgICBnbG9iYWwgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IG9sZGlkICRoZWFkaWRzKCRuYW1lKQogICAgc2V0IGhlYWRpZHMoJG5hbWUpICRpZAogICAgaWYgeyRpZGhlYWRzKCRvbGRpZCkgZXEgJG5hbWV9IHsKCXVuc2V0IGlkaGVhZHMoJG9sZGlkKQogICAgfSBlbHNlIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRoZWFkcygkb2xkaWQpICRuYW1lXQoJaWYgeyRpID49IDB9IHsKCSAgICBzZXQgaWRoZWFkcygkb2xkaWQpIFtscmVwbGFjZSAkaWRoZWFkcygkb2xkaWQpICRpICRpXQoJfQogICAgfQogICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKfQoKcHJvYyBjaGFuZ2VkcmVmcyB7fSB7CiAgICBnbG9iYWwgZGVzY19oZWFkcyBkZXNjX3RhZ3MgYW5jX3RhZ3MgYWxsY29tbWl0cyBhbGxpZHMKICAgIGdsb2JhbCBhbGxjaGlsZHJlbiBhbGxwYXJlbnRzIGlkdGFncyB0cmF2aW5kZXgKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gcmV0dXJuCiAgICBjYXRjaCB7dW5zZXQgZGVzY19oZWFkc30KICAgIGNhdGNoIHt1bnNldCBkZXNjX3RhZ3N9CiAgICBjYXRjaCB7dW5zZXQgYW5jX3RhZ3N9CiAgICBjYXRjaCB7dW5zZXQgYWxsZHRhZ3N9CiAgICBjYXRjaCB7dW5zZXQgdGFnaXNkZXNjfQogICAgZm9yZWFjaCBpZCAkYWxsaWRzIHsKCWZvcndhcmRfcGFzcyAkaWQgJGFsbGNoaWxkcmVuKCRpZCkKICAgIH0KICAgIGlmIHskYWxsY29tbWl0cyBuZSAicmVhZGluZyJ9IHsKCXNldCB0cmF2aW5kZXggW2xsZW5ndGggJGFsbGlkc10KCWlmIHskYWxsY29tbWl0cyBuZSAidHJhdmVyc2luZyJ9IHsKCSAgICBzZXQgYWxsY29tbWl0cyAidHJhdmVyc2luZyIKCSAgICBhZnRlciBpZGxlIHJlc3RhcnRhdGFncwoJfQogICAgfQp9Cgpwcm9jIHJlcmVhZHJlZnMge30gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCgogICAgc2V0IHJlZmlkcyBbY29uY2F0IFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkgICAgW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dCiAgICBmb3JlYWNoIGlkICRyZWZpZHMgewoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldfSB7CgkgICAgc2V0IHJlZigkaWQpIFtsaXN0cmVmcyAkaWRdCgl9CiAgICB9CiAgICBzZXQgb2xkbWFpbmhlYWQgJG1haW5oZWFkCiAgICByZWFkcmVmcwogICAgY2hhbmdlZHJlZnMKICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkJW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCXNldCB2IFtsaXN0cmVmcyAkaWRdCglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV0gfHwgJHJlZigkaWQpICE9ICR2IHx8CgkgICAgKCRpZCBlcSAkb2xkbWFpbmhlYWQgJiYgJGlkIG5lICRtYWluaGVhZCkgfHwKCSAgICAoJGlkIGVxICRtYWluaGVhZCAmJiAkaWQgbmUgJG9sZG1haW5oZWFkKX0gewoJICAgIHJlZHJhd3RhZ3MgJGlkCgl9CiAgICB9Cn0KCnByb2MgbGlzdHJlZnMge2lkfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMKCiAgICBzZXQgeCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCB4ICRpZHRhZ3MoJGlkKQogICAgfQogICAgc2V0IHkge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IHkgJGlkaGVhZHMoJGlkKQogICAgfQogICAgc2V0IHoge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB6ICRpZG90aGVycmVmcygkaWQpCiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHggJHkgJHpdCn0KCnByb2Mgc2hvd3RhZyB7dGFnIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgdGFnY29udGVudHMgdGFnaWRzIGxpbmtudW0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3Qgc2hvd3RhZyAkdGFnIDBdCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgc2V0IGxpbmtudW0gMAogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdjb250ZW50cygkdGFnKV19IHsKCXNldCB0ZXh0ICR0YWdjb250ZW50cygkdGFnKQogICAgfSBlbHNlIHsKCXNldCB0ZXh0ICJUYWc6ICR0YWdcbklkOiAgJHRhZ2lkcygkdGFnKSIKICAgIH0KICAgIGFwcGVuZHdpdGhsaW5rcyAkdGV4dCB7fQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpbml0X2ZsaXN0IHt9Cn0KCnByb2MgZG9xdWl0IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkCiAgICBzZXQgc3RvcHBlZCAxMDAKICAgIGRlc3Ryb3kgLgp9Cgpwcm9jIGRvcHJlZnMge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgYmdjb2xvciBmZ2NvbG9yIGN0ZXh0IGRpZmZjb2xvcnMKCiAgICBzZXQgdG9wIC5naXRrcHJlZnMKICAgIHNldCBwcmVmc3RvcCAkdG9wCiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFnc30gewoJc2V0IG9sZHByZWZzKCR2KSBbc2V0ICR2XQogICAgfQogICAgdG9wbGV2ZWwgJHRvcAogICAgd20gdGl0bGUgJHRvcCAiR2l0ayBwcmVmZXJlbmNlcyIKICAgIGxhYmVsICR0b3AubGRpc3AgLXRleHQgIkNvbW1pdCBsaXN0IGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5sZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5zcGFjZXIgLXRleHQgIiAiCiAgICBsYWJlbCAkdG9wLm1heHdpZHRobCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAobGluZXMpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4d2lkdGggLWZyb20gMCAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4d2lkdGgKICAgIGdyaWQgJHRvcC5zcGFjZXIgJHRvcC5tYXh3aWR0aGwgJHRvcC5tYXh3aWR0aCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AubWF4cGN0bCAtdGV4dCAiTWF4aW11bSBncmFwaCB3aWR0aCAoJSBvZiBwYW5lKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHBjdCAtZnJvbSAxIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXhncmFwaHBjdAogICAgZ3JpZCB4ICR0b3AubWF4cGN0bCAkdG9wLm1heHBjdCAtc3RpY2t5IHcKCiAgICBsYWJlbCAkdG9wLmRkaXNwIC10ZXh0ICJEaWZmIGRpc3BsYXkgb3B0aW9ucyIKICAgIGdyaWQgJHRvcC5kZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5kaWZmb3B0bCAtdGV4dCAiT3B0aW9ucyBmb3IgZGlmZiBwcm9ncmFtIiBcCgktZm9udCBvcHRpb25mb250CiAgICBlbnRyeSAkdG9wLmRpZmZvcHQgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgZGlmZm9wdHMKICAgIGdyaWQgeCAkdG9wLmRpZmZvcHRsICR0b3AuZGlmZm9wdCAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AubnRhZwogICAgbGFiZWwgJHRvcC5udGFnLmwgLXRleHQgIkRpc3BsYXkgbmVhcmJ5IHRhZ3MiIC1mb250IG9wdGlvbmZvbnQKICAgIGNoZWNrYnV0dG9uICR0b3AubnRhZy5iIC12YXJpYWJsZSBzaG93bmVhcnRhZ3MKICAgIHBhY2sgJHRvcC5udGFnLmIgJHRvcC5udGFnLmwgLXNpZGUgbGVmdAogICAgZ3JpZCB4ICR0b3AubnRhZyAtc3RpY2t5IHcKCiAgICBsYWJlbCAkdG9wLmNkaXNwIC10ZXh0ICJDb2xvcnM6IHByZXNzIHRvIGNob29zZSIKICAgIGdyaWQgJHRvcC5jZGlzcCAtIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5iZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGJnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmJnYnV0IC10ZXh0ICJCYWNrZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGJnY29sb3IgMCAkdG9wLmJnIGJhY2tncm91bmQgc2V0YmddCiAgICBncmlkIHggJHRvcC5iZ2J1dCAkdG9wLmJnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5mZyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgJGZnY29sb3IKICAgIGJ1dHRvbiAkdG9wLmZnYnV0IC10ZXh0ICJGb3JlZ3JvdW5kIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGZnY29sb3IgMCAkdG9wLmZnIGZvcmVncm91bmQgc2V0ZmddCiAgICBncmlkIHggJHRvcC5mZ2J1dCAkdG9wLmZnIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kaWZmb2xkIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDBdCiAgICBidXR0b24gJHRvcC5kaWZmb2xkYnV0IC10ZXh0ICJEaWZmOiBvbGQgbGluZXMiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAwICR0b3AuZGlmZm9sZCAiZGlmZiBvbGQgbGluZXMiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuZGlmZm9sZGJ1dCAkdG9wLmRpZmZvbGQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmRpZmZuZXcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMV0KICAgIGJ1dHRvbiAkdG9wLmRpZmZuZXdidXQgLXRleHQgIkRpZmY6IG5ldyBsaW5lcyIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBkaWZmY29sb3JzIDEgJHRvcC5kaWZmbmV3ICJkaWZmIG5ldyBsaW5lcyIgXAoJCSAgICAgIFtsaXN0ICRjdGV4dCB0YWcgY29uZiBkMSAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5kaWZmbmV3YnV0ICR0b3AuZGlmZm5ldyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuaHVua3NlcCAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAyXQogICAgYnV0dG9uICR0b3AuaHVua3NlcGJ1dCAtdGV4dCAiRGlmZjogaHVuayBoZWFkZXIiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAyICR0b3AuaHVua3NlcCBcCgkJICAgICAgImRpZmYgaHVuayBoZWFkZXIiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5odW5rc2VwYnV0ICR0b3AuaHVua3NlcCAtc3RpY2t5IHcKCiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBwcmVmc29rCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBwcmVmc2NhbgogICAgZ3JpZCAkdG9wLmJ1dHMub2sgJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC0gLXBhZHkgMTAgLXN0aWNreSBldwp9Cgpwcm9jIGNob29zZWNvbG9yIHt2IHZpIHcgeCBjbWR9IHsKICAgIGdsb2JhbCAkdgoKICAgIHNldCBjIFt0a19jaG9vc2VDb2xvciAtaW5pdGlhbGNvbG9yIFtsaW5kZXggW3NldCAkdl0gJHZpXSBcCgkgICAgICAgLXRpdGxlICJHaXRrOiBjaG9vc2UgY29sb3IgZm9yICR4Il0KICAgIGlmIHskYyBlcSB7fX0gcmV0dXJuCiAgICAkdyBjb25mIC1iYWNrZ3JvdW5kICRjCiAgICBsc2V0ICR2ICR2aSAkYwogICAgZXZhbCAkY21kICRjCn0KCnByb2Mgc2V0Ymcge2N9IHsKICAgIGdsb2JhbCBiZ2xpc3QKCiAgICBmb3JlYWNoIHcgJGJnbGlzdCB7CgkkdyBjb25mIC1iYWNrZ3JvdW5kICRjCiAgICB9Cn0KCnByb2Mgc2V0Zmcge2N9IHsKICAgIGdsb2JhbCBmZ2xpc3QgY2FudgoKICAgIGZvcmVhY2ggdyAkZmdsaXN0IHsKCSR3IGNvbmYgLWZvcmVncm91bmQgJGMKICAgIH0KICAgIGFsbGNhbnZzIGl0ZW1jb25mIHRleHQgLWZpbGwgJGMKICAgICRjYW52IGl0ZW1jb25mIGNpcmNsZSAtb3V0bGluZSAkYwp9Cgpwcm9jIHByZWZzY2FuIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwoKICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzfSB7CglzZXQgJHYgJG9sZHByZWZzKCR2KQogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKfQoKcHJvYyBwcmVmc29rIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdAogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwoKICAgIGNhdGNoIHtkZXN0cm95ICRwcmVmc3RvcH0KICAgIHVuc2V0IHByZWZzdG9wCiAgICBpZiB7JG1heHdpZHRoICE9ICRvbGRwcmVmcyhtYXh3aWR0aCkKCXx8ICRtYXhncmFwaHBjdCAhPSAkb2xkcHJlZnMobWF4Z3JhcGhwY3QpfSB7CglyZWRpc3BsYXkKICAgIH0gZWxzZWlmIHskc2hvd25lYXJ0YWdzICE9ICRvbGRwcmVmcyhzaG93bmVhcnRhZ3MpfSB7CglyZXNlbGVjdGxpbmUKICAgIH0KfQoKcHJvYyBmb3JtYXRkYXRlIHtkfSB7CiAgICByZXR1cm4gW2Nsb2NrIGZvcm1hdCAkZCAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCn0KCiMgVGhpcyBsaXN0IG9mIGVuY29kaW5nIG5hbWVzIGFuZCBhbGlhc2VzIGlzIGRpc3RpbGxlZCBmcm9tCiMgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cy4KIyBOb3QgYWxsIG9mIHRoZW0gYXJlIHN1cHBvcnRlZCBieSBUY2wuCnNldCBlbmNvZGluZ19hbGlhc2VzIHsKICAgIHsgQU5TSV9YMy40LTE5NjggaXNvLWlyLTYgQU5TSV9YMy40LTE5ODYgSVNPXzY0Ni5pcnY6MTk5MSBBU0NJSQogICAgICBJU082NDYtVVMgVVMtQVNDSUkgdXMgSUJNMzY3IGNwMzY3IGNzQVNDSUkgfQogICAgeyBJU08tMTA2NDYtVVRGLTEgY3NJU08xMDY0NlVURjEgfQogICAgeyBJU09fNjQ2LmJhc2ljOjE5ODMgcmVmIGNzSVNPNjQ2YmFzaWMxOTgzIH0KICAgIHsgSU5WQVJJQU5UIGNzSU5WQVJJQU5UIH0KICAgIHsgSVNPXzY0Ni5pcnY6MTk4MyBpc28taXItMiBpcnYgY3NJU08ySW50bFJlZlZlcnNpb24gfQogICAgeyBCU180NzMwIGlzby1pci00IElTTzY0Ni1HQiBnYiB1ayBjc0lTTzRVbml0ZWRLaW5nZG9tIH0KICAgIHsgTkFUUy1TRUZJIGlzby1pci04LTEgY3NOQVRTU0VGSSB9CiAgICB7IE5BVFMtU0VGSS1BREQgaXNvLWlyLTgtMiBjc05BVFNTRUZJQUREIH0KICAgIHsgTkFUUy1EQU5PIGlzby1pci05LTEgY3NOQVRTREFOTyB9CiAgICB7IE5BVFMtREFOTy1BREQgaXNvLWlyLTktMiBjc05BVFNEQU5PQUREIH0KICAgIHsgU0VOXzg1MDIwMF9CIGlzby1pci0xMCBGSSBJU082NDYtRkkgSVNPNjQ2LVNFIHNlIGNzSVNPMTBTd2VkaXNoIH0KICAgIHsgU0VOXzg1MDIwMF9DIGlzby1pci0xMSBJU082NDYtU0UyIHNlMiBjc0lTTzExU3dlZGlzaEZvck5hbWVzIH0KICAgIHsgS1NfQ181NjAxLTE5ODcgaXNvLWlyLTE0OSBLU19DXzU2MDEtMTk4OSBLU0NfNTYwMSBrb3JlYW4gY3NLU0M1NjAxMTk4NyB9CiAgICB7IElTTy0yMDIyLUtSIGNzSVNPMjAyMktSIH0KICAgIHsgRVVDLUtSIGNzRVVDS1IgfQogICAgeyBJU08tMjAyMi1KUCBjc0lTTzIwMjJKUCB9CiAgICB7IElTTy0yMDIyLUpQLTIgY3NJU08yMDIySlAyIH0KICAgIHsgSklTX0M2MjIwLTE5NjktanAgSklTX0M2MjIwLTE5NjkgaXNvLWlyLTEzIGthdGFrYW5hIHgwMjAxLTcKICAgICAgY3NJU08xM0pJU0M2MjIwanAgfQogICAgeyBKSVNfQzYyMjAtMTk2OS1ybyBpc28taXItMTQganAgSVNPNjQ2LUpQIGNzSVNPMTRKSVNDNjIyMHJvIH0KICAgIHsgSVQgaXNvLWlyLTE1IElTTzY0Ni1JVCBjc0lTTzE1SXRhbGlhbiB9CiAgICB7IFBUIGlzby1pci0xNiBJU082NDYtUFQgY3NJU08xNlBvcnR1Z3Vlc2UgfQogICAgeyBFUyBpc28taXItMTcgSVNPNjQ2LUVTIGNzSVNPMTdTcGFuaXNoIH0KICAgIHsgZ3JlZWs3LW9sZCBpc28taXItMTggY3NJU08xOEdyZWVrN09sZCB9CiAgICB7IGxhdGluLWdyZWVrIGlzby1pci0xOSBjc0lTTzE5TGF0aW5HcmVlayB9CiAgICB7IERJTl82NjAwMyBpc28taXItMjEgZGUgSVNPNjQ2LURFIGNzSVNPMjFHZXJtYW4gfQogICAgeyBORl9aXzYyLTAxMF8oMTk3MykgaXNvLWlyLTI1IElTTzY0Ni1GUjEgY3NJU08yNUZyZW5jaCB9CiAgICB7IExhdGluLWdyZWVrLTEgaXNvLWlyLTI3IGNzSVNPMjdMYXRpbkdyZWVrMSB9CiAgICB7IElTT181NDI3IGlzby1pci0zNyBjc0lTTzU0MjdDeXJpbGxpYyB9CiAgICB7IEpJU19DNjIyNi0xOTc4IGlzby1pci00MiBjc0lTTzQySklTQzYyMjYxOTc4IH0KICAgIHsgQlNfdmlld2RhdGEgaXNvLWlyLTQ3IGNzSVNPNDdCU1ZpZXdkYXRhIH0KICAgIHsgSU5JUyBpc28taXItNDkgY3NJU080OUlOSVMgfQogICAgeyBJTklTLTggaXNvLWlyLTUwIGNzSVNPNTBJTklTOCB9CiAgICB7IElOSVMtY3lyaWxsaWMgaXNvLWlyLTUxIGNzSVNPNTFJTklTQ3lyaWxsaWMgfQogICAgeyBJU09fNTQyNzoxOTgxIGlzby1pci01NCBJU081NDI3Q3lyaWxsaWMxOTgxIH0KICAgIHsgSVNPXzU0Mjg6MTk4MCBpc28taXItNTUgY3NJU081NDI4R3JlZWsgfQogICAgeyBHQl8xOTg4LTgwIGlzby1pci01NyBjbiBJU082NDYtQ04gY3NJU081N0dCMTk4OCB9CiAgICB7IEdCXzIzMTItODAgaXNvLWlyLTU4IGNoaW5lc2UgY3NJU081OEdCMjMxMjgwIH0KICAgIHsgTlNfNDU1MS0xIGlzby1pci02MCBJU082NDYtTk8gbm8gY3NJU082MERhbmlzaE5vcndlZ2lhbgogICAgICBjc0lTTzYwTm9yd2VnaWFuMSB9CiAgICB7IE5TXzQ1NTEtMiBJU082NDYtTk8yIGlzby1pci02MSBubzIgY3NJU082MU5vcndlZ2lhbjIgfQogICAgeyBORl9aXzYyLTAxMCBpc28taXItNjkgSVNPNjQ2LUZSIGZyIGNzSVNPNjlGcmVuY2ggfQogICAgeyB2aWRlb3RleC1zdXBwbCBpc28taXItNzAgY3NJU083MFZpZGVvdGV4U3VwcDEgfQogICAgeyBQVDIgaXNvLWlyLTg0IElTTzY0Ni1QVDIgY3NJU084NFBvcnR1Z3Vlc2UyIH0KICAgIHsgRVMyIGlzby1pci04NSBJU082NDYtRVMyIGNzSVNPODVTcGFuaXNoMiB9CiAgICB7IE1TWl83Nzk1LjMgaXNvLWlyLTg2IElTTzY0Ni1IVSBodSBjc0lTTzg2SHVuZ2FyaWFuIH0KICAgIHsgSklTX0M2MjI2LTE5ODMgaXNvLWlyLTg3IHgwMjA4IEpJU19YMDIwOC0xOTgzIGNzSVNPODdKSVNYMDIwOCB9CiAgICB7IGdyZWVrNyBpc28taXItODggY3NJU084OEdyZWVrNyB9CiAgICB7IEFTTU9fNDQ5IElTT185MDM2IGFyYWJpYzcgaXNvLWlyLTg5IGNzSVNPODlBU01PNDQ5IH0KICAgIHsgaXNvLWlyLTkwIGNzSVNPOTAgfQogICAgeyBKSVNfQzYyMjktMTk4NC1hIGlzby1pci05MSBqcC1vY3ItYSBjc0lTTzkxSklTQzYyMjkxOTg0YSB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWIgaXNvLWlyLTkyIElTTzY0Ni1KUC1PQ1ItQiBqcC1vY3ItYgogICAgICBjc0lTTzkySklTQzYyOTkxOTg0YiB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWItYWRkIGlzby1pci05MyBqcC1vY3ItYi1hZGQgY3NJU085M0pJUzYyMjkxOTg0YmFkZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQgaXNvLWlyLTk0IGpwLW9jci1oYW5kIGNzSVNPOTRKSVM2MjI5MTk4NGhhbmQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kLWFkZCBpc28taXItOTUganAtb2NyLWhhbmQtYWRkCiAgICAgIGNzSVNPOTVKSVM2MjI5MTk4NGhhbmRhZGQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1rYW5hIGlzby1pci05NiBjc0lTTzk2SklTQzYyMjkxOTg0a2FuYSB9CiAgICB7IElTT18yMDMzLTE5ODMgaXNvLWlyLTk4IGUxM2IgY3NJU08yMDMzIH0KICAgIHsgQU5TSV9YMy4xMTAtMTk4MyBpc28taXItOTkgQ1NBX1Q1MDAtMTk4MyBOQVBMUFMgY3NJU085OU5BUExQUyB9CiAgICB7IElTT184ODU5LTE6MTk4NyBpc28taXItMTAwIElTT184ODU5LTEgSVNPLTg4NTktMSBsYXRpbjEgbDEgSUJNODE5CiAgICAgIENQODE5IGNzSVNPTGF0aW4xIH0KICAgIHsgSVNPXzg4NTktMjoxOTg3IGlzby1pci0xMDEgSVNPXzg4NTktMiBJU08tODg1OS0yIGxhdGluMiBsMiBjc0lTT0xhdGluMiB9CiAgICB7IFQuNjEtN2JpdCBpc28taXItMTAyIGNzSVNPMTAyVDYxN2JpdCB9CiAgICB7IFQuNjEtOGJpdCBULjYxIGlzby1pci0xMDMgY3NJU08xMDNUNjE4Yml0IH0KICAgIHsgSVNPXzg4NTktMzoxOTg4IGlzby1pci0xMDkgSVNPXzg4NTktMyBJU08tODg1OS0zIGxhdGluMyBsMyBjc0lTT0xhdGluMyB9CiAgICB7IElTT184ODU5LTQ6MTk4OCBpc28taXItMTEwIElTT184ODU5LTQgSVNPLTg4NTktNCBsYXRpbjQgbDQgY3NJU09MYXRpbjQgfQogICAgeyBFQ01BLWN5cmlsbGljIGlzby1pci0xMTEgS09JOC1FIGNzSVNPMTExRUNNQUN5cmlsbGljIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTEgaXNvLWlyLTEyMSBJU082NDYtQ0EgY3NhNy0xIGNhIGNzSVNPMTIxQ2FuYWRpYW4xIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LTIgaXNvLWlyLTEyMiBJU082NDYtQ0EyIGNzYTctMiBjc0lTTzEyMkNhbmFkaWFuMiB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS1nciBpc28taXItMTIzIGNzSVNPMTIzQ1NBWjI0MzQxOTg1Z3IgfQogICAgeyBJU09fODg1OS02OjE5ODcgaXNvLWlyLTEyNyBJU09fODg1OS02IElTTy04ODU5LTYgRUNNQS0xMTQgQVNNTy03MDgKICAgICAgYXJhYmljIGNzSVNPTGF0aW5BcmFiaWMgfQogICAgeyBJU09fODg1OS02LUUgY3NJU084ODU5NkUgSVNPLTg4NTktNi1FIH0KICAgIHsgSVNPXzg4NTktNi1JIGNzSVNPODg1OTZJIElTTy04ODU5LTYtSSB9CiAgICB7IElTT184ODU5LTc6MTk4NyBpc28taXItMTI2IElTT184ODU5LTcgSVNPLTg4NTktNyBFTE9UXzkyOCBFQ01BLTExOAogICAgICBncmVlayBncmVlazggY3NJU09MYXRpbkdyZWVrIH0KICAgIHsgVC4xMDEtRzIgaXNvLWlyLTEyOCBjc0lTTzEyOFQxMDFHMiB9CiAgICB7IElTT184ODU5LTg6MTk4OCBpc28taXItMTM4IElTT184ODU5LTggSVNPLTg4NTktOCBoZWJyZXcKICAgICAgY3NJU09MYXRpbkhlYnJldyB9CiAgICB7IElTT184ODU5LTgtRSBjc0lTTzg4NTk4RSBJU08tODg1OS04LUUgfQogICAgeyBJU09fODg1OS04LUkgY3NJU084ODU5OEkgSVNPLTg4NTktOC1JIH0KICAgIHsgQ1NOXzM2OTEwMyBpc28taXItMTM5IGNzSVNPMTM5Q1NOMzY5MTAzIH0KICAgIHsgSlVTX0kuQjEuMDAyIGlzby1pci0xNDEgSVNPNjQ2LVlVIGpzIHl1IGNzSVNPMTQxSlVTSUIxMDAyIH0KICAgIHsgSVNPXzY5MzctMi1hZGQgaXNvLWlyLTE0MiBjc0lTT1RleHRDb21tIH0KICAgIHsgSUVDX1AyNy0xIGlzby1pci0xNDMgY3NJU08xNDNJRUNQMjcxIH0KICAgIHsgSVNPXzg4NTktNToxOTg4IGlzby1pci0xNDQgSVNPXzg4NTktNSBJU08tODg1OS01IGN5cmlsbGljCiAgICAgIGNzSVNPTGF0aW5DeXJpbGxpYyB9CiAgICB7IEpVU19JLkIxLjAwMy1zZXJiIGlzby1pci0xNDYgc2VyYmlhbiBjc0lTTzE0NlNlcmJpYW4gfQogICAgeyBKVVNfSS5CMS4wMDMtbWFjIG1hY2Vkb25pYW4gaXNvLWlyLTE0NyBjc0lTTzE0N01hY2Vkb25pYW4gfQogICAgeyBJU09fODg1OS05OjE5ODkgaXNvLWlyLTE0OCBJU09fODg1OS05IElTTy04ODU5LTkgbGF0aW41IGw1IGNzSVNPTGF0aW41IH0KICAgIHsgZ3JlZWstY2NpdHQgaXNvLWlyLTE1MCBjc0lTTzE1MCBjc0lTTzE1MEdyZWVrQ0NJVFQgfQogICAgeyBOQ19OQzAwLTEwOjgxIGN1YmEgaXNvLWlyLTE1MSBJU082NDYtQ1UgY3NJU08xNTFDdWJhIH0KICAgIHsgSVNPXzY5MzctMi0yNSBpc28taXItMTUyIGNzSVNPNjkzN0FkZCB9CiAgICB7IEdPU1RfMTk3NjgtNzQgU1RfU0VWXzM1OC04OCBpc28taXItMTUzIGNzSVNPMTUzR09TVDE5NzY4NzQgfQogICAgeyBJU09fODg1OS1zdXBwIGlzby1pci0xNTQgbGF0aW4xLTItNSBjc0lTTzg4NTlTdXBwIH0KICAgIHsgSVNPXzEwMzY3LWJveCBpc28taXItMTU1IGNzSVNPMTAzNjdCb3ggfQogICAgeyBJU08tODg1OS0xMCBpc28taXItMTU3IGw2IElTT184ODU5LTEwOjE5OTIgY3NJU09MYXRpbjYgbGF0aW42IH0KICAgIHsgbGF0aW4tbGFwIGxhcCBpc28taXItMTU4IGNzSVNPMTU4TGFwIH0KICAgIHsgSklTX1gwMjEyLTE5OTAgeDAyMTIgaXNvLWlyLTE1OSBjc0lTTzE1OUpJU1gwMjEyMTk5MCB9CiAgICB7IERTXzIwODkgRFMyMDg5IElTTzY0Ni1ESyBkayBjc0lTTzY0NkRhbmlzaCB9CiAgICB7IHVzLWRrIGNzVVNESyB9CiAgICB7IGRrLXVzIGNzREtVUyB9CiAgICB7IEpJU19YMDIwMSBYMDIwMSBjc0hhbGZXaWR0aEthdGFrYW5hIH0KICAgIHsgS1NDNTYzNiBJU082NDYtS1IgY3NLU0M1NjM2IH0KICAgIHsgSVNPLTEwNjQ2LVVDUy0yIGNzVW5pY29kZSB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtNCBjc1VDUzQgfQogICAgeyBERUMtTUNTIGRlYyBjc0RFQ01DUyB9CiAgICB7IGhwLXJvbWFuOCByb21hbjggcjggY3NIUFJvbWFuOCB9CiAgICB7IG1hY2ludG9zaCBtYWMgY3NNYWNpbnRvc2ggfQogICAgeyBJQk0wMzcgY3AwMzcgZWJjZGljLWNwLXVzIGViY2RpYy1jcC1jYSBlYmNkaWMtY3Atd3QgZWJjZGljLWNwLW5sCiAgICAgIGNzSUJNMDM3IH0KICAgIHsgSUJNMDM4IEVCQ0RJQy1JTlQgY3AwMzggY3NJQk0wMzggfQogICAgeyBJQk0yNzMgQ1AyNzMgY3NJQk0yNzMgfQogICAgeyBJQk0yNzQgRUJDRElDLUJFIENQMjc0IGNzSUJNMjc0IH0KICAgIHsgSUJNMjc1IEVCQ0RJQy1CUiBjcDI3NSBjc0lCTTI3NSB9CiAgICB7IElCTTI3NyBFQkNESUMtQ1AtREsgRUJDRElDLUNQLU5PIGNzSUJNMjc3IH0KICAgIHsgSUJNMjc4IENQMjc4IGViY2RpYy1jcC1maSBlYmNkaWMtY3Atc2UgY3NJQk0yNzggfQogICAgeyBJQk0yODAgQ1AyODAgZWJjZGljLWNwLWl0IGNzSUJNMjgwIH0KICAgIHsgSUJNMjgxIEVCQ0RJQy1KUC1FIGNwMjgxIGNzSUJNMjgxIH0KICAgIHsgSUJNMjg0IENQMjg0IGViY2RpYy1jcC1lcyBjc0lCTTI4NCB9CiAgICB7IElCTTI4NSBDUDI4NSBlYmNkaWMtY3AtZ2IgY3NJQk0yODUgfQogICAgeyBJQk0yOTAgY3AyOTAgRUJDRElDLUpQLWthbmEgY3NJQk0yOTAgfQogICAgeyBJQk0yOTcgY3AyOTcgZWJjZGljLWNwLWZyIGNzSUJNMjk3IH0KICAgIHsgSUJNNDIwIGNwNDIwIGViY2RpYy1jcC1hcjEgY3NJQk00MjAgfQogICAgeyBJQk00MjMgY3A0MjMgZWJjZGljLWNwLWdyIGNzSUJNNDIzIH0KICAgIHsgSUJNNDI0IGNwNDI0IGViY2RpYy1jcC1oZSBjc0lCTTQyNCB9CiAgICB7IElCTTQzNyBjcDQzNyA0MzcgY3NQQzhDb2RlUGFnZTQzNyB9CiAgICB7IElCTTUwMCBDUDUwMCBlYmNkaWMtY3AtYmUgZWJjZGljLWNwLWNoIGNzSUJNNTAwIH0KICAgIHsgSUJNNzc1IGNwNzc1IGNzUEM3NzVCYWx0aWMgfQogICAgeyBJQk04NTAgY3A4NTAgODUwIGNzUEM4NTBNdWx0aWxpbmd1YWwgfQogICAgeyBJQk04NTEgY3A4NTEgODUxIGNzSUJNODUxIH0KICAgIHsgSUJNODUyIGNwODUyIDg1MiBjc1BDcDg1MiB9CiAgICB7IElCTTg1NSBjcDg1NSA4NTUgY3NJQk04NTUgfQogICAgeyBJQk04NTcgY3A4NTcgODU3IGNzSUJNODU3IH0KICAgIHsgSUJNODYwIGNwODYwIDg2MCBjc0lCTTg2MCB9CiAgICB7IElCTTg2MSBjcDg2MSA4NjEgY3AtaXMgY3NJQk04NjEgfQogICAgeyBJQk04NjIgY3A4NjIgODYyIGNzUEM4NjJMYXRpbkhlYnJldyB9CiAgICB7IElCTTg2MyBjcDg2MyA4NjMgY3NJQk04NjMgfQogICAgeyBJQk04NjQgY3A4NjQgY3NJQk04NjQgfQogICAgeyBJQk04NjUgY3A4NjUgODY1IGNzSUJNODY1IH0KICAgIHsgSUJNODY2IGNwODY2IDg2NiBjc0lCTTg2NiB9CiAgICB7IElCTTg2OCBDUDg2OCBjcC1hciBjc0lCTTg2OCB9CiAgICB7IElCTTg2OSBjcDg2OSA4NjkgY3AtZ3IgY3NJQk04NjkgfQogICAgeyBJQk04NzAgQ1A4NzAgZWJjZGljLWNwLXJvZWNlIGViY2RpYy1jcC15dSBjc0lCTTg3MCB9CiAgICB7IElCTTg3MSBDUDg3MSBlYmNkaWMtY3AtaXMgY3NJQk04NzEgfQogICAgeyBJQk04ODAgY3A4ODAgRUJDRElDLUN5cmlsbGljIGNzSUJNODgwIH0KICAgIHsgSUJNODkxIGNwODkxIGNzSUJNODkxIH0KICAgIHsgSUJNOTAzIGNwOTAzIGNzSUJNOTAzIH0KICAgIHsgSUJNOTA0IGNwOTA0IDkwNCBjc0lCQk05MDQgfQogICAgeyBJQk05MDUgQ1A5MDUgZWJjZGljLWNwLXRyIGNzSUJNOTA1IH0KICAgIHsgSUJNOTE4IENQOTE4IGViY2RpYy1jcC1hcjIgY3NJQk05MTggfQogICAgeyBJQk0xMDI2IENQMTAyNiBjc0lCTTEwMjYgfQogICAgeyBFQkNESUMtQVQtREUgY3NJQk1FQkNESUNBVERFIH0KICAgIHsgRUJDRElDLUFULURFLUEgY3NFQkNESUNBVERFQSB9CiAgICB7IEVCQ0RJQy1DQS1GUiBjc0VCQ0RJQ0NBRlIgfQogICAgeyBFQkNESUMtREstTk8gY3NFQkNESUNES05PIH0KICAgIHsgRUJDRElDLURLLU5PLUEgY3NFQkNESUNES05PQSB9CiAgICB7IEVCQ0RJQy1GSS1TRSBjc0VCQ0RJQ0ZJU0UgfQogICAgeyBFQkNESUMtRkktU0UtQSBjc0VCQ0RJQ0ZJU0VBIH0KICAgIHsgRUJDRElDLUZSIGNzRUJDRElDRlIgfQogICAgeyBFQkNESUMtSVQgY3NFQkNESUNJVCB9CiAgICB7IEVCQ0RJQy1QVCBjc0VCQ0RJQ1BUIH0KICAgIHsgRUJDRElDLUVTIGNzRUJDRElDRVMgfQogICAgeyBFQkNESUMtRVMtQSBjc0VCQ0RJQ0VTQSB9CiAgICB7IEVCQ0RJQy1FUy1TIGNzRUJDRElDRVNTIH0KICAgIHsgRUJDRElDLVVLIGNzRUJDRElDVUsgfQogICAgeyBFQkNESUMtVVMgY3NFQkNESUNVUyB9CiAgICB7IFVOS05PV04tOEJJVCBjc1Vua25vd244QmlUIH0KICAgIHsgTU5FTU9OSUMgY3NNbmVtb25pYyB9CiAgICB7IE1ORU0gY3NNbmVtIH0KICAgIHsgVklTQ0lJIGNzVklTQ0lJIH0KICAgIHsgVklRUiBjc1ZJUVIgfQogICAgeyBLT0k4LVIgY3NLT0k4UiB9CiAgICB7IElCTTAwODU4IENDU0lEMDA4NTggQ1AwMDg1OCBQQy1NdWx0aWxpbmd1YWwtODUwK2V1cm8gfQogICAgeyBJQk0wMDkyNCBDQ1NJRDAwOTI0IENQMDA5MjQgZWJjZGljLUxhdGluOS0tZXVybyB9CiAgICB7IElCTTAxMTQwIENDU0lEMDExNDAgQ1AwMTE0MCBlYmNkaWMtdXMtMzcrZXVybyB9CiAgICB7IElCTTAxMTQxIENDU0lEMDExNDEgQ1AwMTE0MSBlYmNkaWMtZGUtMjczK2V1cm8gfQogICAgeyBJQk0wMTE0MiBDQ1NJRDAxMTQyIENQMDExNDIgZWJjZGljLWRrLTI3NytldXJvIGViY2RpYy1uby0yNzcrZXVybyB9CiAgICB7IElCTTAxMTQzIENDU0lEMDExNDMgQ1AwMTE0MyBlYmNkaWMtZmktMjc4K2V1cm8gZWJjZGljLXNlLTI3OCtldXJvIH0KICAgIHsgSUJNMDExNDQgQ0NTSUQwMTE0NCBDUDAxMTQ0IGViY2RpYy1pdC0yODArZXVybyB9CiAgICB7IElCTTAxMTQ1IENDU0lEMDExNDUgQ1AwMTE0NSBlYmNkaWMtZXMtMjg0K2V1cm8gfQogICAgeyBJQk0wMTE0NiBDQ1NJRDAxMTQ2IENQMDExNDYgZWJjZGljLWdiLTI4NStldXJvIH0KICAgIHsgSUJNMDExNDcgQ0NTSUQwMTE0NyBDUDAxMTQ3IGViY2RpYy1mci0yOTcrZXVybyB9CiAgICB7IElCTTAxMTQ4IENDU0lEMDExNDggQ1AwMTE0OCBlYmNkaWMtaW50ZXJuYXRpb25hbC01MDArZXVybyB9CiAgICB7IElCTTAxMTQ5IENDU0lEMDExNDkgQ1AwMTE0OSBlYmNkaWMtaXMtODcxK2V1cm8gfQogICAgeyBJQk0xMDQ3IElCTS0xMDQ3IH0KICAgIHsgUFRDUDE1NCBjc1BUQ1AxNTQgUFQxNTQgQ1AxNTQgQ3lyaWxsaWMtQXNpYW4gfQogICAgeyBBbWlnYS0xMjUxIEFtaTEyNTEgQW1pZ2ExMjUxIEFtaS0xMjUxIH0KICAgIHsgVU5JQ09ERS0xLTEgY3NVbmljb2RlMTEgfQogICAgeyBDRVNVLTggY3NDRVNVLTggfQogICAgeyBCT0NVLTEgY3NCT0NVLTEgfQogICAgeyBVTklDT0RFLTEtMS1VVEYtNyBjc1VuaWNvZGUxMVVURjcgfQogICAgeyBJU08tODg1OS0xNCBpc28taXItMTk5IElTT184ODU5LTE0OjE5OTggSVNPXzg4NTktMTQgbGF0aW44IGlzby1jZWx0aWMKICAgICAgbDggfQogICAgeyBJU08tODg1OS0xNSBJU09fODg1OS0xNSBMYXRpbi05IH0KICAgIHsgSVNPLTg4NTktMTYgaXNvLWlyLTIyNiBJU09fODg1OS0xNjoyMDAxIElTT184ODU5LTE2IGxhdGluMTAgbDEwIH0KICAgIHsgR0JLIENQOTM2IE1TOTM2IHdpbmRvd3MtOTM2IH0KICAgIHsgSklTX0VuY29kaW5nIGNzSklTRW5jb2RpbmcgfQogICAgeyBTaGlmdF9KSVMgTVNfS2FuamkgY3NTaGlmdEpJUyB9CiAgICB7IEV4dGVuZGVkX1VOSVhfQ29kZV9QYWNrZWRfRm9ybWF0X2Zvcl9KYXBhbmVzZSBjc0VVQ1BrZEZtdEphcGFuZXNlCiAgICAgIEVVQy1KUCB9CiAgICB7IEV4dGVuZGVkX1VOSVhfQ29kZV9GaXhlZF9XaWR0aF9mb3JfSmFwYW5lc2UgY3NFVUNGaXhXaWRKYXBhbmVzZSB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtQmFzaWMgY3NVbmljb2RlQVNDSUkgfQogICAgeyBJU08tMTA2NDYtVW5pY29kZS1MYXRpbjEgY3NVbmljb2RlTGF0aW4xIElTTy0xMDY0NiB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjYxIGNzVW5pY29kZUlCTTEyNjEgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2OCBjc1VuaWNvZGVJQk0xMjY4IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNzYgY3NVbmljb2RlSUJNMTI3NiB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY0IGNzVW5pY29kZUlCTTEyNjQgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NSBjc1VuaWNvZGVJQk0xMjY1IH0KICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMC1MYXRpbi0xIGNzV2luZG93czMwTGF0aW4xIH0KICAgIHsgSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xIGNzV2luZG93czMxTGF0aW4xIH0KICAgIHsgSVNPLTg4NTktMi1XaW5kb3dzLUxhdGluLTIgY3NXaW5kb3dzMzFMYXRpbjIgfQogICAgeyBJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNSBjc1dpbmRvd3MzMUxhdGluNSB9CiAgICB7IEFkb2JlLVN0YW5kYXJkLUVuY29kaW5nIGNzQWRvYmVTdGFuZGFyZEVuY29kaW5nIH0KICAgIHsgVmVudHVyYS1VUyBjc1ZlbnR1cmFVUyB9CiAgICB7IFZlbnR1cmEtSW50ZXJuYXRpb25hbCBjc1ZlbnR1cmFJbnRlcm5hdGlvbmFsIH0KICAgIHsgUEM4LURhbmlzaC1Ob3J3ZWdpYW4gY3NQQzhEYW5pc2hOb3J3ZWdpYW4gfQogICAgeyBQQzgtVHVya2lzaCBjc1BDOFR1cmtpc2ggfQogICAgeyBJQk0tU3ltYm9scyBjc0lCTVN5bWJvbHMgfQogICAgeyBJQk0tVGhhaSBjc0lCTVRoYWkgfQogICAgeyBIUC1MZWdhbCBjc0hQTGVnYWwgfQogICAgeyBIUC1QaS1mb250IGNzSFBQaUZvbnQgfQogICAgeyBIUC1NYXRoOCBjc0hQTWF0aDggfQogICAgeyBBZG9iZS1TeW1ib2wtRW5jb2RpbmcgY3NIUFBTTWF0aCB9CiAgICB7IEhQLURlc2tUb3AgY3NIUERlc2t0b3AgfQogICAgeyBWZW50dXJhLU1hdGggY3NWZW50dXJhTWF0aCB9CiAgICB7IE1pY3Jvc29mdC1QdWJsaXNoaW5nIGNzTWljcm9zb2Z0UHVibGlzaGluZyB9CiAgICB7IFdpbmRvd3MtMzFKIGNzV2luZG93czMxSiB9CiAgICB7IEdCMjMxMiBjc0dCMjMxMiB9CiAgICB7IEJpZzUgY3NCaWc1IH0KfQoKcHJvYyB0Y2xfZW5jb2Rpbmcge2VuY30gewogICAgZ2xvYmFsIGVuY29kaW5nX2FsaWFzZXMKICAgIHNldCBuYW1lcyBbZW5jb2RpbmcgbmFtZXNdCiAgICBzZXQgbGNuYW1lcyBbc3RyaW5nIHRvbG93ZXIgJG5hbWVzXQogICAgc2V0IGVuYyBbc3RyaW5nIHRvbG93ZXIgJGVuY10KICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jXQogICAgaWYgeyRpIDwgMH0gewoJIyBsb29rIGZvciAiaXNvbm5uIiBpbnN0ZWFkIG9mICJpc28tbm5uIiBvciAiaXNvX25ubiIKCWlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGVuYyBpc28gZW5jeF19IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY3hdCgl9CiAgICB9CiAgICBpZiB7JGkgPCAwfSB7Cglmb3JlYWNoIGwgJGVuY29kaW5nX2FsaWFzZXMgewoJICAgIHNldCBsbCBbc3RyaW5nIHRvbG93ZXIgJGxdCgkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkbGwgJGVuY10gPCAwfSBjb250aW51ZQoJICAgICMgbG9vayB0aHJvdWdoIHRoZSBhbGlhc2VzIGZvciBvbmUgdGhhdCB0Y2wga25vd3MgYWJvdXQKCSAgICBmb3JlYWNoIGUgJGxsIHsKCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVdCgkJaWYgeyRpIDwgMH0gewoJCSAgICBpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlIGlzbyBleF19IHsKCQkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRleF0KCQkgICAgfQoJCX0KCQlpZiB7JGkgPj0gMH0gYnJlYWsKCSAgICB9CgkgICAgYnJlYWsKCX0KICAgIH0KICAgIGlmIHskaSA+PSAwfSB7CglyZXR1cm4gW2xpbmRleCAkbmFtZXMgJGldCiAgICB9CiAgICByZXR1cm4ge30KfQoKIyBkZWZhdWx0cy4uLgpzZXQgZGF0ZW1vZGUgMApzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCnNldCB3cmNvbWNtZCAiZ2l0IGRpZmYtdHJlZSAtLXN0ZGluIC1wIC0tcHJldHR5IgoKc2V0IGdpdGVuY29kaW5nIHt9CmNhdGNoIHsKICAgIHNldCBnaXRlbmNvZGluZyBbZXhlYyBnaXQgY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmddCn0KaWYgeyRnaXRlbmNvZGluZyA9PSAiIn0gewogICAgc2V0IGdpdGVuY29kaW5nICJ1dGYtOCIKfQpzZXQgdGNsZW5jb2RpbmcgW3RjbF9lbmNvZGluZyAkZ2l0ZW5jb2RpbmddCmlmIHskdGNsZW5jb2RpbmcgPT0ge319IHsKICAgIHB1dHMgc3RkZXJyICJXYXJuaW5nOiBlbmNvZGluZyAkZ2l0ZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSBUY2wvVGsiCn0KCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQpzZXQgdWlmb250IHtIZWx2ZXRpY2EgOSBib2xkfQpzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CnNldCByZXZsaXN0b3JkZXIgMApzZXQgZmFzdGRhdGUgMApzZXQgdXBhcnJvd2xlbiA3CnNldCBkb3duYXJyb3dsZW4gNwpzZXQgbWluZ2FwbGVuIDMwCnNldCBjbWl0bW9kZSAicGF0Y2giCnNldCB3cmFwY29tbWVudCAibm9uZSIKc2V0IHNob3duZWFydGFncyAxCgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0Kc2V0IGJnY29sb3Igd2hpdGUKc2V0IGZnY29sb3IgYmxhY2sKc2V0IGRpZmZjb2xvcnMge3JlZCAiIzAwYTAwMCIgYmx1ZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCmZvbnQgY3JlYXRlIG9wdGlvbmZvbnQgLWZhbWlseSBzYW5zLXNlcmlmIC1zaXplIC0xMgoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCiMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgpzZXQgZ2l0ZGlyIFtnaXRkaXJdCmlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKICAgIHNob3dfZXJyb3Ige30gLiAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgogICAgZXhpdCAxCn0KCnNldCBjbWRsaW5lX2ZpbGVzIHt9CnNldCBpIFtsc2VhcmNoIC1leGFjdCAkcmV2dHJlZWFyZ3MgIi0tIl0KaWYgeyRpID49IDB9IHsKICAgIHNldCBjbWRsaW5lX2ZpbGVzIFtscmFuZ2UgJHJldnRyZWVhcmdzIFtleHByIHskaSArIDF9XSBlbmRdCiAgICBzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBbZXhwciB7JGkgLSAxfV1dCn0gZWxzZWlmIHskcmV2dHJlZWFyZ3MgbmUge319IHsKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGYgW2V2YWwgZXhlYyBnaXQgcmV2LXBhcnNlIC0tbm8tcmV2cyAtLW5vLWZsYWdzICRyZXZ0cmVlYXJnc10KCXNldCBjbWRsaW5lX2ZpbGVzIFtzcGxpdCAkZiAiXG4iXQoJc2V0IG4gW2xsZW5ndGggJGNtZGxpbmVfZmlsZXNdCglzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBlbmQtJG5dCiAgICB9IGVycl19IHsKCSMgdW5mb3J0dW5hdGVseSB3ZSBnZXQgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBpbiAkZXJyLAoJIyBzbyBsb29rIGZvciAiZmF0YWw6Ii4KCXNldCBpIFtzdHJpbmcgZmlyc3QgImZhdGFsOiIgJGVycl0KCWlmIHskaSA+IDB9IHsKCSAgICBzZXQgZXJyIFtzdHJpbmcgcmFuZ2UgJGVyciBbZXhwciB7JGkgKyA2fV0gZW5kXQoJfQoJc2hvd19lcnJvciB7fSAuICJCYWQgYXJndW1lbnRzIHRvIGdpdGs6XG4kZXJyIgoJZXhpdCAxCiAgICB9Cn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMApzZXQgZmhfc2VyaWFsIDAKc2V0IG5obF9uYW1lcyB7fQpzZXQgaGlnaGxpZ2h0X3BhdGhzIHt9CnNldCBzZWFyY2hkaXJuIC1mb3J3YXJkcwpzZXQgYm9sZHJvd3Mge30Kc2V0IGJvbGRuYW1lcm93cyB7fQoKc2V0IG9wdGltX2RlbGF5IDE2CgpzZXQgbmV4dHZpZXdudW0gMQpzZXQgY3VydmlldyAwCnNldCBzZWxlY3RlZHZpZXcgMApzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQpzZXQgdmlld2ZpbGVzKDApIHt9CnNldCB2aWV3cGVybSgwKSAwCnNldCB2aWV3YXJncygwKSB7fQoKc2V0IGNtZGxpbmVvayAwCnNldCBzdG9wcGVkIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwp3bSB0aXRsZSAuICJbZmlsZSB0YWlsICRhcmd2MF06IFtmaWxlIHRhaWwgW3B3ZF1dIgpyZWFkcmVmcwoKaWYgeyRjbWRsaW5lX2ZpbGVzIG5lIHt9IHx8ICRyZXZ0cmVlYXJncyBuZSB7fX0gewogICAgIyBjcmVhdGUgYSB2aWV3IGZvciB0aGUgZmlsZXMvZGlycyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQogICAgc2V0IGN1cnZpZXcgMQogICAgc2V0IHNlbGVjdGVkdmlldyAxCiAgICBzZXQgbmV4dHZpZXdudW0gMgogICAgc2V0IHZpZXduYW1lKDEpICJDb21tYW5kIGxpbmUiCiAgICBzZXQgdmlld2ZpbGVzKDEpICRjbWRsaW5lX2ZpbGVzCiAgICBzZXQgdmlld2FyZ3MoMSkgJHJldnRyZWVhcmdzCiAgICBzZXQgdmlld3Blcm0oMSkgMAogICAgYWRkdmlld21lbnUgMQogICAgLmJhci52aWV3IGVudHJ5Y29uZiBFZGl0KiAtc3RhdGUgbm9ybWFsCiAgICAuYmFyLnZpZXcgZW50cnljb25mIERlbGV0ZSogLXN0YXRlIG5vcm1hbAp9CgppZiB7W2luZm8gZXhpc3RzIHBlcm12aWV3c119IHsKICAgIGZvcmVhY2ggdiAkcGVybXZpZXdzIHsKCXNldCBuICRuZXh0dmlld251bQoJaW5jciBuZXh0dmlld251bQoJc2V0IHZpZXduYW1lKCRuKSBbbGluZGV4ICR2IDBdCglzZXQgdmlld2ZpbGVzKCRuKSBbbGluZGV4ICR2IDFdCglzZXQgdmlld2FyZ3MoJG4pIFtsaW5kZXggJHYgMl0KCXNldCB2aWV3cGVybSgkbikgMQoJYWRkdmlld21lbnUgJG4KICAgIH0KfQpnZXRjb21taXRzCg==