IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCnNldCBhcHB2ZXJzIHtAQEdJVEdVSV9WRVJTSU9OQEB9CnNldCBjb3B5cmlnaHQgewpDb3B5cmlnaHQgqSAyMDA2LCAyMDA3IFNoYXduIFBlYXJjZSwgZXQuIGFsLgoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBfQpzZXQgZ2l0Z3VpX2NyZWRpdHMgewpQYXVsIE1hY2tlcnJhcwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHJlYWQgb25seSBnbG9iYWxzCgpzZXQgX2FwcG5hbWUgW2xpbmRleCBbZmlsZSBzcGxpdCAkYXJndjBdIGVuZF0Kc2V0IF9naXRkaXIge30Kc2V0IF9naXRleGVjIHt9CnNldCBfcmVwb25hbWUge30Kc2V0IF9pc2N5Z3dpbiB7fQoKcHJvYyBhcHBuYW1lIHt9IHsKCWdsb2JhbCBfYXBwbmFtZQoJcmV0dXJuICRfYXBwbmFtZQp9Cgpwcm9jIGdpdGRpciB7YXJnc30gewoJZ2xvYmFsIF9naXRkaXIKCWlmIHskYXJncyBlcSB7fX0gewoJCXJldHVybiAkX2dpdGRpcgoJfQoJcmV0dXJuIFtldmFsIFtjb25jYXQgW2xpc3QgZmlsZSBqb2luICRfZ2l0ZGlyXSAkYXJnc11dCn0KCnByb2MgZ2l0ZXhlYyB7YXJnc30gewoJZ2xvYmFsIF9naXRleGVjCglpZiB7JF9naXRleGVjIGVxIHt9fSB7CgkJaWYge1tjYXRjaCB7c2V0IF9naXRleGVjIFtnaXQgLS1leGVjLXBhdGhdfSBlcnJdfSB7CgkJCWVycm9yICJHaXQgbm90IGluc3RhbGxlZD9cblxuJGVyciIKCQl9Cgl9CglpZiB7JGFyZ3MgZXEge319IHsKCQlyZXR1cm4gJF9naXRleGVjCgl9CglyZXR1cm4gW2V2YWwgW2NvbmNhdCBbbGlzdCBmaWxlIGpvaW4gJF9naXRleGVjXSAkYXJnc11dCn0KCnByb2MgcmVwb25hbWUge30gewoJZ2xvYmFsIF9yZXBvbmFtZQoJcmV0dXJuICRfcmVwb25hbWUKfQoKcHJvYyBpc19NYWNPU1gge30gewoJZ2xvYmFsIHRjbF9wbGF0Zm9ybSB0a19saWJyYXJ5CglpZiB7W3RrIHdpbmRvd2luZ3N5c3RlbV0gZXEge2FxdWF9fSB7CgkJcmV0dXJuIDEKCX0KCXJldHVybiAwCn0KCnByb2MgaXNfV2luZG93cyB7fSB7CglnbG9iYWwgdGNsX3BsYXRmb3JtCglpZiB7JHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgZXEge3dpbmRvd3N9fSB7CgkJcmV0dXJuIDEKCX0KCXJldHVybiAwCn0KCnByb2MgaXNfQ3lnd2luIHt9IHsKCWdsb2JhbCB0Y2xfcGxhdGZvcm0gX2lzY3lnd2luCglpZiB7JF9pc2N5Z3dpbiBlcSB7fX0gewoJCWlmIHskdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSBlcSB7d2luZG93c319IHsKCQkJaWYge1tjYXRjaCB7c2V0IHAgW2V4ZWMgY3lncGF0aCAtLXdpbmRpcl19IGVycl19IHsKCQkJCXNldCBfaXNjeWd3aW4gMAoJCQl9IGVsc2UgewoJCQkJc2V0IF9pc2N5Z3dpbiAxCgkJCX0KCQl9IGVsc2UgewoJCQlzZXQgX2lzY3lnd2luIDAKCQl9Cgl9CglyZXR1cm4gJF9pc2N5Z3dpbgp9Cgpwcm9jIGlzX2VuYWJsZWQge29wdGlvbn0gewoJZ2xvYmFsIGVuYWJsZWRfb3B0aW9ucwoJaWYge1tjYXRjaCB7c2V0IG9uICRlbmFibGVkX29wdGlvbnMoJG9wdGlvbil9XX0ge3JldHVybiAwfQoJcmV0dXJuICRvbgp9Cgpwcm9jIGVuYWJsZV9vcHRpb24ge29wdGlvbn0gewoJZ2xvYmFsIGVuYWJsZWRfb3B0aW9ucwoJc2V0IGVuYWJsZWRfb3B0aW9ucygkb3B0aW9uKSAxCn0KCnByb2MgZGlzYWJsZV9vcHRpb24ge29wdGlvbn0gewoJZ2xvYmFsIGVuYWJsZWRfb3B0aW9ucwoJc2V0IGVuYWJsZWRfb3B0aW9ucygkb3B0aW9uKSAwCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgY29uZmlnCgpwcm9jIGlzX21hbnlfY29uZmlnIHtuYW1lfSB7Cglzd2l0Y2ggLWdsb2IgLS0gJG5hbWUgewoJcmVtb3RlLiouZmV0Y2ggLQoJcmVtb3RlLioucHVzaAoJCXtyZXR1cm4gMX0KCSoKCQl7cmV0dXJuIDB9Cgl9Cn0KCnByb2MgaXNfY29uZmlnX3RydWUge25hbWV9IHsKCWdsb2JhbCByZXBvX2NvbmZpZwoJaWYge1tjYXRjaCB7c2V0IHYgJHJlcG9fY29uZmlnKCRuYW1lKX1dfSB7CgkJcmV0dXJuIDAKCX0gZWxzZWlmIHskdiBlcSB7dHJ1ZX0gfHwgJHYgZXEgezF9IHx8ICR2IGVxIHt5ZXN9fSB7CgkJcmV0dXJuIDEKCX0gZWxzZSB7CgkJcmV0dXJuIDAKCX0KfQoKcHJvYyBsb2FkX2NvbmZpZyB7aW5jbHVkZV9nbG9iYWx9IHsKCWdsb2JhbCByZXBvX2NvbmZpZyBnbG9iYWxfY29uZmlnIGRlZmF1bHRfY29uZmlnCgoJYXJyYXkgdW5zZXQgZ2xvYmFsX2NvbmZpZwoJaWYgeyRpbmNsdWRlX2dsb2JhbH0gewoJCWNhdGNoIHsKCQkJc2V0IGZkX3JjIFtvcGVuICJ8IGdpdCBjb25maWcgLS1nbG9iYWwgLS1saXN0IiByXQoJCQl3aGlsZSB7W2dldHMgJGZkX3JjIGxpbmVdID49IDB9IHsKCQkJCWlmIHtbcmVnZXhwIHteKFtePV0rKT0oLiopJH0gJGxpbmUgbGluZSBuYW1lIHZhbHVlXX0gewoJCQkJCWlmIHtbaXNfbWFueV9jb25maWcgJG5hbWVdfSB7CgkJCQkJCWxhcHBlbmQgZ2xvYmFsX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJCQkJfSBlbHNlIHsKCQkJCQkJc2V0IGdsb2JhbF9jb25maWcoJG5hbWUpICR2YWx1ZQoJCQkJCX0KCQkJCX0KCQkJfQoJCQljbG9zZSAkZmRfcmMKCQl9Cgl9CgoJYXJyYXkgdW5zZXQgcmVwb19jb25maWcKCWNhdGNoIHsKCQlzZXQgZmRfcmMgW29wZW4gInwgZ2l0IGNvbmZpZyAtLWxpc3QiIHJdCgkJd2hpbGUge1tnZXRzICRmZF9yYyBsaW5lXSA+PSAwfSB7CgkJCWlmIHtbcmVnZXhwIHteKFtePV0rKT0oLiopJH0gJGxpbmUgbGluZSBuYW1lIHZhbHVlXX0gewoJCQkJaWYge1tpc19tYW55X2NvbmZpZyAkbmFtZV19IHsKCQkJCQlsYXBwZW5kIHJlcG9fY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJCX0gZWxzZSB7CgkJCQkJc2V0IHJlcG9fY29uZmlnKCRuYW1lKSAkdmFsdWUKCQkJCX0KCQkJfQoJCX0KCQljbG9zZSAkZmRfcmMKCX0KCglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIGRlZmF1bHRfY29uZmlnXSB7CgkJaWYge1tjYXRjaCB7c2V0IHYgJGdsb2JhbF9jb25maWcoJG5hbWUpfV19IHsKCQkJc2V0IGdsb2JhbF9jb25maWcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKCQl9CgkJaWYge1tjYXRjaCB7c2V0IHYgJHJlcG9fY29uZmlnKCRuYW1lKX1dfSB7CgkJCXNldCByZXBvX2NvbmZpZygkbmFtZSkgJGRlZmF1bHRfY29uZmlnKCRuYW1lKQoJCX0KCX0KfQoKcHJvYyBzYXZlX2NvbmZpZyB7fSB7CglnbG9iYWwgZGVmYXVsdF9jb25maWcgZm9udF9kZXNjcwoJZ2xvYmFsIHJlcG9fY29uZmlnIGdsb2JhbF9jb25maWcKCWdsb2JhbCByZXBvX2NvbmZpZ19uZXcgZ2xvYmFsX2NvbmZpZ19uZXcKCglmb3JlYWNoIG9wdGlvbiAkZm9udF9kZXNjcyB7CgkJc2V0IG5hbWUgW2xpbmRleCAkb3B0aW9uIDBdCgkJc2V0IGZvbnQgW2xpbmRleCAkb3B0aW9uIDFdCgkJZm9udCBjb25maWd1cmUgJGZvbnQgXAoJCQktZmFtaWx5ICRnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXmZhbWlseSkgXAoJCQktc2l6ZSAkZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKQoJCWZvbnQgY29uZmlndXJlICR7Zm9udH1ib2xkIFwKCQkJLWZhbWlseSAkZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5mYW1pbHkpIFwKCQkJLXNpemUgJGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkKCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRuYW1lKSBbZm9udCBjb25maWd1cmUgJGZvbnRdCgkJdW5zZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5mYW1pbHkpCgkJdW5zZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKQoJfQoKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZGVmYXVsdF9jb25maWddIHsKCQlzZXQgdmFsdWUgJGdsb2JhbF9jb25maWdfbmV3KCRuYW1lKQoJCWlmIHskdmFsdWUgbmUgJGdsb2JhbF9jb25maWcoJG5hbWUpfSB7CgkJCWlmIHskdmFsdWUgZXEgJGRlZmF1bHRfY29uZmlnKCRuYW1lKX0gewoJCQkJY2F0Y2gge2dpdCBjb25maWcgLS1nbG9iYWwgLS11bnNldCAkbmFtZX0KCQkJfSBlbHNlIHsKCQkJCXJlZ3N1YiAtYWxsICJcW3t9XF0iICR2YWx1ZSB7In0gdmFsdWUKCQkJCWdpdCBjb25maWcgLS1nbG9iYWwgJG5hbWUgJHZhbHVlCgkJCX0KCQkJc2V0IGdsb2JhbF9jb25maWcoJG5hbWUpICR2YWx1ZQoJCQlpZiB7JHZhbHVlIGVxICRyZXBvX2NvbmZpZygkbmFtZSl9IHsKCQkJCWNhdGNoIHtnaXQgY29uZmlnIC0tdW5zZXQgJG5hbWV9CgkJCQlzZXQgcmVwb19jb25maWcoJG5hbWUpICR2YWx1ZQoJCQl9CgkJfQoJfQoKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZGVmYXVsdF9jb25maWddIHsKCQlzZXQgdmFsdWUgJHJlcG9fY29uZmlnX25ldygkbmFtZSkKCQlpZiB7JHZhbHVlIG5lICRyZXBvX2NvbmZpZygkbmFtZSl9IHsKCQkJaWYgeyR2YWx1ZSBlcSAkZ2xvYmFsX2NvbmZpZygkbmFtZSl9IHsKCQkJCWNhdGNoIHtnaXQgY29uZmlnIC0tdW5zZXQgJG5hbWV9CgkJCX0gZWxzZSB7CgkJCQlyZWdzdWIgLWFsbCAiXFt7fVxdIiAkdmFsdWUgeyJ9IHZhbHVlCgkJCQlnaXQgY29uZmlnICRuYW1lICR2YWx1ZQoJCQl9CgkJCXNldCByZXBvX2NvbmZpZygkbmFtZSkgJHZhbHVlCgkJfQoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGhhbmR5IHV0aWxzCgpwcm9jIGdpdCB7YXJnc30gewoJcmV0dXJuIFtldmFsIGV4ZWMgZ2l0ICRhcmdzXQp9Cgpwcm9jIGVycm9yX3BvcHVwIHttc2d9IHsKCXNldCB0aXRsZSBbYXBwbmFtZV0KCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CgkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgoJfQoJc2V0IGNtZCBbbGlzdCB0a19tZXNzYWdlQm94IFwKCQktaWNvbiBlcnJvciBcCgkJLXR5cGUgb2sgXAoJCS10aXRsZSAiJHRpdGxlOiBlcnJvciIgXAoJCS1tZXNzYWdlICRtc2ddCglpZiB7W3dpbmZvIGlzbWFwcGVkIC5dfSB7CgkJbGFwcGVuZCBjbWQgLXBhcmVudCAuCgl9CglldmFsICRjbWQKfQoKcHJvYyB3YXJuX3BvcHVwIHttc2d9IHsKCXNldCB0aXRsZSBbYXBwbmFtZV0KCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CgkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgoJfQoJc2V0IGNtZCBbbGlzdCB0a19tZXNzYWdlQm94IFwKCQktaWNvbiB3YXJuaW5nIFwKCQktdHlwZSBvayBcCgkJLXRpdGxlICIkdGl0bGU6IHdhcm5pbmciIFwKCQktbWVzc2FnZSAkbXNnXQoJaWYge1t3aW5mbyBpc21hcHBlZCAuXX0gewoJCWxhcHBlbmQgY21kIC1wYXJlbnQgLgoJfQoJZXZhbCAkY21kCn0KCnByb2MgaW5mb19wb3B1cCB7bXNnIHtwYXJlbnQgLn19IHsKCXNldCB0aXRsZSBbYXBwbmFtZV0KCWlmIHtbcmVwb25hbWVdIG5lIHt9fSB7CgkJYXBwZW5kIHRpdGxlICIgKFtyZXBvbmFtZV0pIgoJfQoJdGtfbWVzc2FnZUJveCBcCgkJLXBhcmVudCAkcGFyZW50IFwKCQktaWNvbiBpbmZvIFwKCQktdHlwZSBvayBcCgkJLXRpdGxlICR0aXRsZSBcCgkJLW1lc3NhZ2UgJG1zZwp9Cgpwcm9jIGFza19wb3B1cCB7bXNnfSB7CglzZXQgdGl0bGUgW2FwcG5hbWVdCglpZiB7W3JlcG9uYW1lXSBuZSB7fX0gewoJCWFwcGVuZCB0aXRsZSAiIChbcmVwb25hbWVdKSIKCX0KCXJldHVybiBbdGtfbWVzc2FnZUJveCBcCgkJLXBhcmVudCAuIFwKCQktaWNvbiBxdWVzdGlvbiBcCgkJLXR5cGUgeWVzbm8gXAoJCS10aXRsZSAkdGl0bGUgXAoJCS1tZXNzYWdlICRtc2ddCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdmVyc2lvbiBjaGVjawoKc2V0IHJlcV9tYWogMQpzZXQgcmVxX21pbiA1CgppZiB7W2NhdGNoIHtzZXQgdiBbZ2l0IC0tdmVyc2lvbl19IGVycl19IHsKCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJZXJyb3JfcG9wdXAgIkNhbm5vdCBkZXRlcm1pbmUgR2l0IHZlcnNpb246CgokZXJyCgpbYXBwbmFtZV0gcmVxdWlyZXMgR2l0ICRyZXFfbWFqLiRyZXFfbWluIG9yIGxhdGVyLiIKCWV4aXQgMQp9CmlmIHtbcmVnZXhwIHteZ2l0IHZlcnNpb24gKFxkKylcLihcZCspfSAkdiBfanVuayBhY3RfbWFqIGFjdF9taW5dfSB7CglpZiB7JGFjdF9tYWogPCAkcmVxX21hagoJCXx8ICgkYWN0X21haiA9PSAkcmVxX21haiAmJiAkYWN0X21pbiA8ICRyZXFfbWluKX0gewoJCWNhdGNoIHt3bSB3aXRoZHJhdyAufQoJCWVycm9yX3BvcHVwICJbYXBwbmFtZV0gcmVxdWlyZXMgR2l0ICRyZXFfbWFqLiRyZXFfbWluIG9yIGxhdGVyLgoKWW91IGFyZSB1c2luZyAkdi4iCgkJZXhpdCAxCgl9Cn0gZWxzZSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJDYW5ub3QgcGFyc2UgR2l0IHZlcnNpb24gc3RyaW5nOlxuXG4kdiIKCWV4aXQgMQp9CnVuc2V0IC1ub2NvbXBsYWluIHYgX2p1bmsgYWN0X21haiBhY3RfbWluIHJlcV9tYWogcmVxX21pbgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyByZXBvc2l0b3J5IHNldHVwCgppZiB7ICAgW2NhdGNoIHtzZXQgX2dpdGRpciAkZW52KEdJVF9ESVIpfV0KCSYmIFtjYXRjaCB7c2V0IF9naXRkaXIgW2dpdCByZXYtcGFyc2UgLS1naXQtZGlyXX0gZXJyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3Rvcnk6XG5cbiRlcnIiCglleGl0IDEKfQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXSAmJiBbaXNfQ3lnd2luXX0gewoJY2F0Y2gge3NldCBfZ2l0ZGlyIFtleGVjIGN5Z3BhdGggLS11bml4ICRfZ2l0ZGlyXX0KfQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRfZ2l0ZGlyXX0gewoJY2F0Y2gge3dtIHdpdGhkcmF3IC59CgllcnJvcl9wb3B1cCAiR2l0IGRpcmVjdG9yeSBub3QgZm91bmQ6XG5cbiRfZ2l0ZGlyIgoJZXhpdCAxCn0KaWYge1tsaW5kZXggW2ZpbGUgc3BsaXQgJF9naXRkaXJdIGVuZF0gbmUgey5naXR9fSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJDYW5ub3QgdXNlIGZ1bm55IC5naXQgZGlyZWN0b3J5OlxuXG4kX2dpdGRpciIKCWV4aXQgMQp9CmlmIHtbY2F0Y2gge2NkIFtmaWxlIGRpcm5hbWUgJF9naXRkaXJdfSBlcnJdfSB7CgljYXRjaCB7d20gd2l0aGRyYXcgLn0KCWVycm9yX3BvcHVwICJObyB3b3JraW5nIGRpcmVjdG9yeSBbZmlsZSBkaXJuYW1lICRfZ2l0ZGlyXTpcblxuJGVyciIKCWV4aXQgMQp9CnNldCBfcmVwb25hbWUgW2xpbmRleCBbZmlsZSBzcGxpdCBcCglbZmlsZSBub3JtYWxpemUgW2ZpbGUgZGlybmFtZSAkX2dpdGRpcl1dXSBcCgllbmRdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGdsb2JhbCBpbml0CgpzZXQgY3VycmVudF9kaWZmX3BhdGgge30Kc2V0IGN1cnJlbnRfZGlmZl9zaWRlIHt9CnNldCBkaWZmX2FjdGlvbnMgW2xpc3RdCnNldCB1aV9zdGF0dXNfdmFsdWUge0luaXRpYWxpemluZy4uLn0KCnNldCBIRUFEIHt9CnNldCBQQVJFTlQge30Kc2V0IE1FUkdFX0hFQUQgW2xpc3RdCnNldCBjb21taXRfdHlwZSB7fQpzZXQgZW1wdHlfdHJlZSB7fQpzZXQgY3VycmVudF9icmFuY2gge30Kc2V0IGN1cnJlbnRfZGlmZl9wYXRoIHt9CnNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgdGFzayBtYW5hZ2VtZW50CgpzZXQgcmVzY2FuX2FjdGl2ZSAwCnNldCBkaWZmX2FjdGl2ZSAwCnNldCBsYXN0X2NsaWNrZWQge30KCnNldCBkaXNhYmxlX29uX2xvY2sgW2xpc3RdCnNldCBpbmRleF9sb2NrX3R5cGUgbm9uZQoKcHJvYyBsb2NrX2luZGV4IHt0eXBlfSB7CglnbG9iYWwgaW5kZXhfbG9ja190eXBlIGRpc2FibGVfb25fbG9jawoKCWlmIHskaW5kZXhfbG9ja190eXBlIGVxIHtub25lfX0gewoJCXNldCBpbmRleF9sb2NrX3R5cGUgJHR5cGUKCQlmb3JlYWNoIHcgJGRpc2FibGVfb25fbG9jayB7CgkJCXVwbGV2ZWwgIzAgJHcgZGlzYWJsZWQKCQl9CgkJcmV0dXJuIDEKCX0gZWxzZWlmIHskaW5kZXhfbG9ja190eXBlIGVxICJiZWdpbi0kdHlwZSJ9IHsKCQlzZXQgaW5kZXhfbG9ja190eXBlICR0eXBlCgkJcmV0dXJuIDEKCX0KCXJldHVybiAwCn0KCnByb2MgdW5sb2NrX2luZGV4IHt9IHsKCWdsb2JhbCBpbmRleF9sb2NrX3R5cGUgZGlzYWJsZV9vbl9sb2NrCgoJc2V0IGluZGV4X2xvY2tfdHlwZSBub25lCglmb3JlYWNoIHcgJGRpc2FibGVfb25fbG9jayB7CgkJdXBsZXZlbCAjMCAkdyBub3JtYWwKCX0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyBzdGF0dXMKCnByb2MgcmVwb3NpdG9yeV9zdGF0ZSB7Y3R2YXIgaGR2YXIgbWh2YXJ9IHsKCWdsb2JhbCBjdXJyZW50X2JyYW5jaAoJdXB2YXIgJGN0dmFyIGN0ICRoZHZhciBoZCAkbWh2YXIgbWgKCglzZXQgbWggW2xpc3RdCgoJaWYge1tjYXRjaCB7c2V0IGN1cnJlbnRfYnJhbmNoIFtnaXQgc3ltYm9saWMtcmVmIEhFQURdfV19IHsKCQlzZXQgY3VycmVudF9icmFuY2gge30KCX0gZWxzZSB7CgkJcmVnc3ViIF5yZWZzLygoaGVhZHN8dGFnc3xyZW1vdGVzKS8pPyBcCgkJCSRjdXJyZW50X2JyYW5jaCBcCgkJCXt9IFwKCQkJY3VycmVudF9icmFuY2gKCX0KCglpZiB7W2NhdGNoIHtzZXQgaGQgW2dpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRF19XX0gewoJCXNldCBoZCB7fQoJCXNldCBjdCBpbml0aWFsCgkJcmV0dXJuCgl9CgoJc2V0IG1lcmdlX2hlYWQgW2dpdGRpciBNRVJHRV9IRUFEXQoJaWYge1tmaWxlIGV4aXN0cyAkbWVyZ2VfaGVhZF19IHsKCQlzZXQgY3QgbWVyZ2UKCQlzZXQgZmRfbWggW29wZW4gJG1lcmdlX2hlYWQgcl0KCQl3aGlsZSB7W2dldHMgJGZkX21oIGxpbmVdID49IDB9IHsKCQkJbGFwcGVuZCBtaCAkbGluZQoJCX0KCQljbG9zZSAkZmRfbWgKCQlyZXR1cm4KCX0KCglzZXQgY3Qgbm9ybWFsCn0KCnByb2MgUEFSRU5UIHt9IHsKCWdsb2JhbCBQQVJFTlQgZW1wdHlfdHJlZQoKCXNldCBwIFtsaW5kZXggJFBBUkVOVCAwXQoJaWYgeyRwIG5lIHt9fSB7CgkJcmV0dXJuICRwCgl9CglpZiB7JGVtcHR5X3RyZWUgZXEge319IHsKCQlzZXQgZW1wdHlfdHJlZSBbZ2l0IG1rdHJlZSA8PCB7fV0KCX0KCXJldHVybiAkZW1wdHlfdHJlZQp9Cgpwcm9jIHJlc2NhbiB7YWZ0ZXIge2hvbm9yX3RydXN0bXRpbWUgMX19IHsKCWdsb2JhbCBIRUFEIFBBUkVOVCBNRVJHRV9IRUFEIGNvbW1pdF90eXBlCglnbG9iYWwgdWlfaW5kZXggdWlfd29ya2RpciB1aV9zdGF0dXNfdmFsdWUgdWlfY29tbQoJZ2xvYmFsIHJlc2Nhbl9hY3RpdmUgZmlsZV9zdGF0ZXMKCWdsb2JhbCByZXBvX2NvbmZpZwoKCWlmIHskcmVzY2FuX2FjdGl2ZSA+IDAgfHwgIVtsb2NrX2luZGV4IHJlYWRdfSByZXR1cm4KCglyZXBvc2l0b3J5X3N0YXRlIG5ld1R5cGUgbmV3SEVBRCBuZXdNRVJHRV9IRUFECglpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQoJCSYmICRuZXdUeXBlIGVxIHtub3JtYWx9CgkJJiYgJG5ld0hFQUQgZXEgJEhFQUR9IHsKCX0gZWxzZSB7CgkJc2V0IEhFQUQgJG5ld0hFQUQKCQlzZXQgUEFSRU5UICRuZXdIRUFECgkJc2V0IE1FUkdFX0hFQUQgJG5ld01FUkdFX0hFQUQKCQlzZXQgY29tbWl0X3R5cGUgJG5ld1R5cGUKCX0KCglhcnJheSB1bnNldCBmaWxlX3N0YXRlcwoKCWlmIHshWyR1aV9jb21tIGVkaXQgbW9kaWZpZWRdCgkJfHwgW3N0cmluZyB0cmltIFskdWlfY29tbSBnZXQgMC4wIGVuZF1dIGVxIHt9fSB7CgkJaWYge1tsb2FkX21lc3NhZ2UgR0lUR1VJX01TR119IHsKCQl9IGVsc2VpZiB7W2xvYWRfbWVzc2FnZSBNRVJHRV9NU0ddfSB7CgkJfSBlbHNlaWYge1tsb2FkX21lc3NhZ2UgU1FVQVNIX01TR119IHsKCQl9CgkJJHVpX2NvbW0gZWRpdCByZXNldAoJCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKCX0KCglpZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJCWxvYWRfYWxsX2hlYWRzCgkJcG9wdWxhdGVfYnJhbmNoX21lbnUKCX0KCglpZiB7JGhvbm9yX3RydXN0bXRpbWUgJiYgJHJlcG9fY29uZmlnKGd1aS50cnVzdG10aW1lKSBlcSB7dHJ1ZX19IHsKCQlyZXNjYW5fc3RhZ2UyIHt9ICRhZnRlcgoJfSBlbHNlIHsKCQlzZXQgcmVzY2FuX2FjdGl2ZSAxCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVmcmVzaGluZyBmaWxlIHN0YXR1cy4uLn0KCQlzZXQgY21kIFtsaXN0IGdpdCB1cGRhdGUtaW5kZXhdCgkJbGFwcGVuZCBjbWQgLXEKCQlsYXBwZW5kIGNtZCAtLXVubWVyZ2VkCgkJbGFwcGVuZCBjbWQgLS1pZ25vcmUtbWlzc2luZwoJCWxhcHBlbmQgY21kIC0tcmVmcmVzaAoJCXNldCBmZF9yZiBbb3BlbiAifCAkY21kIiByXQoJCWZjb25maWd1cmUgJGZkX3JmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQlmaWxlZXZlbnQgJGZkX3JmIHJlYWRhYmxlIFwKCQkJW2xpc3QgcmVzY2FuX3N0YWdlMiAkZmRfcmYgJGFmdGVyXQoJfQp9Cgpwcm9jIHJlc2Nhbl9zdGFnZTIge2ZkIGFmdGVyfSB7CglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgcmVzY2FuX2FjdGl2ZSBidWZfcmRpIGJ1Zl9yZGYgYnVmX3JsbwoKCWlmIHskZmQgbmUge319IHsKCQlyZWFkICRmZAoJCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCQljbG9zZSAkZmQKCX0KCglzZXQgbHNfb3RoZXJzIFtsaXN0IHwgZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC16IFwKCQktLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlXQoJc2V0IGluZm9fZXhjbHVkZSBbZ2l0ZGlyIGluZm8gZXhjbHVkZV0KCWlmIHtbZmlsZSByZWFkYWJsZSAkaW5mb19leGNsdWRlXX0gewoJCWxhcHBlbmQgbHNfb3RoZXJzICItLWV4Y2x1ZGUtZnJvbT0kaW5mb19leGNsdWRlIgoJfQoKCXNldCBidWZfcmRpIHt9CglzZXQgYnVmX3JkZiB7fQoJc2V0IGJ1Zl9ybG8ge30KCglzZXQgcmVzY2FuX2FjdGl2ZSAzCglzZXQgdWlfc3RhdHVzX3ZhbHVlIHtTY2FubmluZyBmb3IgbW9kaWZpZWQgZmlsZXMgLi4ufQoJc2V0IGZkX2RpIFtvcGVuICJ8IGdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC16IFtQQVJFTlRdIiByXQoJc2V0IGZkX2RmIFtvcGVuICJ8IGdpdCBkaWZmLWZpbGVzIC16IiByXQoJc2V0IGZkX2xvIFtvcGVuICRsc19vdGhlcnMgcl0KCglmY29uZmlndXJlICRmZF9kaSAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZjb25maWd1cmUgJGZkX2RmIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJZmNvbmZpZ3VyZSAkZmRfbG8gLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeSAtZW5jb2RpbmcgYmluYXJ5CglmaWxlZXZlbnQgJGZkX2RpIHJlYWRhYmxlIFtsaXN0IHJlYWRfZGlmZl9pbmRleCAkZmRfZGkgJGFmdGVyXQoJZmlsZWV2ZW50ICRmZF9kZiByZWFkYWJsZSBbbGlzdCByZWFkX2RpZmZfZmlsZXMgJGZkX2RmICRhZnRlcl0KCWZpbGVldmVudCAkZmRfbG8gcmVhZGFibGUgW2xpc3QgcmVhZF9sc19vdGhlcnMgJGZkX2xvICRhZnRlcl0KfQoKcHJvYyBsb2FkX21lc3NhZ2Uge2ZpbGV9IHsKCWdsb2JhbCB1aV9jb21tCgoJc2V0IGYgW2dpdGRpciAkZmlsZV0KCWlmIHtbZmlsZSBpc2ZpbGUgJGZdfSB7CgkJaWYge1tjYXRjaCB7c2V0IGZkIFtvcGVuICRmIHJdfV19IHsKCQkJcmV0dXJuIDAKCQl9CgkJc2V0IGNvbnRlbnQgW3N0cmluZyB0cmltIFtyZWFkICRmZF1dCgkJY2xvc2UgJGZkCgkJcmVnc3ViIC1hbGwgLWxpbmUge1sgXHJcdF0rJH0gJGNvbnRlbnQge30gY29udGVudAoJCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkJJHVpX2NvbW0gaW5zZXJ0IGVuZCAkY29udGVudAoJCXJldHVybiAxCgl9CglyZXR1cm4gMAp9Cgpwcm9jIHJlYWRfZGlmZl9pbmRleCB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmRpCgoJYXBwZW5kIGJ1Zl9yZGkgW3JlYWQgJGZkXQoJc2V0IGMgMAoJc2V0IG4gW3N0cmluZyBsZW5ndGggJGJ1Zl9yZGldCgl3aGlsZSB7JGMgPCAkbn0gewoJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGkgJGNdCgkJaWYgeyR6MSA9PSAtMX0gYnJlYWsKCQlpbmNyIHoxCgkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkaSAkejFdCgkJaWYgeyR6MiA9PSAtMX0gYnJlYWsKCgkJaW5jciBjCgkJc2V0IGkgW3NwbGl0IFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJGMgW2V4cHIgeyR6MSAtIDJ9XV0geyB9XQoJCXNldCBwIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJHoxIFtleHByIHskejIgLSAxfV1dCgkJbWVyZ2Vfc3RhdGUgXAoJCQlbZW5jb2RpbmcgY29udmVydGZyb20gJHBdIFwKCQkJW2xpbmRleCAkaSA0XT8gXAoJCQlbbGlzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMl1dIFwKCQkJW2xpc3RdCgkJc2V0IGMgJHoyCgkJaW5jciBjCgl9CglpZiB7JGMgPCAkbn0gewoJCXNldCBidWZfcmRpIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGkgJGMgZW5kXQoJfSBlbHNlIHsKCQlzZXQgYnVmX3JkaSB7fQoJfQoKCXJlc2Nhbl9kb25lICRmZCBidWZfcmRpICRhZnRlcgp9Cgpwcm9jIHJlYWRfZGlmZl9maWxlcyB7ZmQgYWZ0ZXJ9IHsKCWdsb2JhbCBidWZfcmRmCgoJYXBwZW5kIGJ1Zl9yZGYgW3JlYWQgJGZkXQoJc2V0IGMgMAoJc2V0IG4gW3N0cmluZyBsZW5ndGggJGJ1Zl9yZGZdCgl3aGlsZSB7JGMgPCAkbn0gewoJCXNldCB6MSBbc3RyaW5nIGZpcnN0ICJcMCIgJGJ1Zl9yZGYgJGNdCgkJaWYgeyR6MSA9PSAtMX0gYnJlYWsKCQlpbmNyIHoxCgkJc2V0IHoyIFtzdHJpbmcgZmlyc3QgIlwwIiAkYnVmX3JkZiAkejFdCgkJaWYgeyR6MiA9PSAtMX0gYnJlYWsKCgkJaW5jciBjCgkJc2V0IGkgW3NwbGl0IFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJGMgW2V4cHIgeyR6MSAtIDJ9XV0geyB9XQoJCXNldCBwIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJHoxIFtleHByIHskejIgLSAxfV1dCgkJbWVyZ2Vfc3RhdGUgXAoJCQlbZW5jb2RpbmcgY29udmVydGZyb20gJHBdIFwKCQkJP1tsaW5kZXggJGkgNF0gXAoJCQlbbGlzdF0gXAoJCQlbbGlzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMl1dCgkJc2V0IGMgJHoyCgkJaW5jciBjCgl9CglpZiB7JGMgPCAkbn0gewoJCXNldCBidWZfcmRmIFtzdHJpbmcgcmFuZ2UgJGJ1Zl9yZGYgJGMgZW5kXQoJfSBlbHNlIHsKCQlzZXQgYnVmX3JkZiB7fQoJfQoKCXJlc2Nhbl9kb25lICRmZCBidWZfcmRmICRhZnRlcgp9Cgpwcm9jIHJlYWRfbHNfb3RoZXJzIHtmZCBhZnRlcn0gewoJZ2xvYmFsIGJ1Zl9ybG8KCglhcHBlbmQgYnVmX3JsbyBbcmVhZCAkZmRdCglzZXQgcGNrIFtzcGxpdCAkYnVmX3JsbyAiXDAiXQoJc2V0IGJ1Zl9ybG8gW2xpbmRleCAkcGNrIGVuZF0KCWZvcmVhY2ggcCBbbHJhbmdlICRwY2sgMCBlbmQtMV0gewoJCW1lcmdlX3N0YXRlIFtlbmNvZGluZyBjb252ZXJ0ZnJvbSAkcF0gP08KCX0KCXJlc2Nhbl9kb25lICRmZCBidWZfcmxvICRhZnRlcgp9Cgpwcm9jIHJlc2Nhbl9kb25lIHtmZCBidWYgYWZ0ZXJ9IHsKCWdsb2JhbCByZXNjYW5fYWN0aXZlCglnbG9iYWwgZmlsZV9zdGF0ZXMgcmVwb19jb25maWcKCXVwdmFyICRidWYgdG9fY2xlYXIKCglpZiB7IVtlb2YgJGZkXX0gcmV0dXJuCglzZXQgdG9fY2xlYXIge30KCWNsb3NlICRmZAoJaWYge1tpbmNyIHJlc2Nhbl9hY3RpdmUgLTFdID4gMH0gcmV0dXJuCgoJcHJ1bmVfc2VsZWN0aW9uCgl1bmxvY2tfaW5kZXgKCWRpc3BsYXlfYWxsX2ZpbGVzCglyZXNob3dfZGlmZgoJdXBsZXZlbCAjMCAkYWZ0ZXIKfQoKcHJvYyBwcnVuZV9zZWxlY3Rpb24ge30gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIHNlbGVjdGVkX3BhdGhzCgoJZm9yZWFjaCBwYXRoIFthcnJheSBuYW1lcyBzZWxlY3RlZF9wYXRoc10gewoJCWlmIHtbY2F0Y2gge3NldCBzdGlsbF9oZXJlICRmaWxlX3N0YXRlcygkcGF0aCl9XX0gewoJCQl1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCkKCQl9Cgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgZGlmZgoKcHJvYyBjbGVhcl9kaWZmIHt9IHsKCWdsb2JhbCB1aV9kaWZmIGN1cnJlbnRfZGlmZl9wYXRoIGN1cnJlbnRfZGlmZl9oZWFkZXIKCWdsb2JhbCB1aV9pbmRleCB1aV93b3JrZGlyCgoJJHVpX2RpZmYgY29uZiAtc3RhdGUgbm9ybWFsCgkkdWlfZGlmZiBkZWxldGUgMC4wIGVuZAoJJHVpX2RpZmYgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglzZXQgY3VycmVudF9kaWZmX3BhdGgge30KCXNldCBjdXJyZW50X2RpZmZfaGVhZGVyIHt9CgoJJHVpX2luZGV4IHRhZyByZW1vdmUgaW5fZGlmZiAwLjAgZW5kCgkkdWlfd29ya2RpciB0YWcgcmVtb3ZlIGluX2RpZmYgMC4wIGVuZAp9Cgpwcm9jIHJlc2hvd19kaWZmIHt9IHsKCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cwoJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIGN1cnJlbnRfZGlmZl9zaWRlCgoJc2V0IHAgJGN1cnJlbnRfZGlmZl9wYXRoCglpZiB7JHAgZXEge319IHsKCQkjIE5vIGRpZmYgaXMgYmVpbmcgc2hvd24uCgl9IGVsc2VpZiB7JGN1cnJlbnRfZGlmZl9zaWRlIGVxIHt9CgkJfHwgW2NhdGNoIHtzZXQgcyAkZmlsZV9zdGF0ZXMoJHApfV0KCQl8fCBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkY3VycmVudF9kaWZmX3NpZGUpICRwXSA9PSAtMX0gewoJCWNsZWFyX2RpZmYKCX0gZWxzZSB7CgkJc2hvd19kaWZmICRwICRjdXJyZW50X2RpZmZfc2lkZQoJfQp9Cgpwcm9jIGhhbmRsZV9lbXB0eV9kaWZmIHt9IHsKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzCgoJc2V0IHBhdGggJGN1cnJlbnRfZGlmZl9wYXRoCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglpZiB7W2xpbmRleCAkcyAwXSBuZSB7X019fSByZXR1cm4KCglpbmZvX3BvcHVwICJObyBkaWZmZXJlbmNlcyBkZXRlY3RlZC4KCltzaG9ydF9wYXRoICRwYXRoXSBoYXMgbm8gY2hhbmdlcy4KClRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGZpbGUgd2FzIHVwZGF0ZWQKYnkgYW5vdGhlciBhcHBsaWNhdGlvbiwgYnV0IHRoZSBjb250ZW50IHdpdGhpbgp0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuCgpBIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCB0byBmaW5kCm90aGVyIGZpbGVzIHdoaWNoIG1heSBoYXZlIHRoZSBzYW1lIHN0YXRlLiIKCgljbGVhcl9kaWZmCglkaXNwbGF5X2ZpbGUgJHBhdGggX18KCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0gMAp9Cgpwcm9jIHNob3dfZGlmZiB7cGF0aCB3IHtsbm8ge319fSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgZmlsZV9saXN0cwoJZ2xvYmFsIGlzXzN3YXlfZGlmZiBkaWZmX2FjdGl2ZSByZXBvX2NvbmZpZwoJZ2xvYmFsIHVpX2RpZmYgdWlfc3RhdHVzX3ZhbHVlIHVpX2luZGV4IHVpX3dvcmtkaXIKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBjdXJyZW50X2RpZmZfc2lkZSBjdXJyZW50X2RpZmZfaGVhZGVyCgoJaWYgeyRkaWZmX2FjdGl2ZSB8fCAhW2xvY2tfaW5kZXggcmVhZF19IHJldHVybgoKCWNsZWFyX2RpZmYKCWlmIHskbG5vID09IHt9fSB7CgkJc2V0IGxubyBbbHNlYXJjaCAtc29ydGVkIC1leGFjdCAkZmlsZV9saXN0cygkdykgJHBhdGhdCgkJaWYgeyRsbm8gPj0gMH0gewoJCQlpbmNyIGxubwoJCX0KCX0KCWlmIHskbG5vID49IDF9IHsKCQkkdyB0YWcgYWRkIGluX2RpZmYgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCX0KCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglzZXQgbSBbbGluZGV4ICRzIDBdCglzZXQgaXNfM3dheV9kaWZmIDAKCXNldCBkaWZmX2FjdGl2ZSAxCglzZXQgY3VycmVudF9kaWZmX3BhdGggJHBhdGgKCXNldCBjdXJyZW50X2RpZmZfc2lkZSAkdwoJc2V0IGN1cnJlbnRfZGlmZl9oZWFkZXIge30KCXNldCB1aV9zdGF0dXNfdmFsdWUgIkxvYWRpbmcgZGlmZiBvZiBbZXNjYXBlX3BhdGggJHBhdGhdLi4uIgoKCSMgLSBHaXQgd29uJ3QgZ2l2ZSB1cyB0aGUgZGlmZiwgdGhlcmUncyBub3RoaW5nIHRvIGNvbXBhcmUgdG8hCgkjCglpZiB7JG0gZXEge19PfX0gewoJCXNldCBtYXhfc3ogW2V4cHIgezEyOCAqIDEwMjR9XQoJCWlmIHtbY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRwYXRoIHJdCgkJCQlzZXQgY29udGVudCBbcmVhZCAkZmQgJG1heF9zel0KCQkJCWNsb3NlICRmZAoJCQkJc2V0IHN6IFtmaWxlIHNpemUgJHBhdGhdCgkJCX0gZXJyIF19IHsKCQkJc2V0IGRpZmZfYWN0aXZlIDAKCQkJdW5sb2NrX2luZGV4CgkJCXNldCB1aV9zdGF0dXNfdmFsdWUgIlVuYWJsZSB0byBkaXNwbGF5IFtlc2NhcGVfcGF0aCAkcGF0aF0iCgkJCWVycm9yX3BvcHVwICJFcnJvciBsb2FkaW5nIGZpbGU6XG5cbiRlcnIiCgkJCXJldHVybgoJCX0KCQkkdWlfZGlmZiBjb25mIC1zdGF0ZSBub3JtYWwKCQlpZiB7IVtjYXRjaCB7c2V0IHR5cGUgW2V4ZWMgZmlsZSAkcGF0aF19XX0gewoJCQlzZXQgbiBbc3RyaW5nIGxlbmd0aCAkcGF0aF0KCQkJaWYge1tzdHJpbmcgZXF1YWwgLWxlbmd0aCAkbiAkcGF0aCAkdHlwZV19IHsKCQkJCXNldCB0eXBlIFtzdHJpbmcgcmFuZ2UgJHR5cGUgJG4gZW5kXQoJCQkJcmVnc3ViIHteOj9ccyp9ICR0eXBlIHt9IHR5cGUKCQkJfQoJCQkkdWlfZGlmZiBpbnNlcnQgZW5kICIqICR0eXBlXG4iIGRfQAoJCX0KCQlpZiB7W3N0cmluZyBmaXJzdCAiXDAiICRjb250ZW50XSAhPSAtMX0gewoJCQkkdWlfZGlmZiBpbnNlcnQgZW5kIFwKCQkJCSIqIEJpbmFyeSBmaWxlIChub3Qgc2hvd2luZyBjb250ZW50KS4iIFwKCQkJCWRfQAoJCX0gZWxzZSB7CgkJCWlmIHskc3ogPiAkbWF4X3N6fSB7CgkJCQkkdWlfZGlmZiBpbnNlcnQgZW5kIFwKIiogVW50cmFja2VkIGZpbGUgaXMgJHN6IGJ5dGVzLgoqIFNob3dpbmcgb25seSBmaXJzdCAkbWF4X3N6IGJ5dGVzLgoiIGRfQAoJCQl9CgkJCSR1aV9kaWZmIGluc2VydCBlbmQgJGNvbnRlbnQKCQkJaWYgeyRzeiA+ICRtYXhfc3p9IHsKCQkJCSR1aV9kaWZmIGluc2VydCBlbmQgIgoqIFVudHJhY2tlZCBmaWxlIGNsaXBwZWQgaGVyZSBieSBbYXBwbmFtZV0uCiogVG8gc2VlIHRoZSBlbnRpcmUgZmlsZSwgdXNlIGFuIGV4dGVybmFsIGVkaXRvci4KIiBkX0AKCQkJfQoJCX0KCQkkdWlfZGlmZiBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJCXNldCBkaWZmX2FjdGl2ZSAwCgkJdW5sb2NrX2luZGV4CgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufQoJCXJldHVybgoJfQoKCXNldCBjbWQgW2xpc3QgfCBnaXRdCglpZiB7JHcgZXEgJHVpX2luZGV4fSB7CgkJbGFwcGVuZCBjbWQgZGlmZi1pbmRleAoJCWxhcHBlbmQgY21kIC0tY2FjaGVkCgl9IGVsc2VpZiB7JHcgZXEgJHVpX3dvcmtkaXJ9IHsKCQlpZiB7W3N0cmluZyBpbmRleCAkbSAwXSBlcSB7VX19IHsKCQkJbGFwcGVuZCBjbWQgZGlmZgoJCX0gZWxzZSB7CgkJCWxhcHBlbmQgY21kIGRpZmYtZmlsZXMKCQl9Cgl9CgoJbGFwcGVuZCBjbWQgLXAKCWxhcHBlbmQgY21kIC0tbm8tY29sb3IKCWlmIHskcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSA+IDB9IHsKCQlsYXBwZW5kIGNtZCAiLVUkcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSIKCX0KCWlmIHskdyBlcSAkdWlfaW5kZXh9IHsKCQlsYXBwZW5kIGNtZCBbUEFSRU5UXQoJfQoJbGFwcGVuZCBjbWQgLS0KCWxhcHBlbmQgY21kICRwYXRoCgoJaWYge1tjYXRjaCB7c2V0IGZkIFtvcGVuICRjbWQgcl19IGVycl19IHsKCQlzZXQgZGlmZl9hY3RpdmUgMAoJCXVubG9ja19pbmRleAoJCXNldCB1aV9zdGF0dXNfdmFsdWUgIlVuYWJsZSB0byBkaXNwbGF5IFtlc2NhcGVfcGF0aCAkcGF0aF0iCgkJZXJyb3JfcG9wdXAgIkVycm9yIGxvYWRpbmcgZGlmZjpcblxuJGVyciIKCQlyZXR1cm4KCX0KCglmY29uZmlndXJlICRmZCBcCgkJLWJsb2NraW5nIDAgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgcmVhZF9kaWZmICRmZF0KfQoKcHJvYyByZWFkX2RpZmYge2ZkfSB7CglnbG9iYWwgdWlfZGlmZiB1aV9zdGF0dXNfdmFsdWUgZGlmZl9hY3RpdmUKCWdsb2JhbCBpc18zd2F5X2RpZmYgY3VycmVudF9kaWZmX2hlYWRlcgoKCSR1aV9kaWZmIGNvbmYgLXN0YXRlIG5vcm1hbAoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJIyAtLSBDbGVhbnVwIHVuaW50ZXJlc3RpbmcgZGlmZiBoZWFkZXIgbGluZXMuCgkJIwoJCWlmIHsgICBbc3RyaW5nIG1hdGNoIHtkaWZmIC0tZ2l0ICp9ICAgICAgJGxpbmVdCgkJCXx8IFtzdHJpbmcgbWF0Y2gge2RpZmYgLS1jYyAqfSAgICAgICAkbGluZV0KCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGlmZiAtLWNvbWJpbmVkICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHstLS0gKn0gICAgICAgICAgICAgJGxpbmVdCgkJCXx8IFtzdHJpbmcgbWF0Y2ggeysrKyAqfSAgICAgICAgICAgICAkbGluZV19IHsKCQkJYXBwZW5kIGN1cnJlbnRfZGlmZl9oZWFkZXIgJGxpbmUgIlxuIgoJCQljb250aW51ZQoJCX0KCQlpZiB7W3N0cmluZyBtYXRjaCB7aW5kZXggKn0gJGxpbmVdfSBjb250aW51ZQoJCWlmIHskbGluZSBlcSB7ZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwfX0gewoJCQlzZXQgbGluZSAiZGVsZXRlZCBzeW1saW5rIgoJCX0KCgkJIyAtLSBBdXRvbWF0aWNhbGx5IGRldGVjdCBpZiB0aGlzIGlzIGEgMyB3YXkgZGlmZi4KCQkjCgkJaWYge1tzdHJpbmcgbWF0Y2gge0BAQCAqfSAkbGluZV19IHtzZXQgaXNfM3dheV9kaWZmIDF9CgoJCWlmIHtbc3RyaW5nIG1hdGNoIHttb2RlICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHtuZXcgZmlsZSAqfSAkbGluZV0KCQkJfHwgW3N0cmluZyBtYXRjaCB7ZGVsZXRlZCBmaWxlICp9ICRsaW5lXQoJCQl8fCBbc3RyaW5nIG1hdGNoIHtCaW5hcnkgZmlsZXMgKiBhbmQgKiBkaWZmZXJ9ICRsaW5lXQoJCQl8fCAkbGluZSBlcSB7XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlfQoJCQl8fCBbcmVnZXhwIHteXCogVW5tZXJnZWQgcGF0aCB9ICRsaW5lXX0gewoJCQlzZXQgdGFncyB7fQoJCX0gZWxzZWlmIHskaXNfM3dheV9kaWZmfSB7CgkJCXNldCBvcCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMV0KCQkJc3dpdGNoIC0tICRvcCB7CgkJCXsgIH0ge3NldCB0YWdzIHt9fQoJCQl7QEB9IHtzZXQgdGFncyBkX0B9CgkJCXsgK30ge3NldCB0YWdzIGRfcyt9CgkJCXsgLX0ge3NldCB0YWdzIGRfcy19CgkJCXsrIH0ge3NldCB0YWdzIGRfK3N9CgkJCXstIH0ge3NldCB0YWdzIGRfLXN9CgkJCXstLX0ge3NldCB0YWdzIGRfLS19CgkJCXsrK30gewoJCQkJaWYge1tyZWdleHAge15cK1wrKFs8Pl17N30gfD17N30pfSAkbGluZSBfZyBvcF19IHsKCQkJCQlzZXQgbGluZSBbc3RyaW5nIHJlcGxhY2UgJGxpbmUgMCAxIHsgIH1dCgkJCQkJc2V0IHRhZ3MgZCRvcAoJCQkJfSBlbHNlIHsKCQkJCQlzZXQgdGFncyBkXysrCgkJCQl9CgkJCX0KCQkJZGVmYXVsdCB7CgkJCQlwdXRzICJlcnJvcjogVW5oYW5kbGVkIDMgd2F5IGRpZmYgbWFya2VyOiB7JG9wfSIKCQkJCXNldCB0YWdzIHt9CgkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNldCBvcCBbc3RyaW5nIGluZGV4ICRsaW5lIDBdCgkJCXN3aXRjaCAtLSAkb3AgewoJCQl7IH0ge3NldCB0YWdzIHt9fQoJCQl7QH0ge3NldCB0YWdzIGRfQH0KCQkJey19IHtzZXQgdGFncyBkXy19CgkJCXsrfSB7CgkJCQlpZiB7W3JlZ2V4cCB7XlwrKFs8Pl17N30gfD17N30pfSAkbGluZSBfZyBvcF19IHsKCQkJCQlzZXQgbGluZSBbc3RyaW5nIHJlcGxhY2UgJGxpbmUgMCAwIHsgfV0KCQkJCQlzZXQgdGFncyBkJG9wCgkJCQl9IGVsc2UgewoJCQkJCXNldCB0YWdzIGRfKwoJCQkJfQoJCQl9CgkJCWRlZmF1bHQgewoJCQkJcHV0cyAiZXJyb3I6IFVuaGFuZGxlZCAyIHdheSBkaWZmIG1hcmtlcjogeyRvcH0iCgkJCQlzZXQgdGFncyB7fQoJCQl9CgkJCX0KCQl9CgkJJHVpX2RpZmYgaW5zZXJ0IGVuZCAkbGluZSAkdGFncwoJCWlmIHtbc3RyaW5nIGluZGV4ICRsaW5lIGVuZF0gZXEgIlxyIn0gewoJCQkkdWlfZGlmZiB0YWcgYWRkIGRfY3Ige2VuZCAtIDJjfQoJCX0KCQkkdWlfZGlmZiBpbnNlcnQgZW5kICJcbiIgJHRhZ3MKCX0KCSR1aV9kaWZmIGNvbmYgLXN0YXRlIGRpc2FibGVkCgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCXNldCBkaWZmX2FjdGl2ZSAwCgkJdW5sb2NrX2luZGV4CgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufQoKCQlpZiB7WyR1aV9kaWZmIGluZGV4IGVuZF0gZXEgezIuMH19IHsKCQkJaGFuZGxlX2VtcHR5X2RpZmYKCQl9Cgl9Cn0KCnByb2MgYXBwbHlfaHVuayB7eCB5fSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggY3VycmVudF9kaWZmX2hlYWRlciBjdXJyZW50X2RpZmZfc2lkZQoJZ2xvYmFsIHVpX2RpZmYgdWlfaW5kZXggZmlsZV9zdGF0ZXMKCglpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIGVxIHt9IHx8ICRjdXJyZW50X2RpZmZfaGVhZGVyIGVxIHt9fSByZXR1cm4KCWlmIHshW2xvY2tfaW5kZXggYXBwbHlfaHVua119IHJldHVybgoKCXNldCBhcHBseV9jbWQge2dpdCBhcHBseSAtLWNhY2hlZCAtLXdoaXRlc3BhY2U9bm93YXJufQoJc2V0IG1pIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRjdXJyZW50X2RpZmZfcGF0aCkgMF0KCWlmIHskY3VycmVudF9kaWZmX3NpZGUgZXEgJHVpX2luZGV4fSB7CgkJc2V0IG1vZGUgdW5zdGFnZQoJCWxhcHBlbmQgYXBwbHlfY21kIC0tcmV2ZXJzZQoJCWlmIHtbc3RyaW5nIGluZGV4ICRtaSAwXSBuZSB7TX19IHsKCQkJdW5sb2NrX2luZGV4CgkJCXJldHVybgoJCX0KCX0gZWxzZSB7CgkJc2V0IG1vZGUgc3RhZ2UKCQlpZiB7W3N0cmluZyBpbmRleCAkbWkgMV0gbmUge019fSB7CgkJCXVubG9ja19pbmRleAoJCQlyZXR1cm4KCQl9Cgl9CgoJc2V0IHNfbG5vIFtsaW5kZXggW3NwbGl0IFskdWlfZGlmZiBpbmRleCBAJHgsJHldIC5dIDBdCglzZXQgc19sbm8gWyR1aV9kaWZmIHNlYXJjaCAtYmFja3dhcmRzIC1yZWdleHAgXkBAICRzX2xuby4wIDAuMF0KCWlmIHskc19sbm8gZXEge319IHsKCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCglzZXQgZV9sbm8gWyR1aV9kaWZmIHNlYXJjaCAtZm9yd2FyZHMgLXJlZ2V4cCBeQEAgIiRzX2xubyArIDEgbGluZXMiIGVuZF0KCWlmIHskZV9sbm8gZXEge319IHsKCQlzZXQgZV9sbm8gZW5kCgl9CgoJaWYge1tjYXRjaCB7CgkJc2V0IHAgW29wZW4gInwgJGFwcGx5X2NtZCIgd10KCQlmY29uZmlndXJlICRwIC10cmFuc2xhdGlvbiBiaW5hcnkgLWVuY29kaW5nIGJpbmFyeQoJCXB1dHMgLW5vbmV3bGluZSAkcCAkY3VycmVudF9kaWZmX2hlYWRlcgoJCXB1dHMgLW5vbmV3bGluZSAkcCBbJHVpX2RpZmYgZ2V0ICRzX2xubyAkZV9sbm9dCgkJY2xvc2UgJHB9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvICRtb2RlIHNlbGVjdGVkIGh1bmsuXG5cbiRlcnIiCgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9CgoJJHVpX2RpZmYgY29uZiAtc3RhdGUgbm9ybWFsCgkkdWlfZGlmZiBkZWxldGUgJHNfbG5vICRlX2xubwoJJHVpX2RpZmYgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglpZiB7WyR1aV9kaWZmIGdldCAxLjAgZW5kXSBlcSAiXG4ifSB7CgkJc2V0IG8gXwoJfSBlbHNlIHsKCQlzZXQgbyA/Cgl9CgoJaWYgeyRjdXJyZW50X2RpZmZfc2lkZSBlcSAkdWlfaW5kZXh9IHsKCQlzZXQgbWkgJHtvfU0KCX0gZWxzZWlmIHtbc3RyaW5nIGluZGV4ICRtaSAwXSBlcSB7X319IHsKCQlzZXQgbWkgTSRvCgl9IGVsc2UgewoJCXNldCBtaSA/JG8KCX0KCXVubG9ja19pbmRleAoJZGlzcGxheV9maWxlICRjdXJyZW50X2RpZmZfcGF0aCAkbWkKCWlmIHskbyBlcSB7X319IHsKCQljbGVhcl9kaWZmCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgY29tbWl0Cgpwcm9jIGxvYWRfbGFzdF9jb21taXQge30gewoJZ2xvYmFsIEhFQUQgUEFSRU5UIE1FUkdFX0hFQUQgY29tbWl0X3R5cGUgdWlfY29tbQoJZ2xvYmFsIHJlcG9fY29uZmlnCgoJaWYge1tsbGVuZ3RoICRQQVJFTlRdID09IDB9IHsKCQllcnJvcl9wb3B1cCB7VGhlcmUgaXMgbm90aGluZyB0byBhbWVuZC4KCllvdSBhcmUgYWJvdXQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIGNvbW1pdC4KVGhlcmUgaXMgbm8gY29tbWl0IGJlZm9yZSB0aGlzIHRvIGFtZW5kLgp9CgkJcmV0dXJuCgl9CgoJcmVwb3NpdG9yeV9zdGF0ZSBjdXJUeXBlIGN1ckhFQUQgY3VyTUVSR0VfSEVBRAoJaWYgeyRjdXJUeXBlIGVxIHttZXJnZX19IHsKCQllcnJvcl9wb3B1cCB7Q2Fubm90IGFtZW5kIHdoaWxlIG1lcmdpbmcuCgpZb3UgYXJlIGN1cnJlbnRseSBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UgdGhhdApoYXMgbm90IGJlZW4gZnVsbHkgY29tcGxldGVkLiAgWW91IGNhbm5vdCBhbWVuZAp0aGUgcHJpb3IgY29tbWl0IHVubGVzcyB5b3UgZmlyc3QgYWJvcnQgdGhlCmN1cnJlbnQgbWVyZ2UgYWN0aXZpdHkuCn0KCQlyZXR1cm4KCX0KCglzZXQgbXNnIHt9CglzZXQgcGFyZW50cyBbbGlzdF0KCWlmIHtbY2F0Y2ggewoJCQlzZXQgZmQgW29wZW4gInwgZ2l0IGNhdC1maWxlIGNvbW1pdCAkY3VySEVBRCIgcl0KCQkJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nIGJpbmFyeSAtdHJhbnNsYXRpb24gbGYKCQkJaWYge1tjYXRjaCB7c2V0IGVuYyAkcmVwb19jb25maWcoaTE4bi5jb21taXRlbmNvZGluZyl9XX0gewoJCQkJc2V0IGVuYyB1dGYtOAoJCQl9CgkJCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPiAwfSB7CgkJCQlpZiB7W3N0cmluZyBtYXRjaCB7cGFyZW50ICp9ICRsaW5lXX0gewoJCQkJCWxhcHBlbmQgcGFyZW50cyBbc3RyaW5nIHJhbmdlICRsaW5lIDcgZW5kXQoJCQkJfSBlbHNlaWYge1tzdHJpbmcgbWF0Y2gge2VuY29kaW5nICp9ICRsaW5lXX0gewoJCQkJCXNldCBlbmMgW3N0cmluZyB0b2xvd2VyIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdXQoJCQkJfQoJCQl9CgkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkZW5jCgkJCXNldCBtc2cgW3N0cmluZyB0cmltIFtyZWFkICRmZF1dCgkJCWNsb3NlICRmZAoJCX0gZXJyXX0gewoJCWVycm9yX3BvcHVwICJFcnJvciBsb2FkaW5nIGNvbW1pdCBkYXRhIGZvciBhbWVuZDpcblxuJGVyciIKCQlyZXR1cm4KCX0KCglzZXQgSEVBRCAkY3VySEVBRAoJc2V0IFBBUkVOVCAkcGFyZW50cwoJc2V0IE1FUkdFX0hFQUQgW2xpc3RdCglzd2l0Y2ggLS0gW2xsZW5ndGggJHBhcmVudHNdIHsKCTAgICAgICAge3NldCBjb21taXRfdHlwZSBhbWVuZC1pbml0aWFsfQoJMSAgICAgICB7c2V0IGNvbW1pdF90eXBlIGFtZW5kfQoJZGVmYXVsdCB7c2V0IGNvbW1pdF90eXBlIGFtZW5kLW1lcmdlfQoJfQoKCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkkdWlfY29tbSBpbnNlcnQgZW5kICRtc2cKCSR1aV9jb21tIGVkaXQgcmVzZXQKCSR1aV9jb21tIGVkaXQgbW9kaWZpZWQgZmFsc2UKCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KfQoKcHJvYyBjcmVhdGVfbmV3X2NvbW1pdCB7fSB7CglnbG9iYWwgY29tbWl0X3R5cGUgdWlfY29tbQoKCXNldCBjb21taXRfdHlwZSBub3JtYWwKCSR1aV9jb21tIGRlbGV0ZSAwLjAgZW5kCgkkdWlfY29tbSBlZGl0IHJlc2V0CgkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCglyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19Cn0KCnNldCBHSVRfQ09NTUlUVEVSX0lERU5UIHt9Cgpwcm9jIGNvbW1pdHRlcl9pZGVudCB7fSB7CglnbG9iYWwgR0lUX0NPTU1JVFRFUl9JREVOVAoKCWlmIHskR0lUX0NPTU1JVFRFUl9JREVOVCBlcSB7fX0gewoJCWlmIHtbY2F0Y2gge3NldCBtZSBbZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UXX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiVW5hYmxlIHRvIG9idGFpbiB5b3VyIGlkZW50aXR5OlxuXG4kZXJyIgoJCQlyZXR1cm4ge30KCQl9CgkJaWYgeyFbcmVnZXhwIHteKC4qKSBbMC05XSsgWy0rMC05XSskfSBcCgkJCSRtZSBtZSBHSVRfQ09NTUlUVEVSX0lERU5UXX0gewoJCQllcnJvcl9wb3B1cCAiSW52YWxpZCBHSVRfQ09NTUlUVEVSX0lERU5UOlxuXG4kbWUiCgkJCXJldHVybiB7fQoJCX0KCX0KCglyZXR1cm4gJEdJVF9DT01NSVRURVJfSURFTlQKfQoKcHJvYyBjb21taXRfdHJlZSB7fSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBmaWxlX3N0YXRlcyB1aV9jb21tIHJlcG9fY29uZmlnCglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlIHBjaF9lcnJvcgoKCWlmIHtbY29tbWl0dGVyX2lkZW50XSBlcSB7fX0gcmV0dXJuCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCSMgLS0gT3VyIGluIG1lbW9yeSBzdGF0ZSBzaG91bGQgbWF0Y2ggdGhlIHJlcG9zaXRvcnkuCgkjCglyZXBvc2l0b3J5X3N0YXRlIGN1clR5cGUgY3VySEVBRCBjdXJNRVJHRV9IRUFECglpZiB7W3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQoJCSYmICRjdXJUeXBlIGVxIHtub3JtYWx9CgkJJiYgJGN1ckhFQUQgZXEgJEhFQUR9IHsKCX0gZWxzZWlmIHskY29tbWl0X3R5cGUgbmUgJGN1clR5cGUgfHwgJEhFQUQgbmUgJGN1ckhFQUR9IHsKCQlpbmZvX3BvcHVwIHtMYXN0IHNjYW5uZWQgc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVwb3NpdG9yeSBzdGF0ZS4KCkFub3RoZXIgR2l0IHByb2dyYW0gaGFzIG1vZGlmaWVkIHRoaXMgcmVwb3NpdG9yeQpzaW5jZSB0aGUgbGFzdCBzY2FuLiAgQSByZXNjYW4gbXVzdCBiZSBwZXJmb3JtZWQKYmVmb3JlIGFub3RoZXIgY29tbWl0IGNhbiBiZSBjcmVhdGVkLgoKVGhlIHJlc2NhbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBub3cuCn0KCQl1bmxvY2tfaW5kZXgKCQlyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19CgkJcmV0dXJuCgl9CgoJIyAtLSBBdCBsZWFzdCBvbmUgZmlsZSBzaG91bGQgZGlmZmVyIGluIHRoZSBpbmRleC4KCSMKCXNldCBmaWxlc19yZWFkeSAwCglmb3JlYWNoIHBhdGggW2FycmF5IG5hbWVzIGZpbGVfc3RhdGVzXSB7CgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJXz8ge2NvbnRpbnVlfQoJCUE/IC0KCQlEPyAtCgkJTT8ge3NldCBmaWxlc19yZWFkeSAxfQoJCVU/IHsKCQkJZXJyb3JfcG9wdXAgIlVubWVyZ2VkIGZpbGVzIGNhbm5vdCBiZSBjb21taXR0ZWQuCgpGaWxlIFtzaG9ydF9wYXRoICRwYXRoXSBoYXMgbWVyZ2UgY29uZmxpY3RzLgpZb3UgbXVzdCByZXNvbHZlIHRoZW0gYW5kIGFkZCB0aGUgZmlsZSBiZWZvcmUgY29tbWl0dGluZy4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuCgkJfQoJCWRlZmF1bHQgewoJCQllcnJvcl9wb3B1cCAiVW5rbm93biBmaWxlIHN0YXRlIFtsaW5kZXggJHMgMF0gZGV0ZWN0ZWQuCgpGaWxlIFtzaG9ydF9wYXRoICRwYXRoXSBjYW5ub3QgYmUgY29tbWl0dGVkIGJ5IHRoaXMgcHJvZ3JhbS4KIgoJCX0KCQl9Cgl9CglpZiB7ISRmaWxlc19yZWFkeX0gewoJCWluZm9fcG9wdXAge05vIGNoYW5nZXMgdG8gY29tbWl0LgoKWW91IG11c3QgYWRkIGF0IGxlYXN0IDEgZmlsZSBiZWZvcmUgeW91IGNhbiBjb21taXQuCn0KCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCgkjIC0tIEEgbWVzc2FnZSBpcyByZXF1aXJlZC4KCSMKCXNldCBtc2cgW3N0cmluZyB0cmltIFskdWlfY29tbSBnZXQgMS4wIGVuZF1dCglyZWdzdWIgLWFsbCAtbGluZSB7WyBcdFxyXSskfSAkbXNnIHt9IG1zZwoJaWYgeyRtc2cgZXEge319IHsKCQllcnJvcl9wb3B1cCB7UGxlYXNlIHN1cHBseSBhIGNvbW1pdCBtZXNzYWdlLgoKQSBnb29kIGNvbW1pdCBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKCi0gRmlyc3QgbGluZTogRGVzY3JpYmUgaW4gb25lIHNlbnRhbmNlIHdoYXQgeW91IGRpZC4KLSBTZWNvbmQgbGluZTogQmxhbmsKLSBSZW1haW5pbmcgbGluZXM6IERlc2NyaWJlIHdoeSB0aGlzIGNoYW5nZSBpcyBnb29kLgp9CgkJdW5sb2NrX2luZGV4CgkJcmV0dXJuCgl9CgoJIyAtLSBSdW4gdGhlIHByZS1jb21taXQgaG9vay4KCSMKCXNldCBwY2hvb2sgW2dpdGRpciBob29rcyBwcmUtY29tbWl0XQoKCSMgT24gQ3lnd2luIFtmaWxlIGV4ZWN1dGFibGVdIG1pZ2h0IGxpZSBzbyB3ZSBuZWVkIHRvIGFzawoJIyB0aGUgc2hlbGwgaWYgdGhlIGhvb2sgaXMgZXhlY3V0YWJsZS4gIFllcyB0aGF0J3MgYW5ub3lpbmcuCgkjCglpZiB7W2lzX0N5Z3dpbl0gJiYgW2ZpbGUgaXNmaWxlICRwY2hvb2tdfSB7CgkJc2V0IHBjaG9vayBbbGlzdCBzaCAtYyBbY29uY2F0IFwKCQkJImlmIHRlc3QgLXggXCIkcGNob29rXCI7IiBcCgkJCSJ0aGVuIGV4ZWMgXCIkcGNob29rXCIgMj4mMTsiIFwKCQkJImZpIl1dCgl9IGVsc2VpZiB7W2ZpbGUgZXhlY3V0YWJsZSAkcGNob29rXX0gewoJCXNldCBwY2hvb2sgW2xpc3QgJHBjaG9vayB8JiBjYXRdCgl9IGVsc2UgewoJCWNvbW1pdF93cml0ZXRyZWUgJGN1ckhFQUQgJG1zZwoJCXJldHVybgoJfQoKCXNldCB1aV9zdGF0dXNfdmFsdWUge0NhbGxpbmcgcHJlLWNvbW1pdCBob29rLi4ufQoJc2V0IHBjaF9lcnJvciB7fQoJc2V0IGZkX3BoIFtvcGVuICJ8ICRwY2hvb2siIHJdCglmY29uZmlndXJlICRmZF9waCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5CglmaWxlZXZlbnQgJGZkX3BoIHJlYWRhYmxlIFwKCQlbbGlzdCBjb21taXRfcHJlaG9va193YWl0ICRmZF9waCAkY3VySEVBRCAkbXNnXQp9Cgpwcm9jIGNvbW1pdF9wcmVob29rX3dhaXQge2ZkX3BoIGN1ckhFQUQgbXNnfSB7CglnbG9iYWwgcGNoX2Vycm9yIHVpX3N0YXR1c192YWx1ZQoKCWFwcGVuZCBwY2hfZXJyb3IgW3JlYWQgJGZkX3BoXQoJZmNvbmZpZ3VyZSAkZmRfcGggLWJsb2NraW5nIDEKCWlmIHtbZW9mICRmZF9waF19IHsKCQlpZiB7W2NhdGNoIHtjbG9zZSAkZmRfcGh9XX0gewoJCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtDb21taXQgZGVjbGluZWQgYnkgcHJlLWNvbW1pdCBob29rLn0KCQkJaG9va19mYWlsZWRfcG9wdXAgcHJlLWNvbW1pdCAkcGNoX2Vycm9yCgkJCXVubG9ja19pbmRleAoJCX0gZWxzZSB7CgkJCWNvbW1pdF93cml0ZXRyZWUgJGN1ckhFQUQgJG1zZwoJCX0KCQlzZXQgcGNoX2Vycm9yIHt9CgkJcmV0dXJuCgl9CglmY29uZmlndXJlICRmZF9waCAtYmxvY2tpbmcgMAp9Cgpwcm9jIGNvbW1pdF93cml0ZXRyZWUge2N1ckhFQUQgbXNnfSB7CglnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlCgoJc2V0IHVpX3N0YXR1c192YWx1ZSB7Q29tbWl0dGluZyBjaGFuZ2VzLi4ufQoJc2V0IGZkX3d0IFtvcGVuICJ8IGdpdCB3cml0ZS10cmVlIiByXQoJZmlsZWV2ZW50ICRmZF93dCByZWFkYWJsZSBcCgkJW2xpc3QgY29tbWl0X2NvbW1pdHRyZWUgJGZkX3d0ICRjdXJIRUFEICRtc2ddCn0KCnByb2MgY29tbWl0X2NvbW1pdHRyZWUge2ZkX3d0IGN1ckhFQUQgbXNnfSB7CglnbG9iYWwgSEVBRCBQQVJFTlQgTUVSR0VfSEVBRCBjb21taXRfdHlwZQoJZ2xvYmFsIGFsbF9oZWFkcyBjdXJyZW50X2JyYW5jaAoJZ2xvYmFsIHVpX3N0YXR1c192YWx1ZSB1aV9jb21tIHNlbGVjdGVkX2NvbW1pdF90eXBlCglnbG9iYWwgZmlsZV9zdGF0ZXMgc2VsZWN0ZWRfcGF0aHMgcmVzY2FuX2FjdGl2ZQoJZ2xvYmFsIHJlcG9fY29uZmlnCgoJZ2V0cyAkZmRfd3QgdHJlZV9pZAoJaWYgeyR0cmVlX2lkIGVxIHt9IHx8IFtjYXRjaCB7Y2xvc2UgJGZkX3d0fSBlcnJdfSB7CgkJZXJyb3JfcG9wdXAgIndyaXRlLXRyZWUgZmFpbGVkOlxuXG4kZXJyIgoJCXNldCB1aV9zdGF0dXNfdmFsdWUge0NvbW1pdCBmYWlsZWQufQoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gVmVyaWZ5IHRoaXMgd2Fzbid0IGFuIGVtcHR5IGNoYW5nZS4KCSMKCWlmIHskY29tbWl0X3R5cGUgZXEge25vcm1hbH19IHsKCQlzZXQgb2xkX3RyZWUgW2dpdCByZXYtcGFyc2UgIiRQQVJFTlRee3RyZWV9Il0KCQlpZiB7JHRyZWVfaWQgZXEgJG9sZF90cmVlfSB7CgkJCWluZm9fcG9wdXAge05vIGNoYW5nZXMgdG8gY29tbWl0LgoKTm8gZmlsZXMgd2VyZSBtb2RpZmllZCBieSB0aGlzIGNvbW1pdCBhbmQgaXQKd2FzIG5vdCBhIG1lcmdlIGNvbW1pdC4KCkEgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy4KfQoJCQl1bmxvY2tfaW5kZXgKCQkJcmVzY2FuIHtzZXQgdWlfc3RhdHVzX3ZhbHVlIHtObyBjaGFuZ2VzIHRvIGNvbW1pdC59fQoJCQlyZXR1cm4KCQl9Cgl9CgoJIyAtLSBCdWlsZCB0aGUgbWVzc2FnZS4KCSMKCXNldCBtc2dfcCBbZ2l0ZGlyIENPTU1JVF9FRElUTVNHXQoJc2V0IG1zZ193dCBbb3BlbiAkbXNnX3Agd10KCWlmIHtbY2F0Y2gge3NldCBlbmMgJHJlcG9fY29uZmlnKGkxOG4uY29tbWl0ZW5jb2RpbmcpfV19IHsKCQlzZXQgZW5jIHV0Zi04Cgl9CglmY29uZmlndXJlICRtc2dfd3QgLWVuY29kaW5nICRlbmMgLXRyYW5zbGF0aW9uIGJpbmFyeQoJcHV0cyAtbm9uZXdsaW5lICRtc2dfd3QgJG1zZwoJY2xvc2UgJG1zZ193dAoKCSMgLS0gQ3JlYXRlIHRoZSBjb21taXQuCgkjCglzZXQgY21kIFtsaXN0IGdpdCBjb21taXQtdHJlZSAkdHJlZV9pZF0KCXNldCBwYXJlbnRzIFtjb25jYXQgJFBBUkVOVCAkTUVSR0VfSEVBRF0KCWlmIHtbbGxlbmd0aCAkcGFyZW50c10gPiAwfSB7CgkJZm9yZWFjaCBwICRwYXJlbnRzIHsKCQkJbGFwcGVuZCBjbWQgLXAgJHAKCQl9Cgl9IGVsc2UgewoJCSMgZ2l0IGNvbW1pdC10cmVlIHdyaXRlcyB0byBzdGRlcnIgZHVyaW5nIGluaXRpYWwgY29tbWl0LgoJCWxhcHBlbmQgY21kIDI+L2Rldi9udWxsCgl9CglsYXBwZW5kIGNtZCA8JG1zZ19wCglpZiB7W2NhdGNoIHtzZXQgY210X2lkIFtldmFsIGV4ZWMgJGNtZF19IGVycl19IHsKCQllcnJvcl9wb3B1cCAiY29tbWl0LXRyZWUgZmFpbGVkOlxuXG4kZXJyIgoJCXNldCB1aV9zdGF0dXNfdmFsdWUge0NvbW1pdCBmYWlsZWQufQoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gVXBkYXRlIHRoZSBIRUFEIHJlZi4KCSMKCXNldCByZWZsb2dtIGNvbW1pdAoJaWYgeyRjb21taXRfdHlwZSBuZSB7bm9ybWFsfX0gewoJCWFwcGVuZCByZWZsb2dtICIgKCRjb21taXRfdHlwZSkiCgl9CglzZXQgaSBbc3RyaW5nIGZpcnN0ICJcbiIgJG1zZ10KCWlmIHskaSA+PSAwfSB7CgkJYXBwZW5kIHJlZmxvZ20gezogfSBbc3RyaW5nIHJhbmdlICRtc2cgMCBbZXhwciB7JGkgLSAxfV1dCgl9IGVsc2UgewoJCWFwcGVuZCByZWZsb2dtIHs6IH0gJG1zZwoJfQoJc2V0IGNtZCBbbGlzdCBnaXQgdXBkYXRlLXJlZiAtbSAkcmVmbG9nbSBIRUFEICRjbXRfaWQgJGN1ckhFQURdCglpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZH0gZXJyXX0gewoJCWVycm9yX3BvcHVwICJ1cGRhdGUtcmVmIGZhaWxlZDpcblxuJGVyciIKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtDb21taXQgZmFpbGVkLn0KCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCgkjIC0tIENsZWFudXAgYWZ0ZXIgb3Vyc2VsdmVzLgoJIwoJY2F0Y2gge2ZpbGUgZGVsZXRlICRtc2dfcH0KCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIE1FUkdFX0hFQURdfQoJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgTUVSR0VfTVNHXX0KCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIFNRVUFTSF9NU0ddfQoJY2F0Y2gge2ZpbGUgZGVsZXRlIFtnaXRkaXIgR0lUR1VJX01TR119CgoJIyAtLSBMZXQgcmVyZXJlIGRvIGl0cyB0aGluZy4KCSMKCWlmIHtbZmlsZSBpc2RpcmVjdG9yeSBbZ2l0ZGlyIHJyLWNhY2hlXV19IHsKCQljYXRjaCB7Z2l0IHJlcmVyZX0KCX0KCgkjIC0tIFJ1biB0aGUgcG9zdC1jb21taXQgaG9vay4KCSMKCXNldCBwY2hvb2sgW2dpdGRpciBob29rcyBwb3N0LWNvbW1pdF0KCWlmIHtbaXNfQ3lnd2luXSAmJiBbZmlsZSBpc2ZpbGUgJHBjaG9va119IHsKCQlzZXQgcGNob29rIFtsaXN0IHNoIC1jIFtjb25jYXQgXAoJCQkiaWYgdGVzdCAteCBcIiRwY2hvb2tcIjsiIFwKCQkJInRoZW4gZXhlYyBcIiRwY2hvb2tcIjsiIFwKCQkJImZpIl1dCgl9IGVsc2VpZiB7IVtmaWxlIGV4ZWN1dGFibGUgJHBjaG9va119IHsKCQlzZXQgcGNob29rIHt9Cgl9CglpZiB7JHBjaG9vayBuZSB7fX0gewoJCWNhdGNoIHtleGVjICRwY2hvb2sgJn0KCX0KCgkkdWlfY29tbSBkZWxldGUgMC4wIGVuZAoJJHVpX2NvbW0gZWRpdCByZXNldAoJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQoKCWlmIHtbaXNfZW5hYmxlZCBzaW5nbGVjb21taXRdfSBkb19xdWl0CgoJIyAtLSBNYWtlIHN1cmUgb3VyIGN1cnJlbnQgYnJhbmNoIGV4aXN0cy4KCSMKCWlmIHskY29tbWl0X3R5cGUgZXEge2luaXRpYWx9fSB7CgkJbGFwcGVuZCBhbGxfaGVhZHMgJGN1cnJlbnRfYnJhbmNoCgkJc2V0IGFsbF9oZWFkcyBbbHNvcnQgLXVuaXF1ZSAkYWxsX2hlYWRzXQoJCXBvcHVsYXRlX2JyYW5jaF9tZW51Cgl9CgoJIyAtLSBVcGRhdGUgaW4gbWVtb3J5IHN0YXR1cwoJIwoJc2V0IHNlbGVjdGVkX2NvbW1pdF90eXBlIG5ldwoJc2V0IGNvbW1pdF90eXBlIG5vcm1hbAoJc2V0IEhFQUQgJGNtdF9pZAoJc2V0IFBBUkVOVCAkY210X2lkCglzZXQgTUVSR0VfSEVBRCBbbGlzdF0KCglmb3JlYWNoIHBhdGggW2FycmF5IG5hbWVzIGZpbGVfc3RhdGVzXSB7CgkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQoJCXNldCBtIFtsaW5kZXggJHMgMF0KCQlzd2l0Y2ggLWdsb2IgLS0gJG0gewoJCV9PIC0KCQlfTSAtCgkJX0Qge2NvbnRpbnVlfQoJCV9fIC0KCQlBXyAtCgkJTV8gLQoJCURfIHsKCQkJdW5zZXQgZmlsZV9zdGF0ZXMoJHBhdGgpCgkJCWNhdGNoIHt1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCl9CgkJfQoJCURPIHsKCQkJc2V0IGZpbGVfc3RhdGVzKCRwYXRoKSBbbGlzdCBfTyBbbGluZGV4ICRzIDFdIHt9IHt9XQoJCX0KCQlBTSAtCgkJQUQgLQoJCU1NIC0KCQlNRCB7CgkJCXNldCBmaWxlX3N0YXRlcygkcGF0aCkgW2xpc3QgXAoJCQkJX1tzdHJpbmcgaW5kZXggJG0gMV0gXAoJCQkJW2xpbmRleCAkcyAxXSBcCgkJCQlbbGluZGV4ICRzIDNdIFwKCQkJCXt9XQoJCX0KCQl9Cgl9CgoJZGlzcGxheV9hbGxfZmlsZXMKCXVubG9ja19pbmRleAoJcmVzaG93X2RpZmYKCXNldCB1aV9zdGF0dXNfdmFsdWUgXAoJCSJDaGFuZ2VzIGNvbW1pdHRlZCBhcyBbc3RyaW5nIHJhbmdlICRjbXRfaWQgMCA3XS4iCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgZmV0Y2ggcHVzaAoKcHJvYyBmZXRjaF9mcm9tIHtyZW1vdGV9IHsKCXNldCB3IFtuZXdfY29uc29sZSBcCgkJImZldGNoICRyZW1vdGUiIFwKCQkiRmV0Y2hpbmcgbmV3IGNoYW5nZXMgZnJvbSAkcmVtb3RlIl0KCXNldCBjbWQgW2xpc3QgZ2l0IGZldGNoXQoJbGFwcGVuZCBjbWQgJHJlbW90ZQoJY29uc29sZV9leGVjICR3ICRjbWQgY29uc29sZV9kb25lCn0KCnByb2MgcHVzaF90byB7cmVtb3RlfSB7CglzZXQgdyBbbmV3X2NvbnNvbGUgXAoJCSJwdXNoICRyZW1vdGUiIFwKCQkiUHVzaGluZyBjaGFuZ2VzIHRvICRyZW1vdGUiXQoJc2V0IGNtZCBbbGlzdCBnaXQgcHVzaF0KCWxhcHBlbmQgY21kIC12CglsYXBwZW5kIGNtZCAkcmVtb3RlCgljb25zb2xlX2V4ZWMgJHcgJGNtZCBjb25zb2xlX2RvbmUKfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyB1aSBoZWxwZXJzCgpwcm9jIG1hcGljb24ge3cgc3RhdGUgcGF0aH0gewoJZ2xvYmFsIGFsbF9pY29ucwoKCWlmIHtbY2F0Y2gge3NldCByICRhbGxfaWNvbnMoJHN0YXRlJHcpfV19IHsKCQlwdXRzICJlcnJvcjogbm8gaWNvbiBmb3IgJHcgc3RhdGU9eyRzdGF0ZX0gJHBhdGgiCgkJcmV0dXJuIGZpbGVfcGxhaW4KCX0KCXJldHVybiAkcgp9Cgpwcm9jIG1hcGRlc2Mge3N0YXRlIHBhdGh9IHsKCWdsb2JhbCBhbGxfZGVzY3MKCglpZiB7W2NhdGNoIHtzZXQgciAkYWxsX2Rlc2NzKCRzdGF0ZSl9XX0gewoJCXB1dHMgImVycm9yOiBubyBkZXNjIGZvciBzdGF0ZT17JHN0YXRlfSAkcGF0aCIKCQlyZXR1cm4gJHN0YXRlCgl9CglyZXR1cm4gJHIKfQoKcHJvYyBlc2NhcGVfcGF0aCB7cGF0aH0gewoJcmVnc3ViIC1hbGwge1xcfSAkcGF0aCAiXFxcXCIgcGF0aAoJcmVnc3ViIC1hbGwgIlxuIiAkcGF0aCAiXFxuIiBwYXRoCglyZXR1cm4gJHBhdGgKfQoKcHJvYyBzaG9ydF9wYXRoIHtwYXRofSB7CglyZXR1cm4gW2VzY2FwZV9wYXRoIFtsaW5kZXggW2ZpbGUgc3BsaXQgJHBhdGhdIGVuZF1dCn0KCnNldCBuZXh0X2ljb25faWQgMApzZXQgbnVsbF9zaGExIFtzdHJpbmcgcmVwZWF0IDAgNDBdCgpwcm9jIG1lcmdlX3N0YXRlIHtwYXRoIG5ld19zdGF0ZSB7aGVhZF9pbmZvIHt9fSB7aW5kZXhfaW5mbyB7fX19IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBuZXh0X2ljb25faWQgbnVsbF9zaGExCgoJc2V0IHMwIFtzdHJpbmcgaW5kZXggJG5ld19zdGF0ZSAwXQoJc2V0IHMxIFtzdHJpbmcgaW5kZXggJG5ld19zdGF0ZSAxXQoKCWlmIHtbY2F0Y2gge3NldCBpbmZvICRmaWxlX3N0YXRlcygkcGF0aCl9XX0gewoJCXNldCBzdGF0ZSBfXwoJCXNldCBpY29uIG5baW5jciBuZXh0X2ljb25faWRdCgl9IGVsc2UgewoJCXNldCBzdGF0ZSBbbGluZGV4ICRpbmZvIDBdCgkJc2V0IGljb24gW2xpbmRleCAkaW5mbyAxXQoJCWlmIHskaGVhZF9pbmZvIGVxIHt9fSAge3NldCBoZWFkX2luZm8gIFtsaW5kZXggJGluZm8gMl19CgkJaWYgeyRpbmRleF9pbmZvIGVxIHt9fSB7c2V0IGluZGV4X2luZm8gW2xpbmRleCAkaW5mbyAzXX0KCX0KCglpZiAgICAgeyRzMCBlcSB7P319IHtzZXQgczAgW3N0cmluZyBpbmRleCAkc3RhdGUgMF19IFwKCWVsc2VpZiB7JHMwIGVxIHtffX0ge3NldCBzMCBffQoKCWlmICAgICB7JHMxIGVxIHs/fX0ge3NldCBzMSBbc3RyaW5nIGluZGV4ICRzdGF0ZSAxXX0gXAoJZWxzZWlmIHskczEgZXEge199fSB7c2V0IHMxIF99CgoJaWYgeyRzMCBlcSB7QX0gJiYgJHMxIGVxIHtffSAmJiAkaGVhZF9pbmZvIGVxIHt9fSB7CgkJc2V0IGhlYWRfaW5mbyBbbGlzdCAwICRudWxsX3NoYTFdCgl9IGVsc2VpZiB7JHMwIG5lIHtffSAmJiBbc3RyaW5nIGluZGV4ICRzdGF0ZSAwXSBlcSB7X30KCQkmJiAkaGVhZF9pbmZvIGVxIHt9fSB7CgkJc2V0IGhlYWRfaW5mbyAkaW5kZXhfaW5mbwoJfQoKCXNldCBmaWxlX3N0YXRlcygkcGF0aCkgW2xpc3QgJHMwJHMxICRpY29uIFwKCQkkaGVhZF9pbmZvICRpbmRleF9pbmZvIFwKCQldCglyZXR1cm4gJHN0YXRlCn0KCnByb2MgZGlzcGxheV9maWxlX2hlbHBlciB7dyBwYXRoIGljb25fbmFtZSBvbGRfbSBuZXdfbX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMKCglpZiB7JG5ld19tIGVxIHtffX0gewoJCXNldCBsbm8gW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGZpbGVfbGlzdHMoJHcpICRwYXRoXQoJCWlmIHskbG5vID49IDB9IHsKCQkJc2V0IGZpbGVfbGlzdHMoJHcpIFtscmVwbGFjZSAkZmlsZV9saXN0cygkdykgJGxubyAkbG5vXQoJCQlpbmNyIGxubwoJCQkkdyBjb25mIC1zdGF0ZSBub3JtYWwKCQkJJHcgZGVsZXRlICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCgkJCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCgkJfQoJfSBlbHNlaWYgeyRvbGRfbSBlcSB7X30gJiYgJG5ld19tIG5lIHtffX0gewoJCWxhcHBlbmQgZmlsZV9saXN0cygkdykgJHBhdGgKCQlzZXQgZmlsZV9saXN0cygkdykgW2xzb3J0IC11bmlxdWUgJGZpbGVfbGlzdHMoJHcpXQoJCXNldCBsbm8gW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGZpbGVfbGlzdHMoJHcpICRwYXRoXQoJCWluY3IgbG5vCgkJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkJJHcgaW1hZ2UgY3JlYXRlICRsbm8uMCBcCgkJCS1hbGlnbiBjZW50ZXIgLXBhZHggNSAtcGFkeSAxIFwKCQkJLW5hbWUgJGljb25fbmFtZSBcCgkJCS1pbWFnZSBbbWFwaWNvbiAkdyAkbmV3X20gJHBhdGhdCgkJJHcgaW5zZXJ0ICRsbm8uMSAiW2VzY2FwZV9wYXRoICRwYXRoXVxuIgoJCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCgl9IGVsc2VpZiB7JG9sZF9tIG5lICRuZXdfbX0gewoJCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJCSR3IGltYWdlIGNvbmYgJGljb25fbmFtZSAtaW1hZ2UgW21hcGljb24gJHcgJG5ld19tICRwYXRoXQoJCSR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCgl9Cn0KCnByb2MgZGlzcGxheV9maWxlIHtwYXRoIHN0YXRlfSB7CglnbG9iYWwgZmlsZV9zdGF0ZXMgc2VsZWN0ZWRfcGF0aHMKCWdsb2JhbCB1aV9pbmRleCB1aV93b3JrZGlyCgoJc2V0IG9sZF9tIFttZXJnZV9zdGF0ZSAkcGF0aCAkc3RhdGVdCglzZXQgcyAkZmlsZV9zdGF0ZXMoJHBhdGgpCglzZXQgbmV3X20gW2xpbmRleCAkcyAwXQoJc2V0IGljb25fbmFtZSBbbGluZGV4ICRzIDFdCgoJc2V0IG8gW3N0cmluZyBpbmRleCAkb2xkX20gMF0KCXNldCBuIFtzdHJpbmcgaW5kZXggJG5ld19tIDBdCglpZiB7JG8gZXEge1V9fSB7CgkJc2V0IG8gXwoJfQoJaWYgeyRuIGVxIHtVfX0gewoJCXNldCBuIF8KCX0KCWRpc3BsYXlfZmlsZV9oZWxwZXIJJHVpX2luZGV4ICRwYXRoICRpY29uX25hbWUgJG8gJG4KCglpZiB7W3N0cmluZyBpbmRleCAkb2xkX20gMF0gZXEge1V9fSB7CgkJc2V0IG8gVQoJfSBlbHNlIHsKCQlzZXQgbyBbc3RyaW5nIGluZGV4ICRvbGRfbSAxXQoJfQoJaWYge1tzdHJpbmcgaW5kZXggJG5ld19tIDBdIGVxIHtVfX0gewoJCXNldCBuIFUKCX0gZWxzZSB7CgkJc2V0IG4gW3N0cmluZyBpbmRleCAkbmV3X20gMV0KCX0KCWRpc3BsYXlfZmlsZV9oZWxwZXIJJHVpX3dvcmtkaXIgJHBhdGggJGljb25fbmFtZSAkbyAkbgoKCWlmIHskbmV3X20gZXEge19ffX0gewoJCXVuc2V0IGZpbGVfc3RhdGVzKCRwYXRoKQoJCWNhdGNoIHt1bnNldCBzZWxlY3RlZF9wYXRocygkcGF0aCl9Cgl9Cn0KCnByb2MgZGlzcGxheV9hbGxfZmlsZXNfaGVscGVyIHt3IHBhdGggaWNvbl9uYW1lIG19IHsKCWdsb2JhbCBmaWxlX2xpc3RzCgoJbGFwcGVuZCBmaWxlX2xpc3RzKCR3KSAkcGF0aAoJc2V0IGxubyBbZXhwciB7W2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IGVuZF0gLl0gMF0gLSAxfV0KCSR3IGltYWdlIGNyZWF0ZSBlbmQgXAoJCS1hbGlnbiBjZW50ZXIgLXBhZHggNSAtcGFkeSAxIFwKCQktbmFtZSAkaWNvbl9uYW1lIFwKCQktaW1hZ2UgW21hcGljb24gJHcgJG0gJHBhdGhdCgkkdyBpbnNlcnQgZW5kICJbZXNjYXBlX3BhdGggJHBhdGhdXG4iCn0KCnByb2MgZGlzcGxheV9hbGxfZmlsZXMge30gewoJZ2xvYmFsIHVpX2luZGV4IHVpX3dvcmtkaXIKCWdsb2JhbCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzCglnbG9iYWwgbGFzdF9jbGlja2VkCgoJJHVpX2luZGV4IGNvbmYgLXN0YXRlIG5vcm1hbAoJJHVpX3dvcmtkaXIgY29uZiAtc3RhdGUgbm9ybWFsCgoJJHVpX2luZGV4IGRlbGV0ZSAwLjAgZW5kCgkkdWlfd29ya2RpciBkZWxldGUgMC4wIGVuZAoJc2V0IGxhc3RfY2xpY2tlZCB7fQoKCXNldCBmaWxlX2xpc3RzKCR1aV9pbmRleCkgW2xpc3RdCglzZXQgZmlsZV9saXN0cygkdWlfd29ya2RpcikgW2xpc3RdCgoJZm9yZWFjaCBwYXRoIFtsc29ydCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdXSB7CgkJc2V0IHMgJGZpbGVfc3RhdGVzKCRwYXRoKQoJCXNldCBtIFtsaW5kZXggJHMgMF0KCQlzZXQgaWNvbl9uYW1lIFtsaW5kZXggJHMgMV0KCgkJc2V0IHMgW3N0cmluZyBpbmRleCAkbSAwXQoJCWlmIHskcyBuZSB7VX0gJiYgJHMgbmUge199fSB7CgkJCWRpc3BsYXlfYWxsX2ZpbGVzX2hlbHBlciAkdWlfaW5kZXggJHBhdGggXAoJCQkJJGljb25fbmFtZSAkcwoJCX0KCgkJaWYge1tzdHJpbmcgaW5kZXggJG0gMF0gZXEge1V9fSB7CgkJCXNldCBzIFUKCQl9IGVsc2UgewoJCQlzZXQgcyBbc3RyaW5nIGluZGV4ICRtIDFdCgkJfQoJCWlmIHskcyBuZSB7X319IHsKCQkJZGlzcGxheV9hbGxfZmlsZXNfaGVscGVyICR1aV93b3JrZGlyICRwYXRoIFwKCQkJCSRpY29uX25hbWUgJHMKCQl9Cgl9CgoJJHVpX2luZGV4IGNvbmYgLXN0YXRlIGRpc2FibGVkCgkkdWlfd29ya2RpciBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHVwZGF0ZV9pbmRleGluZm8ge21zZyBwYXRoTGlzdCBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCXNldCB1cGRhdGVfaW5kZXhfY3AgMAoJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCglzZXQgdG90YWxDbnQgW2xsZW5ndGggJHBhdGhMaXN0XQoJc2V0IGJhdGNoIFtleHByIHtpbnQoJHRvdGFsQ250ICogLjAxKSArIDF9XQoJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCTAuMF0KCXNldCBmZCBbb3BlbiAifCBnaXQgdXBkYXRlLWluZGV4IC16IC0taW5kZXgtaW5mbyIgd10KCWZjb25maWd1cmUgJGZkIFwKCQktYmxvY2tpbmcgMCBcCgkJLWJ1ZmZlcmluZyBmdWxsIFwKCQktYnVmZmVyc2l6ZSA1MTIgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgd3JpdGFibGUgW2xpc3QgXAoJCXdyaXRlX3VwZGF0ZV9pbmRleGluZm8gXAoJCSRmZCBcCgkJJHBhdGhMaXN0IFwKCQkkdG90YWxDbnQgXAoJCSRiYXRjaCBcCgkJJG1zZyBcCgkJJGFmdGVyIFwKCQldCn0KCnByb2Mgd3JpdGVfdXBkYXRlX2luZGV4aW5mbyB7ZmQgcGF0aExpc3QgdG90YWxDbnQgYmF0Y2ggbXNnIGFmdGVyfSB7CglnbG9iYWwgdXBkYXRlX2luZGV4X2NwIHVpX3N0YXR1c192YWx1ZQoJZ2xvYmFsIGZpbGVfc3RhdGVzIGN1cnJlbnRfZGlmZl9wYXRoCgoJaWYgeyR1cGRhdGVfaW5kZXhfY3AgPj0gJHRvdGFsQ250fSB7CgkJY2xvc2UgJGZkCgkJdW5sb2NrX2luZGV4CgkJdXBsZXZlbCAjMCAkYWZ0ZXIKCQlyZXR1cm4KCX0KCglmb3Ige3NldCBpICRiYXRjaH0gXAoJCXskdXBkYXRlX2luZGV4X2NwIDwgJHRvdGFsQ250ICYmICRpID4gMH0gXAoJCXtpbmNyIGkgLTF9IHsKCQlzZXQgcGF0aCBbbGluZGV4ICRwYXRoTGlzdCAkdXBkYXRlX2luZGV4X2NwXQoJCWluY3IgdXBkYXRlX2luZGV4X2NwCgoJCXNldCBzICRmaWxlX3N0YXRlcygkcGF0aCkKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkcyAwXSB7CgkJQT8ge3NldCBuZXcgX099CgkJTT8ge3NldCBuZXcgX019CgkJRF8ge3NldCBuZXcgX0R9CgkJRD8ge3NldCBuZXcgXz99CgkJPz8ge2NvbnRpbnVlfQoJCX0KCQlzZXQgaW5mbyBbbGluZGV4ICRzIDJdCgkJaWYgeyRpbmZvIGVxIHt9fSBjb250aW51ZQoKCQlwdXRzIC1ub25ld2xpbmUgJGZkICIkaW5mb1x0W2VuY29kaW5nIGNvbnZlcnR0byAkcGF0aF1cMCIKCQlkaXNwbGF5X2ZpbGUgJHBhdGggJG5ldwoJfQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCVtleHByIHsxMDAuMCAqICR1cGRhdGVfaW5kZXhfY3AgLyAkdG90YWxDbnR9XV0KfQoKcHJvYyB1cGRhdGVfaW5kZXgge21zZyBwYXRoTGlzdCBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCXNldCB1cGRhdGVfaW5kZXhfY3AgMAoJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCglzZXQgdG90YWxDbnQgW2xsZW5ndGggJHBhdGhMaXN0XQoJc2V0IGJhdGNoIFtleHByIHtpbnQoJHRvdGFsQ250ICogLjAxKSArIDF9XQoJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCTAuMF0KCXNldCBmZCBbb3BlbiAifCBnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIC16IC0tc3RkaW4iIHddCglmY29uZmlndXJlICRmZCBcCgkJLWJsb2NraW5nIDAgXAoJCS1idWZmZXJpbmcgZnVsbCBcCgkJLWJ1ZmZlcnNpemUgNTEyIFwKCQktZW5jb2RpbmcgYmluYXJ5IFwKCQktdHJhbnNsYXRpb24gYmluYXJ5CglmaWxlZXZlbnQgJGZkIHdyaXRhYmxlIFtsaXN0IFwKCQl3cml0ZV91cGRhdGVfaW5kZXggXAoJCSRmZCBcCgkJJHBhdGhMaXN0IFwKCQkkdG90YWxDbnQgXAoJCSRiYXRjaCBcCgkJJG1zZyBcCgkJJGFmdGVyIFwKCQldCn0KCnByb2Mgd3JpdGVfdXBkYXRlX2luZGV4IHtmZCBwYXRoTGlzdCB0b3RhbENudCBiYXRjaCBtc2cgYWZ0ZXJ9IHsKCWdsb2JhbCB1cGRhdGVfaW5kZXhfY3AgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7JHVwZGF0ZV9pbmRleF9jcCA+PSAkdG90YWxDbnR9IHsKCQljbG9zZSAkZmQKCQl1bmxvY2tfaW5kZXgKCQl1cGxldmVsICMwICRhZnRlcgoJCXJldHVybgoJfQoKCWZvciB7c2V0IGkgJGJhdGNofSBcCgkJeyR1cGRhdGVfaW5kZXhfY3AgPCAkdG90YWxDbnQgJiYgJGkgPiAwfSBcCgkJe2luY3IgaSAtMX0gewoJCXNldCBwYXRoIFtsaW5kZXggJHBhdGhMaXN0ICR1cGRhdGVfaW5kZXhfY3BdCgkJaW5jciB1cGRhdGVfaW5kZXhfY3AKCgkJc3dpdGNoIC1nbG9iIC0tIFtsaW5kZXggJGZpbGVfc3RhdGVzKCRwYXRoKSAwXSB7CgkJQUQge3NldCBuZXcgX199CgkJP0Qge3NldCBuZXcgRF99CgkJX08gLQoJCUFNIHtzZXQgbmV3IEFffQoJCVU/IHsKCQkJaWYge1tmaWxlIGV4aXN0cyAkcGF0aF19IHsKCQkJCXNldCBuZXcgTV8KCQkJfSBlbHNlIHsKCQkJCXNldCBuZXcgRF8KCQkJfQoJCX0KCQk/TSB7c2V0IG5ldyBNX30KCQk/PyB7Y29udGludWV9CgkJfQoJCXB1dHMgLW5vbmV3bGluZSAkZmQgIltlbmNvZGluZyBjb252ZXJ0dG8gJHBhdGhdXDAiCgkJZGlzcGxheV9maWxlICRwYXRoICRuZXcKCX0KCglzZXQgdWlfc3RhdHVzX3ZhbHVlIFtmb3JtYXQgXAoJCSIkbXNnLi4uICVpLyVpIGZpbGVzICglLjJmJSUpIiBcCgkJJHVwZGF0ZV9pbmRleF9jcCBcCgkJJHRvdGFsQ250IFwKCQlbZXhwciB7MTAwLjAgKiAkdXBkYXRlX2luZGV4X2NwIC8gJHRvdGFsQ250fV1dCn0KCnByb2MgY2hlY2tvdXRfaW5kZXgge21zZyBwYXRoTGlzdCBhZnRlcn0gewoJZ2xvYmFsIHVwZGF0ZV9pbmRleF9jcCB1aV9zdGF0dXNfdmFsdWUKCglpZiB7IVtsb2NrX2luZGV4IHVwZGF0ZV19IHJldHVybgoKCXNldCB1cGRhdGVfaW5kZXhfY3AgMAoJc2V0IHBhdGhMaXN0IFtsc29ydCAkcGF0aExpc3RdCglzZXQgdG90YWxDbnQgW2xsZW5ndGggJHBhdGhMaXN0XQoJc2V0IGJhdGNoIFtleHByIHtpbnQoJHRvdGFsQ250ICogLjAxKSArIDF9XQoJaWYgeyRiYXRjaCA+IDI1fSB7c2V0IGJhdGNoIDI1fQoKCXNldCB1aV9zdGF0dXNfdmFsdWUgW2Zvcm1hdCBcCgkJIiRtc2cuLi4gJWkvJWkgZmlsZXMgKCUuMmYlJSkiIFwKCQkkdXBkYXRlX2luZGV4X2NwIFwKCQkkdG90YWxDbnQgXAoJCTAuMF0KCXNldCBjbWQgW2xpc3QgZ2l0IGNoZWNrb3V0LWluZGV4XQoJbGFwcGVuZCBjbWQgLS1pbmRleAoJbGFwcGVuZCBjbWQgLS1xdWlldAoJbGFwcGVuZCBjbWQgLS1mb3JjZQoJbGFwcGVuZCBjbWQgLXoKCWxhcHBlbmQgY21kIC0tc3RkaW4KCXNldCBmZCBbb3BlbiAifCAkY21kICIgd10KCWZjb25maWd1cmUgJGZkIFwKCQktYmxvY2tpbmcgMCBcCgkJLWJ1ZmZlcmluZyBmdWxsIFwKCQktYnVmZmVyc2l6ZSA1MTIgXAoJCS1lbmNvZGluZyBiaW5hcnkgXAoJCS10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmQgd3JpdGFibGUgW2xpc3QgXAoJCXdyaXRlX2NoZWNrb3V0X2luZGV4IFwKCQkkZmQgXAoJCSRwYXRoTGlzdCBcCgkJJHRvdGFsQ250IFwKCQkkYmF0Y2ggXAoJCSRtc2cgXAoJCSRhZnRlciBcCgkJXQp9Cgpwcm9jIHdyaXRlX2NoZWNrb3V0X2luZGV4IHtmZCBwYXRoTGlzdCB0b3RhbENudCBiYXRjaCBtc2cgYWZ0ZXJ9IHsKCWdsb2JhbCB1cGRhdGVfaW5kZXhfY3AgdWlfc3RhdHVzX3ZhbHVlCglnbG9iYWwgZmlsZV9zdGF0ZXMgY3VycmVudF9kaWZmX3BhdGgKCglpZiB7JHVwZGF0ZV9pbmRleF9jcCA+PSAkdG90YWxDbnR9IHsKCQljbG9zZSAkZmQKCQl1bmxvY2tfaW5kZXgKCQl1cGxldmVsICMwICRhZnRlcgoJCXJldHVybgoJfQoKCWZvciB7c2V0IGkgJGJhdGNofSBcCgkJeyR1cGRhdGVfaW5kZXhfY3AgPCAkdG90YWxDbnQgJiYgJGkgPiAwfSBcCgkJe2luY3IgaSAtMX0gewoJCXNldCBwYXRoIFtsaW5kZXggJHBhdGhMaXN0ICR1cGRhdGVfaW5kZXhfY3BdCgkJaW5jciB1cGRhdGVfaW5kZXhfY3AKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlVPyB7Y29udGludWV9CgkJP00gLQoJCT9EIHsKCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAiW2VuY29kaW5nIGNvbnZlcnR0byAkcGF0aF1cMCIKCQkJZGlzcGxheV9maWxlICRwYXRoID9fCgkJfQoJCX0KCX0KCglzZXQgdWlfc3RhdHVzX3ZhbHVlIFtmb3JtYXQgXAoJCSIkbXNnLi4uICVpLyVpIGZpbGVzICglLjJmJSUpIiBcCgkJJHVwZGF0ZV9pbmRleF9jcCBcCgkJJHRvdGFsQ250IFwKCQlbZXhwciB7MTAwLjAgKiAkdXBkYXRlX2luZGV4X2NwIC8gJHRvdGFsQ250fV1dCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgYnJhbmNoIG1hbmFnZW1lbnQKCnByb2MgaXNfdHJhY2tpbmdfYnJhbmNoIHtuYW1lfSB7CglnbG9iYWwgdHJhY2tpbmdfYnJhbmNoZXMKCglpZiB7IVtjYXRjaCB7c2V0IGluZm8gJHRyYWNraW5nX2JyYW5jaGVzKCRuYW1lKX1dfSB7CgkJcmV0dXJuIDEKCX0KCWZvcmVhY2ggdCBbYXJyYXkgbmFtZXMgdHJhY2tpbmdfYnJhbmNoZXNdIHsKCQlpZiB7W3N0cmluZyBtYXRjaCB7Ki9cKn0gJHRdICYmIFtzdHJpbmcgbWF0Y2ggJHQgJG5hbWVdfSB7CgkJCXJldHVybiAxCgkJfQoJfQoJcmV0dXJuIDAKfQoKcHJvYyBsb2FkX2FsbF9oZWFkcyB7fSB7CglnbG9iYWwgYWxsX2hlYWRzCgoJc2V0IGFsbF9oZWFkcyBbbGlzdF0KCXNldCBmZCBbb3BlbiAifCBnaXQgZm9yLWVhY2gtcmVmIC0tZm9ybWF0PSUocmVmbmFtZSkgcmVmcy9oZWFkcyIgcl0KCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPiAwfSB7CgkJaWYge1tpc190cmFja2luZ19icmFuY2ggJGxpbmVdfSBjb250aW51ZQoJCWlmIHshW3JlZ3N1YiBecmVmcy9oZWFkcy8gJGxpbmUge30gbmFtZV19IGNvbnRpbnVlCgkJbGFwcGVuZCBhbGxfaGVhZHMgJG5hbWUKCX0KCWNsb3NlICRmZAoKCXNldCBhbGxfaGVhZHMgW2xzb3J0ICRhbGxfaGVhZHNdCn0KCnByb2MgcG9wdWxhdGVfYnJhbmNoX21lbnUge30gewoJZ2xvYmFsIGFsbF9oZWFkcyBkaXNhYmxlX29uX2xvY2sKCglzZXQgbSAubWJhci5icmFuY2gKCXNldCBsYXN0IFskbSBpbmRleCBsYXN0XQoJZm9yIHtzZXQgaSAwfSB7JGkgPD0gJGxhc3R9IHtpbmNyIGl9IHsKCQlpZiB7WyRtIHR5cGUgJGldIGVxIHtzZXBhcmF0b3J9fSB7CgkJCSRtIGRlbGV0ZSAkaSBsYXN0CgkJCXNldCBuZXdfZG9sIFtsaXN0XQoJCQlmb3JlYWNoIGEgJGRpc2FibGVfb25fbG9jayB7CgkJCQlpZiB7W2xpbmRleCAkYSAwXSBuZSAkbSB8fCBbbGluZGV4ICRhIDJdIDwgJGl9IHsKCQkJCQlsYXBwZW5kIG5ld19kb2wgJGEKCQkJCX0KCQkJfQoJCQlzZXQgZGlzYWJsZV9vbl9sb2NrICRuZXdfZG9sCgkJCWJyZWFrCgkJfQoJfQoKCWlmIHskYWxsX2hlYWRzIG5lIHt9fSB7CgkJJG0gYWRkIHNlcGFyYXRvcgoJfQoJZm9yZWFjaCBiICRhbGxfaGVhZHMgewoJCSRtIGFkZCByYWRpb2J1dHRvbiBcCgkJCS1sYWJlbCAkYiBcCgkJCS1jb21tYW5kIFtsaXN0IHN3aXRjaF9icmFuY2ggJGJdIFwKCQkJLXZhcmlhYmxlIGN1cnJlbnRfYnJhbmNoIFwKCQkJLXZhbHVlICRiIFwKCQkJLWZvbnQgZm9udF91aQoJCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQkJW2xpc3QgJG0gZW50cnljb25mIFskbSBpbmRleCBsYXN0XSAtc3RhdGVdCgl9Cn0KCnByb2MgYWxsX3RyYWNraW5nX2JyYW5jaGVzIHt9IHsKCWdsb2JhbCB0cmFja2luZ19icmFuY2hlcwoKCXNldCBhbGxfdHJhY2tpbmdzIHt9CglzZXQgY21kIHt9Cglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIHRyYWNraW5nX2JyYW5jaGVzXSB7CgkJaWYge1tyZWdzdWIgey9cKiR9ICRuYW1lIHt9IG5hbWVdfSB7CgkJCWxhcHBlbmQgY21kICRuYW1lCgkJfSBlbHNlIHsKCQkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzKS8gJG5hbWUge30gbmFtZQoJCQlsYXBwZW5kIGFsbF90cmFja2luZ3MgJG5hbWUKCQl9Cgl9CgoJaWYgeyRjbWQgbmUge319IHsKCQlzZXQgZmQgW29wZW4gInwgZ2l0IGZvci1lYWNoLXJlZiAtLWZvcm1hdD0lKHJlZm5hbWUpICRjbWQiIHJdCgkJd2hpbGUge1tnZXRzICRmZCBuYW1lXSA+IDB9IHsKCQkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzKS8gJG5hbWUge30gbmFtZQoJCQlsYXBwZW5kIGFsbF90cmFja2luZ3MgJG5hbWUKCQl9CgkJY2xvc2UgJGZkCgl9CgoJcmV0dXJuIFtsc29ydCAtdW5pcXVlICRhbGxfdHJhY2tpbmdzXQp9Cgpwcm9jIGxvYWRfYWxsX3RhZ3Mge30gewoJc2V0IGFsbF90YWdzIFtsaXN0XQoJc2V0IGZkIFtvcGVuICJ8IGdpdCBmb3ItZWFjaC1yZWYgLS1mb3JtYXQ9JShyZWZuYW1lKSByZWZzL3RhZ3MiIHJdCgl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID4gMH0gewoJCWlmIHshW3JlZ3N1YiBecmVmcy90YWdzLyAkbGluZSB7fSBuYW1lXX0gY29udGludWUKCQlsYXBwZW5kIGFsbF90YWdzICRuYW1lCgl9CgljbG9zZSAkZmQKCglyZXR1cm4gW2xzb3J0ICRhbGxfdGFnc10KfQoKcHJvYyBkb19jcmVhdGVfYnJhbmNoX2FjdGlvbiB7d30gewoJZ2xvYmFsIGFsbF9oZWFkcyBudWxsX3NoYTEgcmVwb19jb25maWcKCWdsb2JhbCBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IGNyZWF0ZV9icmFuY2hfcmV2dHlwZQoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfaGVhZCBjcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfbmFtZSBjcmVhdGVfYnJhbmNoX3JldmV4cAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfdGFnCgoJc2V0IG5ld2JyYW5jaCAkY3JlYXRlX2JyYW5jaF9uYW1lCglpZiB7JG5ld2JyYW5jaCBlcSB7fQoJCXx8ICRuZXdicmFuY2ggZXEgJHJlcG9fY29uZmlnKGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSl9IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJQbGVhc2Ugc3VwcGx5IGEgYnJhbmNoIG5hbWUuIgoJCWZvY3VzICR3LmRlc2MubmFtZV90CgkJcmV0dXJuCgl9CglpZiB7IVtjYXRjaCB7Z2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tICJyZWZzL2hlYWRzLyRuZXdicmFuY2gifV19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJCcmFuY2ggJyRuZXdicmFuY2gnIGFscmVhZHkgZXhpc3RzLiIKCQlmb2N1cyAkdy5kZXNjLm5hbWVfdAoJCXJldHVybgoJfQoJaWYge1tjYXRjaCB7Z2l0IGNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyRuZXdicmFuY2gifV19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJXZSBkbyBub3QgbGlrZSAnJG5ld2JyYW5jaCcgYXMgYSBicmFuY2ggbmFtZS4iCgkJZm9jdXMgJHcuZGVzYy5uYW1lX3QKCQlyZXR1cm4KCX0KCglzZXQgcmV2IHt9Cglzd2l0Y2ggLS0gJGNyZWF0ZV9icmFuY2hfcmV2dHlwZSB7CgloZWFkIHtzZXQgcmV2ICRjcmVhdGVfYnJhbmNoX2hlYWR9Cgl0cmFja2luZyB7c2V0IHJldiAkY3JlYXRlX2JyYW5jaF90cmFja2luZ2hlYWR9Cgl0YWcge3NldCByZXYgJGNyZWF0ZV9icmFuY2hfdGFnfQoJZXhwcmVzc2lvbiB7c2V0IHJldiAkY3JlYXRlX2JyYW5jaF9yZXZleHB9Cgl9CglpZiB7W2NhdGNoIHtzZXQgY210IFtnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5ICIke3Jldn1eMCJdfV19IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJJbnZhbGlkIHN0YXJ0aW5nIHJldmlzaW9uOiAkcmV2IgoJCXJldHVybgoJfQoJc2V0IGNtZCBbbGlzdCBnaXQgdXBkYXRlLXJlZl0KCWxhcHBlbmQgY21kIC1tCglsYXBwZW5kIGNtZCAiYnJhbmNoOiBDcmVhdGVkIGZyb20gJHJldiIKCWxhcHBlbmQgY21kICJyZWZzL2hlYWRzLyRuZXdicmFuY2giCglsYXBwZW5kIGNtZCAkY210CglsYXBwZW5kIGNtZCAkbnVsbF9zaGExCglpZiB7W2NhdGNoIHtldmFsIGV4ZWMgJGNtZH0gZXJyXX0gewoJCXRrX21lc3NhZ2VCb3ggXAoJCQktaWNvbiBlcnJvciBcCgkJCS10eXBlIG9rIFwKCQkJLXRpdGxlIFt3bSB0aXRsZSAkd10gXAoJCQktcGFyZW50ICR3IFwKCQkJLW1lc3NhZ2UgIkZhaWxlZCB0byBjcmVhdGUgJyRuZXdicmFuY2gnLlxuXG4kZXJyIgoJCXJldHVybgoJfQoKCWxhcHBlbmQgYWxsX2hlYWRzICRuZXdicmFuY2gKCXNldCBhbGxfaGVhZHMgW2xzb3J0ICRhbGxfaGVhZHNdCglwb3B1bGF0ZV9icmFuY2hfbWVudQoJZGVzdHJveSAkdwoJaWYgeyRjcmVhdGVfYnJhbmNoX2NoZWNrb3V0fSB7CgkJc3dpdGNoX2JyYW5jaCAkbmV3YnJhbmNoCgl9Cn0KCnByb2MgcmFkaW9fc2VsZWN0b3Ige3Zhcm5hbWUgdmFsdWUgYXJnc30gewoJdXB2YXIgIzAgJHZhcm5hbWUgdmFyCglzZXQgdmFyICR2YWx1ZQp9Cgp0cmFjZSBhZGQgdmFyaWFibGUgY3JlYXRlX2JyYW5jaF9oZWFkIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBoZWFkXQp0cmFjZSBhZGQgdmFyaWFibGUgY3JlYXRlX2JyYW5jaF90cmFja2luZ2hlYWQgd3JpdGUgXAoJW2xpc3QgcmFkaW9fc2VsZWN0b3IgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIHRyYWNraW5nXQp0cmFjZSBhZGQgdmFyaWFibGUgY3JlYXRlX2JyYW5jaF90YWcgd3JpdGUgXAoJW2xpc3QgcmFkaW9fc2VsZWN0b3IgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIHRhZ10KCnRyYWNlIGFkZCB2YXJpYWJsZSBkZWxldGVfYnJhbmNoX2hlYWQgd3JpdGUgXAoJW2xpc3QgcmFkaW9fc2VsZWN0b3IgZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgaGVhZF0KdHJhY2UgYWRkIHZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIHRyYWNraW5nXQoKcHJvYyBkb19jcmVhdGVfYnJhbmNoIHt9IHsKCWdsb2JhbCBhbGxfaGVhZHMgY3VycmVudF9icmFuY2ggcmVwb19jb25maWcKCWdsb2JhbCBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IGNyZWF0ZV9icmFuY2hfcmV2dHlwZQoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfaGVhZCBjcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfbmFtZSBjcmVhdGVfYnJhbmNoX3JldmV4cAoJZ2xvYmFsIGNyZWF0ZV9icmFuY2hfdGFnCgoJc2V0IHcgLmJyYW5jaF9lZGl0b3IKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtDcmVhdGUgTmV3IEJyYW5jaH0gXAoJCS1mb250IGZvbnRfdWlib2xkCglwYWNrICR3LmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAoKCWZyYW1lICR3LmJ1dHRvbnMKCWJ1dHRvbiAkdy5idXR0b25zLmNyZWF0ZSAtdGV4dCBDcmVhdGUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1kZWZhdWx0IGFjdGl2ZSBcCgkJLWNvbW1hbmQgW2xpc3QgZG9fY3JlYXRlX2JyYW5jaF9hY3Rpb24gJHddCglwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CglidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQge0NhbmNlbH0gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWxhYmVsZnJhbWUgJHcuZGVzYyBcCgkJLXRleHQge0JyYW5jaCBEZXNjcmlwdGlvbn0gXAoJCS1mb250IGZvbnRfdWkKCWxhYmVsICR3LmRlc2MubmFtZV9sIC10ZXh0IHtOYW1lOn0gLWZvbnQgZm9udF91aQoJZW50cnkgJHcuZGVzYy5uYW1lX3QgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLXdpZHRoIDQwIFwKCQktdGV4dHZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfbmFtZSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLXZhbGlkYXRlIGtleSBcCgkJLXZhbGlkYXRlY29tbWFuZCB7CgkJCWlmIHslZCA9PSAxICYmIFtyZWdleHAge1t+Xjo/KlxbXDAtIF19ICVTXX0ge3JldHVybiAwfQoJCQlyZXR1cm4gMQoJCX0KCWdyaWQgJHcuZGVzYy5uYW1lX2wgJHcuZGVzYy5uYW1lX3QgLXN0aWNreSB3ZSAtcGFkeCB7MCA1fQoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuZGVzYyAxIC13ZWlnaHQgMQoJcGFjayAkdy5kZXNjIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LmZyb20gXAoJCS10ZXh0IHtTdGFydGluZyBSZXZpc2lvbn0gXAoJCS1mb250IGZvbnRfdWkKCXJhZGlvYnV0dG9uICR3LmZyb20uaGVhZF9yIFwKCQktdGV4dCB7TG9jYWwgQnJhbmNoOn0gXAoJCS12YWx1ZSBoZWFkIFwKCQktdmFyaWFibGUgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIFwKCQktZm9udCBmb250X3VpCglldmFsIHRrX29wdGlvbk1lbnUgJHcuZnJvbS5oZWFkX20gY3JlYXRlX2JyYW5jaF9oZWFkICRhbGxfaGVhZHMKCWdyaWQgJHcuZnJvbS5oZWFkX3IgJHcuZnJvbS5oZWFkX20gLXN0aWNreSB3CglzZXQgYWxsX3RyYWNraW5ncyBbYWxsX3RyYWNraW5nX2JyYW5jaGVzXQoJaWYgeyRhbGxfdHJhY2tpbmdzIG5lIHt9fSB7CgkJc2V0IGNyZWF0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIFtsaW5kZXggJGFsbF90cmFja2luZ3MgMF0KCQlyYWRpb2J1dHRvbiAkdy5mcm9tLnRyYWNraW5nX3IgXAoJCQktdGV4dCB7VHJhY2tpbmcgQnJhbmNoOn0gXAoJCQktdmFsdWUgdHJhY2tpbmcgXAoJCQktdmFyaWFibGUgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIFwKCQkJLWZvbnQgZm9udF91aQoJCWV2YWwgdGtfb3B0aW9uTWVudSAkdy5mcm9tLnRyYWNraW5nX20gXAoJCQljcmVhdGVfYnJhbmNoX3RyYWNraW5naGVhZCBcCgkJCSRhbGxfdHJhY2tpbmdzCgkJZ3JpZCAkdy5mcm9tLnRyYWNraW5nX3IgJHcuZnJvbS50cmFja2luZ19tIC1zdGlja3kgdwoJfQoJc2V0IGFsbF90YWdzIFtsb2FkX2FsbF90YWdzXQoJaWYgeyRhbGxfdGFncyBuZSB7fX0gewoJCXNldCBjcmVhdGVfYnJhbmNoX3RhZyBbbGluZGV4ICRhbGxfdGFncyAwXQoJCXJhZGlvYnV0dG9uICR3LmZyb20udGFnX3IgXAoJCQktdGV4dCB7VGFnOn0gXAoJCQktdmFsdWUgdGFnIFwKCQkJLXZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBcCgkJCS1mb250IGZvbnRfdWkKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZnJvbS50YWdfbSBcCgkJCWNyZWF0ZV9icmFuY2hfdGFnIFwKCQkJJGFsbF90YWdzCgkJZ3JpZCAkdy5mcm9tLnRhZ19yICR3LmZyb20udGFnX20gLXN0aWNreSB3Cgl9CglyYWRpb2J1dHRvbiAkdy5mcm9tLmV4cF9yIFwKCQktdGV4dCB7UmV2aXNpb24gRXhwcmVzc2lvbjp9IFwKCQktdmFsdWUgZXhwcmVzc2lvbiBcCgkJLXZhcmlhYmxlIGNyZWF0ZV9icmFuY2hfcmV2dHlwZSBcCgkJLWZvbnQgZm9udF91aQoJZW50cnkgJHcuZnJvbS5leHBfdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggNTAgXAoJCS10ZXh0dmFyaWFibGUgY3JlYXRlX2JyYW5jaF9yZXZleHAgXAoJCS1mb250IGZvbnRfdWkgXAoJCS12YWxpZGF0ZSBrZXkgXAoJCS12YWxpZGF0ZWNvbW1hbmQgewoJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtcc30gJVNdfSB7cmV0dXJuIDB9CgkJCWlmIHslZCA9PSAxICYmIFtzdHJpbmcgbGVuZ3RoICVTXSA+IDB9IHsKCQkJCXNldCBjcmVhdGVfYnJhbmNoX3JldnR5cGUgZXhwcmVzc2lvbgoJCQl9CgkJCXJldHVybiAxCgkJfQoJZ3JpZCAkdy5mcm9tLmV4cF9yICR3LmZyb20uZXhwX3QgLXN0aWNreSB3ZSAtcGFkeCB7MCA1fQoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuZnJvbSAxIC13ZWlnaHQgMQoJcGFjayAkdy5mcm9tIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LnBvc3RBY3Rpb25zIFwKCQktdGV4dCB7UG9zdCBDcmVhdGlvbiBBY3Rpb25zfSBcCgkJLWZvbnQgZm9udF91aQoJY2hlY2tidXR0b24gJHcucG9zdEFjdGlvbnMuY2hlY2tvdXQgXAoJCS10ZXh0IHtDaGVja291dCBhZnRlciBjcmVhdGlvbn0gXAoJCS12YXJpYWJsZSBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IFwKCQktZm9udCBmb250X3VpCglwYWNrICR3LnBvc3RBY3Rpb25zLmNoZWNrb3V0IC1hbmNob3IgbncKCXBhY2sgJHcucG9zdEFjdGlvbnMgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQoKCXNldCBjcmVhdGVfYnJhbmNoX2NoZWNrb3V0IDEKCXNldCBjcmVhdGVfYnJhbmNoX2hlYWQgJGN1cnJlbnRfYnJhbmNoCglzZXQgY3JlYXRlX2JyYW5jaF9yZXZ0eXBlIGhlYWQKCXNldCBjcmVhdGVfYnJhbmNoX25hbWUgJHJlcG9fY29uZmlnKGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSkKCXNldCBjcmVhdGVfYnJhbmNoX3JldmV4cCB7fQoKCWJpbmQgJHcgPFZpc2liaWxpdHk+ICIKCQlncmFiICR3CgkJJHcuZGVzYy5uYW1lX3QgaWN1cnNvciBlbmQKCQlmb2N1cyAkdy5kZXNjLm5hbWVfdAoJIgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gImRlc3Ryb3kgJHciCgliaW5kICR3IDxLZXktUmV0dXJuPiAiZG9fY3JlYXRlX2JyYW5jaF9hY3Rpb24gJHc7YnJlYWsiCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogQ3JlYXRlIEJyYW5jaCIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBkb19kZWxldGVfYnJhbmNoX2FjdGlvbiB7d30gewoJZ2xvYmFsIGFsbF9oZWFkcwoJZ2xvYmFsIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIGRlbGV0ZV9icmFuY2hfaGVhZCBkZWxldGVfYnJhbmNoX3RyYWNraW5naGVhZAoKCXNldCBjaGVja19yZXYge30KCXN3aXRjaCAtLSAkZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgewoJaGVhZCB7c2V0IGNoZWNrX3JldiAkZGVsZXRlX2JyYW5jaF9oZWFkfQoJdHJhY2tpbmcge3NldCBjaGVja19yZXYgJGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkfQoJYWx3YXlzIHtzZXQgY2hlY2tfcmV2IHs6bm9uZX19Cgl9CglpZiB7JGNoZWNrX3JldiBlcSB7Om5vbmV9fSB7CgkJc2V0IGNoZWNrX2NtdCB7fQoJfSBlbHNlaWYge1tjYXRjaCB7c2V0IGNoZWNrX2NtdCBbZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAiJHtjaGVja19yZXZ9XjAiXX1dfSB7CgkJdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIGVycm9yIFwKCQkJLXR5cGUgb2sgXAoJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCgkJCS1wYXJlbnQgJHcgXAoJCQktbWVzc2FnZSAiSW52YWxpZCBjaGVjayByZXZpc2lvbjogJGNoZWNrX3JldiIKCQlyZXR1cm4KCX0KCglzZXQgdG9fZGVsZXRlIFtsaXN0XQoJc2V0IG5vdF9tZXJnZWQgW2xpc3RdCglmb3JlYWNoIGkgWyR3Lmxpc3QubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcubGlzdC5sIGdldCAkaV0KCQlpZiB7W2NhdGNoIHtzZXQgbyBbZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAkYl19XX0gY29udGludWUKCQlpZiB7JGNoZWNrX2NtdCBuZSB7fX0gewoJCQlpZiB7JGIgZXEgJGNoZWNrX3Jldn0gY29udGludWUKCQkJaWYge1tjYXRjaCB7c2V0IG0gW2dpdCBtZXJnZS1iYXNlICRvICRjaGVja19jbXRdfV19IGNvbnRpbnVlCgkJCWlmIHskbyBuZSAkbX0gewoJCQkJbGFwcGVuZCBub3RfbWVyZ2VkICRiCgkJCQljb250aW51ZQoJCQl9CgkJfQoJCWxhcHBlbmQgdG9fZGVsZXRlIFtsaXN0ICRiICRvXQoJfQoJaWYgeyRub3RfbWVyZ2VkIG5lIHt9fSB7CgkJc2V0IG1zZyAiVGhlIGZvbGxvd2luZyBicmFuY2hlcyBhcmUgbm90IGNvbXBsZXRlbHkgbWVyZ2VkIGludG8gJGNoZWNrX3JldjoKCiAtIFtqb2luICRub3RfbWVyZ2VkICJcbiAtICJdIgoJCXRrX21lc3NhZ2VCb3ggXAoJCQktaWNvbiBpbmZvIFwKCQkJLXR5cGUgb2sgXAoJCQktdGl0bGUgW3dtIHRpdGxlICR3XSBcCgkJCS1wYXJlbnQgJHcgXAoJCQktbWVzc2FnZSAkbXNnCgl9CglpZiB7JHRvX2RlbGV0ZSBlcSB7fX0gcmV0dXJuCglpZiB7JGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIGVxIHthbHdheXN9fSB7CgkJc2V0IG1zZyB7UmVjb3ZlcmluZyBkZWxldGVkIGJyYW5jaGVzIGlzIGRpZmZpY3VsdC4KCkRlbGV0ZSB0aGUgc2VsZWN0ZWQgYnJhbmNoZXM/fQoJCWlmIHtbdGtfbWVzc2FnZUJveCBcCgkJCS1pY29uIHdhcm5pbmcgXAoJCQktdHlwZSB5ZXNubyBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICRtc2ddIG5lIHllc30gewoJCQlyZXR1cm4KCQl9Cgl9CgoJc2V0IGZhaWxlZCB7fQoJZm9yZWFjaCBpICR0b19kZWxldGUgewoJCXNldCBiIFtsaW5kZXggJGkgMF0KCQlzZXQgbyBbbGluZGV4ICRpIDFdCgkJaWYge1tjYXRjaCB7Z2l0IHVwZGF0ZS1yZWYgLWQgInJlZnMvaGVhZHMvJGIiICRvfSBlcnJdfSB7CgkJCWFwcGVuZCBmYWlsZWQgIiAtICRiOiAkZXJyXG4iCgkJfSBlbHNlIHsKCQkJc2V0IHggW2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGFsbF9oZWFkcyAkYl0KCQkJaWYgeyR4ID49IDB9IHsKCQkJCXNldCBhbGxfaGVhZHMgW2xyZXBsYWNlICRhbGxfaGVhZHMgJHggJHhdCgkJCX0KCQl9Cgl9CgoJaWYgeyRmYWlsZWQgbmUge319IHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJGYWlsZWQgdG8gZGVsZXRlIGJyYW5jaGVzOlxuJGZhaWxlZCIKCX0KCglzZXQgYWxsX2hlYWRzIFtsc29ydCAkYWxsX2hlYWRzXQoJcG9wdWxhdGVfYnJhbmNoX21lbnUKCWRlc3Ryb3kgJHcKfQoKcHJvYyBkb19kZWxldGVfYnJhbmNoIHt9IHsKCWdsb2JhbCBhbGxfaGVhZHMgdHJhY2tpbmdfYnJhbmNoZXMgY3VycmVudF9icmFuY2gKCWdsb2JhbCBkZWxldGVfYnJhbmNoX2NoZWNrdHlwZSBkZWxldGVfYnJhbmNoX2hlYWQgZGVsZXRlX2JyYW5jaF90cmFja2luZ2hlYWQKCglzZXQgdyAuYnJhbmNoX2VkaXRvcgoJdG9wbGV2ZWwgJHcKCXdtIGdlb21ldHJ5ICR3ICIrW3dpbmZvIHJvb3R4IC5dK1t3aW5mbyByb290eSAuXSIKCglsYWJlbCAkdy5oZWFkZXIgLXRleHQge0RlbGV0ZSBMb2NhbCBCcmFuY2h9IFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy5jcmVhdGUgLXRleHQgRGVsZXRlIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkb19kZWxldGVfYnJhbmNoX2FjdGlvbiAkd10KCXBhY2sgJHcuYnV0dG9ucy5jcmVhdGUgLXNpZGUgcmlnaHQKCWJ1dHRvbiAkdy5idXR0b25zLmNhbmNlbCAtdGV4dCB7Q2FuY2VsfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KCXBhY2sgJHcuYnV0dG9ucy5jYW5jZWwgLXNpZGUgcmlnaHQgLXBhZHggNQoJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCgoJbGFiZWxmcmFtZSAkdy5saXN0IFwKCQktdGV4dCB7TG9jYWwgQnJhbmNoZXN9IFwKCQktZm9udCBmb250X3VpCglsaXN0Ym94ICR3Lmxpc3QubCBcCgkJLWhlaWdodCAxMCBcCgkJLXdpZHRoIDcwIFwKCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3Lmxpc3Quc2J5IHNldF0gXAoJCS1mb250IGZvbnRfdWkKCWZvcmVhY2ggaCAkYWxsX2hlYWRzIHsKCQlpZiB7JGggbmUgJGN1cnJlbnRfYnJhbmNofSB7CgkJCSR3Lmxpc3QubCBpbnNlcnQgZW5kICRoCgkJfQoJfQoJc2Nyb2xsYmFyICR3Lmxpc3Quc2J5IC1jb21tYW5kIFtsaXN0ICR3Lmxpc3QubCB5dmlld10KCXBhY2sgJHcubGlzdC5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5saXN0LmwgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5saXN0IC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQoKCWxhYmVsZnJhbWUgJHcudmFsaWRhdGUgXAoJCS10ZXh0IHtEZWxldGUgT25seSBJZn0gXAoJCS1mb250IGZvbnRfdWkKCXJhZGlvYnV0dG9uICR3LnZhbGlkYXRlLmhlYWRfciBcCgkJLXRleHQge01lcmdlZCBJbnRvIExvY2FsIEJyYW5jaDp9IFwKCQktdmFsdWUgaGVhZCBcCgkJLXZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIFwKCQktZm9udCBmb250X3VpCglldmFsIHRrX29wdGlvbk1lbnUgJHcudmFsaWRhdGUuaGVhZF9tIGRlbGV0ZV9icmFuY2hfaGVhZCAkYWxsX2hlYWRzCglncmlkICR3LnZhbGlkYXRlLmhlYWRfciAkdy52YWxpZGF0ZS5oZWFkX20gLXN0aWNreSB3CglzZXQgYWxsX3RyYWNraW5ncyBbYWxsX3RyYWNraW5nX2JyYW5jaGVzXQoJaWYgeyRhbGxfdHJhY2tpbmdzIG5lIHt9fSB7CgkJc2V0IGRlbGV0ZV9icmFuY2hfdHJhY2tpbmdoZWFkIFtsaW5kZXggJGFsbF90cmFja2luZ3MgMF0KCQlyYWRpb2J1dHRvbiAkdy52YWxpZGF0ZS50cmFja2luZ19yIFwKCQkJLXRleHQge01lcmdlZCBJbnRvIFRyYWNraW5nIEJyYW5jaDp9IFwKCQkJLXZhbHVlIHRyYWNraW5nIFwKCQkJLXZhcmlhYmxlIGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIFwKCQkJLWZvbnQgZm9udF91aQoJCWV2YWwgdGtfb3B0aW9uTWVudSAkdy52YWxpZGF0ZS50cmFja2luZ19tIFwKCQkJZGVsZXRlX2JyYW5jaF90cmFja2luZ2hlYWQgXAoJCQkkYWxsX3RyYWNraW5ncwoJCWdyaWQgJHcudmFsaWRhdGUudHJhY2tpbmdfciAkdy52YWxpZGF0ZS50cmFja2luZ19tIC1zdGlja3kgdwoJfQoJcmFkaW9idXR0b24gJHcudmFsaWRhdGUuYWx3YXlzX3IgXAoJCS10ZXh0IHtBbHdheXMgKERvIG5vdCBwZXJmb3JtIG1lcmdlIGNoZWNrcyl9IFwKCQktdmFsdWUgYWx3YXlzIFwKCQktdmFyaWFibGUgZGVsZXRlX2JyYW5jaF9jaGVja3R5cGUgXAoJCS1mb250IGZvbnRfdWkKCWdyaWQgJHcudmFsaWRhdGUuYWx3YXlzX3IgLWNvbHVtbnNwYW4gMiAtc3RpY2t5IHcKCWdyaWQgY29sdW1uY29uZmlndXJlICR3LnZhbGlkYXRlIDEgLXdlaWdodCAxCglwYWNrICR3LnZhbGlkYXRlIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglzZXQgZGVsZXRlX2JyYW5jaF9oZWFkICRjdXJyZW50X2JyYW5jaAoJc2V0IGRlbGV0ZV9icmFuY2hfY2hlY2t0eXBlIGhlYWQKCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBEZWxldGUgQnJhbmNoIgoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIHN3aXRjaF9icmFuY2gge25ld19icmFuY2h9IHsKCWdsb2JhbCBIRUFEIGNvbW1pdF90eXBlIGN1cnJlbnRfYnJhbmNoIHJlcG9fY29uZmlnCgoJaWYgeyFbbG9ja19pbmRleCBzd2l0Y2hdfSByZXR1cm4KCgkjIC0tIE91ciBpbiBtZW1vcnkgc3RhdGUgc2hvdWxkIG1hdGNoIHRoZSByZXBvc2l0b3J5LgoJIwoJcmVwb3NpdG9yeV9zdGF0ZSBjdXJUeXBlIGN1ckhFQUQgY3VyTUVSR0VfSEVBRAoJaWYge1tzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV0KCQkmJiAkY3VyVHlwZSBlcSB7bm9ybWFsfQoJCSYmICRjdXJIRUFEIGVxICRIRUFEfSB7Cgl9IGVsc2VpZiB7JGNvbW1pdF90eXBlIG5lICRjdXJUeXBlIHx8ICRIRUFEIG5lICRjdXJIRUFEfSB7CgkJaW5mb19wb3B1cCB7TGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuCgpBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkKc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkCmJlZm9yZSB0aGUgY3VycmVudCBicmFuY2ggY2FuIGJlIGNoYW5nZWQuCgpUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy4KfQoJCXVubG9ja19pbmRleAoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KCQlyZXR1cm4KCX0KCgkjIC0tIERvbid0IGRvIGEgcG9pbnRsZXNzIHN3aXRjaC4KCSMKCWlmIHskY3VycmVudF9icmFuY2ggZXEgJG5ld19icmFuY2h9IHsKCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0KCglpZiB7JHJlcG9fY29uZmlnKGd1aS50cnVzdG10aW1lKSBlcSB7dHJ1ZX19IHsKCQlzd2l0Y2hfYnJhbmNoX3N0YWdlMiB7fSAkbmV3X2JyYW5jaAoJfSBlbHNlIHsKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWZyZXNoaW5nIGZpbGUgc3RhdHVzLi4ufQoJCXNldCBjbWQgW2xpc3QgZ2l0IHVwZGF0ZS1pbmRleF0KCQlsYXBwZW5kIGNtZCAtcQoJCWxhcHBlbmQgY21kIC0tdW5tZXJnZWQKCQlsYXBwZW5kIGNtZCAtLWlnbm9yZS1taXNzaW5nCgkJbGFwcGVuZCBjbWQgLS1yZWZyZXNoCgkJc2V0IGZkX3JmIFtvcGVuICJ8ICRjbWQiIHJdCgkJZmNvbmZpZ3VyZSAkZmRfcmYgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeQoJCWZpbGVldmVudCAkZmRfcmYgcmVhZGFibGUgXAoJCQlbbGlzdCBzd2l0Y2hfYnJhbmNoX3N0YWdlMiAkZmRfcmYgJG5ld19icmFuY2hdCgl9Cn0KCnByb2Mgc3dpdGNoX2JyYW5jaF9zdGFnZTIge2ZkX3JmIG5ld19icmFuY2h9IHsKCWdsb2JhbCB1aV9zdGF0dXNfdmFsdWUgSEVBRAoKCWlmIHskZmRfcmYgbmUge319IHsKCQlyZWFkICRmZF9yZgoJCWlmIHshW2VvZiAkZmRfcmZdfSByZXR1cm4KCQljbG9zZSAkZmRfcmYKCX0KCglzZXQgdWlfc3RhdHVzX3ZhbHVlICJVcGRhdGluZyB3b3JraW5nIGRpcmVjdG9yeSB0byAnJG5ld19icmFuY2gnLi4uIgoJc2V0IGNtZCBbbGlzdCBnaXQgcmVhZC10cmVlXQoJbGFwcGVuZCBjbWQgLW0KCWxhcHBlbmQgY21kIC11CglsYXBwZW5kIGNtZCAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlCglsYXBwZW5kIGNtZCAkSEVBRAoJbGFwcGVuZCBjbWQgJG5ld19icmFuY2gKCXNldCBmZF9ydCBbb3BlbiAifCAkY21kIiByXQoJZmNvbmZpZ3VyZSAkZmRfcnQgLWJsb2NraW5nIDAgLXRyYW5zbGF0aW9uIGJpbmFyeQoJZmlsZWV2ZW50ICRmZF9ydCByZWFkYWJsZSBcCgkJW2xpc3Qgc3dpdGNoX2JyYW5jaF9yZWFkdHJlZV93YWl0ICRmZF9ydCAkbmV3X2JyYW5jaF0KfQoKcHJvYyBzd2l0Y2hfYnJhbmNoX3JlYWR0cmVlX3dhaXQge2ZkX3J0IG5ld19icmFuY2h9IHsKCWdsb2JhbCBzZWxlY3RlZF9jb21taXRfdHlwZSBjb21taXRfdHlwZSBIRUFEIE1FUkdFX0hFQUQgUEFSRU5UCglnbG9iYWwgY3VycmVudF9icmFuY2gKCWdsb2JhbCB1aV9jb21tIHVpX3N0YXR1c192YWx1ZQoKCSMgLS0gV2UgbmV2ZXIgZ2V0IGludGVyZXN0aW5nIG91dHB1dCBvbiBzdGRvdXQ7IG9ubHkgc3RkZXJyLgoJIwoJcmVhZCAkZmRfcnQKCWZjb25maWd1cmUgJGZkX3J0IC1ibG9ja2luZyAxCglpZiB7IVtlb2YgJGZkX3J0XX0gewoJCWZjb25maWd1cmUgJGZkX3J0IC1ibG9ja2luZyAwCgkJcmV0dXJuCgl9CgoJIyAtLSBUaGUgd29ya2luZyBkaXJlY3Rvcnkgd2Fzbid0IGluIHN5bmMgd2l0aCB0aGUgaW5kZXggYW5kCgkjICAgIHdlJ2QgaGF2ZSB0byBvdmVyd3JpdGUgc29tZXRoaW5nIHRvIG1ha2UgdGhlIHN3aXRjaC4gQQoJIyAgICBtZXJnZSBpcyByZXF1aXJlZC4KCSMKCWlmIHtbY2F0Y2gge2Nsb3NlICRmZF9ydH0gZXJyXX0gewoJCXJlZ3N1YiB7XmZhdGFsOiB9ICRlcnIge30gZXJyCgkJd2Fybl9wb3B1cCAiRmlsZSBsZXZlbCBtZXJnZSByZXF1aXJlZC4KCiRlcnIKClN0YXlpbmcgb24gYnJhbmNoICckY3VycmVudF9icmFuY2gnLiIKCQlzZXQgdWlfc3RhdHVzX3ZhbHVlICJBYm9ydGVkIGNoZWNrb3V0IG9mICckbmV3X2JyYW5jaCcgKGZpbGUgbGV2ZWwgbWVyZ2luZyBpcyByZXF1aXJlZCkuIgoJCXVubG9ja19pbmRleAoJCXJldHVybgoJfQoKCSMgLS0gVXBkYXRlIHRoZSBzeW1ib2xpYyByZWYuICBDb3JlIGdpdCBkb2Vzbid0IGV2ZW4gY2hlY2sgZm9yIGZhaWx1cmUKCSMgICAgaGVyZSwgaXQgSnVzdCBXb3Jrcyh0bSkuICBJZiBpdCBkb2Vzbid0IHdlIGFyZSBpbiBzb21lIHJlYWxseSB1Z2x5CgkjICAgIHN0YXRlIHRoYXQgaXMgZGlmZmljdWx0IHRvIHJlY292ZXIgZnJvbSB3aXRoaW4gZ2l0LWd1aS4KCSMKCWlmIHtbY2F0Y2gge2dpdCBzeW1ib2xpYy1yZWYgSEVBRCAicmVmcy9oZWFkcy8kbmV3X2JyYW5jaCJ9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvIHNldCBjdXJyZW50IGJyYW5jaC4KClRoaXMgd29ya2luZyBkaXJlY3RvcnkgaXMgb25seSBwYXJ0aWFsbHkgc3dpdGNoZWQuCldlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHlvdXIgZmlsZXMsIGJ1dCBmYWlsZWQgdG8KdXBkYXRlIGFuIGludGVybmFsIEdpdCBmaWxlLgoKVGhpcyBzaG91bGQgbm90IGhhdmUgb2NjdXJyZWQuICBbYXBwbmFtZV0gd2lsbCBub3cKY2xvc2UgYW5kIGdpdmUgdXAuCgokZXJyIgoJCWRvX3F1aXQKCQlyZXR1cm4KCX0KCgkjIC0tIFVwZGF0ZSBvdXIgcmVwb3NpdG9yeSBzdGF0ZS4gIElmIHdlIHdlcmUgcHJldmlvdXNseSBpbiBhbWVuZCBtb2RlCgkjICAgIHdlIG5lZWQgdG8gdG9zcyB0aGUgY3VycmVudCBidWZmZXIgYW5kIGRvIGEgZnVsbCByZXNjYW4gdG8gdXBkYXRlCgkjICAgIG91ciBmaWxlIGxpc3RzLiAgSWYgd2Ugd2VyZW4ndCBpbiBhbWVuZCBtb2RlIG91ciBmaWxlIGxpc3RzIGFyZQoJIyAgICBhY2N1cmF0ZSBhbmQgd2UgY2FuIGF2b2lkIHRoZSByZXNjYW4uCgkjCgl1bmxvY2tfaW5kZXgKCXNldCBzZWxlY3RlZF9jb21taXRfdHlwZSBuZXcKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJJHVpX2NvbW0gZGVsZXRlIDAuMCBlbmQKCQkkdWlfY29tbSBlZGl0IHJlc2V0CgkJJHVpX2NvbW0gZWRpdCBtb2RpZmllZCBmYWxzZQoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSAiQ2hlY2tlZCBvdXQgYnJhbmNoICckY3VycmVudF9icmFuY2gnLiJ9Cgl9IGVsc2UgewoJCXJlcG9zaXRvcnlfc3RhdGUgY29tbWl0X3R5cGUgSEVBRCBNRVJHRV9IRUFECgkJc2V0IFBBUkVOVCAkSEVBRAoJCXNldCB1aV9zdGF0dXNfdmFsdWUgIkNoZWNrZWQgb3V0IGJyYW5jaCAnJGN1cnJlbnRfYnJhbmNoJy4iCgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgcmVtb3RlIG1hbmFnZW1lbnQKCnByb2MgbG9hZF9hbGxfcmVtb3RlcyB7fSB7CglnbG9iYWwgcmVwb19jb25maWcKCWdsb2JhbCBhbGxfcmVtb3RlcyB0cmFja2luZ19icmFuY2hlcwoKCXNldCBhbGxfcmVtb3RlcyBbbGlzdF0KCWFycmF5IHVuc2V0IHRyYWNraW5nX2JyYW5jaGVzCgoJc2V0IHJtX2RpciBbZ2l0ZGlyIHJlbW90ZXNdCglpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJHJtX2Rpcl19IHsKCQlzZXQgYWxsX3JlbW90ZXMgW2dsb2IgXAoJCQktdHlwZXMgZiBcCgkJCS10YWlscyBcCgkJCS1ub2NvbXBsYWluIFwKCQkJLWRpcmVjdG9yeSAkcm1fZGlyICpdCgoJCWZvcmVhY2ggbmFtZSAkYWxsX3JlbW90ZXMgewoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gW2ZpbGUgam9pbiAkcm1fZGlyICRuYW1lXSByXQoJCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJCQkJaWYgeyFbcmVnZXhwIHteUHVsbDpbIAldKihbXjpdKyk6KC4rKSR9IFwKCQkJCQkJJGxpbmUgbGluZSBzcmMgZHN0XX0gY29udGludWUKCQkJCQlpZiB7IVtyZWdleHAgXnJlZnMvICRkc3RdfSB7CgkJCQkJCXNldCBkc3QgInJlZnMvaGVhZHMvJGRzdCIKCQkJCQl9CgkJCQkJc2V0IHRyYWNraW5nX2JyYW5jaGVzKCRkc3QpIFtsaXN0ICRuYW1lICRzcmNdCgkJCQl9CgkJCQljbG9zZSAkZmQKCQkJfQoJCX0KCX0KCglmb3JlYWNoIGxpbmUgW2FycmF5IG5hbWVzIHJlcG9fY29uZmlnIHJlbW90ZS4qLnVybF0gewoJCWlmIHshW3JlZ2V4cCBecmVtb3RlXC4oLiopXC51cmxcJCAkbGluZSBsaW5lIG5hbWVdfSBjb250aW51ZQoJCWxhcHBlbmQgYWxsX3JlbW90ZXMgJG5hbWUKCgkJaWYge1tjYXRjaCB7c2V0IGZsICRyZXBvX2NvbmZpZyhyZW1vdGUuJG5hbWUuZmV0Y2gpfV19IHsKCQkJc2V0IGZsIHt9CgkJfQoJCWZvcmVhY2ggbGluZSAkZmwgewoJCQlpZiB7IVtyZWdleHAge14oW146XSspOiguKykkfSAkbGluZSBsaW5lIHNyYyBkc3RdfSBjb250aW51ZQoJCQlpZiB7IVtyZWdleHAgXnJlZnMvICRkc3RdfSB7CgkJCQlzZXQgZHN0ICJyZWZzL2hlYWRzLyRkc3QiCgkJCX0KCQkJc2V0IHRyYWNraW5nX2JyYW5jaGVzKCRkc3QpIFtsaXN0ICRuYW1lICRzcmNdCgkJfQoJfQoKCXNldCBhbGxfcmVtb3RlcyBbbHNvcnQgLXVuaXF1ZSAkYWxsX3JlbW90ZXNdCn0KCnByb2MgcG9wdWxhdGVfZmV0Y2hfbWVudSB7fSB7CglnbG9iYWwgYWxsX3JlbW90ZXMgcmVwb19jb25maWcKCglzZXQgbSAubWJhci5mZXRjaAoJZm9yZWFjaCByICRhbGxfcmVtb3RlcyB7CgkJc2V0IGVuYWJsZSAwCgkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIudXJsKX1dfSB7CgkJCWlmIHshW2NhdGNoIHtzZXQgYSAkcmVwb19jb25maWcocmVtb3RlLiRyLmZldGNoKX1dfSB7CgkJCQlzZXQgZW5hYmxlIDEKCQkJfQoJCX0gZWxzZSB7CgkJCWNhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiBbZ2l0ZGlyIHJlbW90ZXMgJHJdIHJdCgkJCQl3aGlsZSB7W2dldHMgJGZkIG5dID49IDB9IHsKCQkJCQlpZiB7W3JlZ2V4cCB7XlB1bGw6WyBcdF0qKFteOl0rKTp9ICRuXX0gewoJCQkJCQlzZXQgZW5hYmxlIDEKCQkJCQkJYnJlYWsKCQkJCQl9CgkJCQl9CgkJCQljbG9zZSAkZmQKCQkJfQoJCX0KCgkJaWYgeyRlbmFibGV9IHsKCQkJJG0gYWRkIGNvbW1hbmQgXAoJCQkJLWxhYmVsICJGZXRjaCBmcm9tICRyLi4uIiBcCgkJCQktY29tbWFuZCBbbGlzdCBmZXRjaF9mcm9tICRyXSBcCgkJCQktZm9udCBmb250X3VpCgkJfQoJfQp9Cgpwcm9jIHBvcHVsYXRlX3B1c2hfbWVudSB7fSB7CglnbG9iYWwgYWxsX3JlbW90ZXMgcmVwb19jb25maWcKCglzZXQgbSAubWJhci5wdXNoCglzZXQgZmFzdF9jb3VudCAwCglmb3JlYWNoIHIgJGFsbF9yZW1vdGVzIHsKCQlzZXQgZW5hYmxlIDAKCQlpZiB7IVtjYXRjaCB7c2V0IGEgJHJlcG9fY29uZmlnKHJlbW90ZS4kci51cmwpfV19IHsKCQkJaWYgeyFbY2F0Y2gge3NldCBhICRyZXBvX2NvbmZpZyhyZW1vdGUuJHIucHVzaCl9XX0gewoJCQkJc2V0IGVuYWJsZSAxCgkJCX0KCQl9IGVsc2UgewoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gW2dpdGRpciByZW1vdGVzICRyXSByXQoJCQkJd2hpbGUge1tnZXRzICRmZCBuXSA+PSAwfSB7CgkJCQkJaWYge1tyZWdleHAge15QdXNoOlsgXHRdKihbXjpdKyk6fSAkbl19IHsKCQkJCQkJc2V0IGVuYWJsZSAxCgkJCQkJCWJyZWFrCgkJCQkJfQoJCQkJfQoJCQkJY2xvc2UgJGZkCgkJCX0KCQl9CgoJCWlmIHskZW5hYmxlfSB7CgkJCWlmIHshJGZhc3RfY291bnR9IHsKCQkJCSRtIGFkZCBzZXBhcmF0b3IKCQkJfQoJCQkkbSBhZGQgY29tbWFuZCBcCgkJCQktbGFiZWwgIlB1c2ggdG8gJHIuLi4iIFwKCQkJCS1jb21tYW5kIFtsaXN0IHB1c2hfdG8gJHJdIFwKCQkJCS1mb250IGZvbnRfdWkKCQkJaW5jciBmYXN0X2NvdW50CgkJfQoJfQp9Cgpwcm9jIHN0YXJ0X3B1c2hfYW55d2hlcmVfYWN0aW9uIHt3fSB7CglnbG9iYWwgcHVzaF91cmx0eXBlIHB1c2hfcmVtb3RlIHB1c2hfdXJsIHB1c2hfdGhpbiBwdXNoX3RhZ3MKCglzZXQgcl91cmwge30KCXN3aXRjaCAtLSAkcHVzaF91cmx0eXBlIHsKCXJlbW90ZSB7c2V0IHJfdXJsICRwdXNoX3JlbW90ZX0KCXVybCB7c2V0IHJfdXJsICRwdXNoX3VybH0KCX0KCWlmIHskcl91cmwgZXEge319IHJldHVybgoKCXNldCBjbWQgW2xpc3QgZ2l0IHB1c2hdCglsYXBwZW5kIGNtZCAtdgoJaWYgeyRwdXNoX3RoaW59IHsKCQlsYXBwZW5kIGNtZCAtLXRoaW4KCX0KCWlmIHskcHVzaF90YWdzfSB7CgkJbGFwcGVuZCBjbWQgLS10YWdzCgl9CglsYXBwZW5kIGNtZCAkcl91cmwKCXNldCBjbnQgMAoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcuc291cmNlLmwgZ2V0ICRpXQoJCWxhcHBlbmQgY21kICJyZWZzL2hlYWRzLyRiOnJlZnMvaGVhZHMvJGIiCgkJaW5jciBjbnQKCX0KCWlmIHskY250ID09IDB9IHsKCQlyZXR1cm4KCX0gZWxzZWlmIHskY250ID09IDF9IHsKCQlzZXQgdW5pdCBicmFuY2gKCX0gZWxzZSB7CgkJc2V0IHVuaXQgYnJhbmNoZXMKCX0KCglzZXQgY29ucyBbbmV3X2NvbnNvbGUgInB1c2ggJHJfdXJsIiAiUHVzaGluZyAkY250ICR1bml0IHRvICRyX3VybCJdCgljb25zb2xlX2V4ZWMgJGNvbnMgJGNtZCBjb25zb2xlX2RvbmUKCWRlc3Ryb3kgJHcKfQoKdHJhY2UgYWRkIHZhcmlhYmxlIHB1c2hfcmVtb3RlIHdyaXRlIFwKCVtsaXN0IHJhZGlvX3NlbGVjdG9yIHB1c2hfdXJsdHlwZSByZW1vdGVdCgpwcm9jIGRvX3B1c2hfYW55d2hlcmUge30gewoJZ2xvYmFsIGFsbF9oZWFkcyBhbGxfcmVtb3RlcyBjdXJyZW50X2JyYW5jaAoJZ2xvYmFsIHB1c2hfdXJsdHlwZSBwdXNoX3JlbW90ZSBwdXNoX3VybCBwdXNoX3RoaW4gcHVzaF90YWdzCgoJc2V0IHcgLnB1c2hfc2V0dXAKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtQdXNoIEJyYW5jaGVzfSAtZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy5jcmVhdGUgLXRleHQgUHVzaCBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3Qgc3RhcnRfcHVzaF9hbnl3aGVyZV9hY3Rpb24gJHddCglwYWNrICR3LmJ1dHRvbnMuY3JlYXRlIC1zaWRlIHJpZ2h0CglidXR0b24gJHcuYnV0dG9ucy5jYW5jZWwgLXRleHQge0NhbmNlbH0gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglwYWNrICR3LmJ1dHRvbnMuY2FuY2VsIC1zaWRlIHJpZ2h0IC1wYWR4IDUKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWxhYmVsZnJhbWUgJHcuc291cmNlIFwKCQktdGV4dCB7U291cmNlIEJyYW5jaGVzfSBcCgkJLWZvbnQgZm9udF91aQoJbGlzdGJveCAkdy5zb3VyY2UubCBcCgkJLWhlaWdodCAxMCBcCgkJLXdpZHRoIDcwIFwKCQktc2VsZWN0bW9kZSBleHRlbmRlZCBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3LnNvdXJjZS5zYnkgc2V0XSBcCgkJLWZvbnQgZm9udF91aQoJZm9yZWFjaCBoICRhbGxfaGVhZHMgewoJCSR3LnNvdXJjZS5sIGluc2VydCBlbmQgJGgKCQlpZiB7JGggZXEgJGN1cnJlbnRfYnJhbmNofSB7CgkJCSR3LnNvdXJjZS5sIHNlbGVjdCBzZXQgZW5kCgkJfQoJfQoJc2Nyb2xsYmFyICR3LnNvdXJjZS5zYnkgLWNvbW1hbmQgW2xpc3QgJHcuc291cmNlLmwgeXZpZXddCglwYWNrICR3LnNvdXJjZS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5zb3VyY2UubCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCglwYWNrICR3LnNvdXJjZSAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeSA1IC1wYWR4IDUKCglsYWJlbGZyYW1lICR3LmRlc3QgXAoJCS10ZXh0IHtEZXN0aW5hdGlvbiBSZXBvc2l0b3J5fSBcCgkJLWZvbnQgZm9udF91aQoJaWYgeyRhbGxfcmVtb3RlcyBuZSB7fX0gewoJCXJhZGlvYnV0dG9uICR3LmRlc3QucmVtb3RlX3IgXAoJCQktdGV4dCB7UmVtb3RlOn0gXAoJCQktdmFsdWUgcmVtb3RlIFwKCQkJLXZhcmlhYmxlIHB1c2hfdXJsdHlwZSBcCgkJCS1mb250IGZvbnRfdWkKCQlldmFsIHRrX29wdGlvbk1lbnUgJHcuZGVzdC5yZW1vdGVfbSBwdXNoX3JlbW90ZSAkYWxsX3JlbW90ZXMKCQlncmlkICR3LmRlc3QucmVtb3RlX3IgJHcuZGVzdC5yZW1vdGVfbSAtc3RpY2t5IHcKCQlpZiB7W2xzZWFyY2ggLXNvcnRlZCAtZXhhY3QgJGFsbF9yZW1vdGVzIG9yaWdpbl0gIT0gLTF9IHsKCQkJc2V0IHB1c2hfcmVtb3RlIG9yaWdpbgoJCX0gZWxzZSB7CgkJCXNldCBwdXNoX3JlbW90ZSBbbGluZGV4ICRhbGxfcmVtb3RlcyAwXQoJCX0KCQlzZXQgcHVzaF91cmx0eXBlIHJlbW90ZQoJfSBlbHNlIHsKCQlzZXQgcHVzaF91cmx0eXBlIHVybAoJfQoJcmFkaW9idXR0b24gJHcuZGVzdC51cmxfciBcCgkJLXRleHQge0FyYml0cmFyeSBVUkw6fSBcCgkJLXZhbHVlIHVybCBcCgkJLXZhcmlhYmxlIHB1c2hfdXJsdHlwZSBcCgkJLWZvbnQgZm9udF91aQoJZW50cnkgJHcuZGVzdC51cmxfdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggNTAgXAoJCS10ZXh0dmFyaWFibGUgcHVzaF91cmwgXAoJCS1mb250IGZvbnRfdWkgXAoJCS12YWxpZGF0ZSBrZXkgXAoJCS12YWxpZGF0ZWNvbW1hbmQgewoJCQlpZiB7JWQgPT0gMSAmJiBbcmVnZXhwIHtcc30gJVNdfSB7cmV0dXJuIDB9CgkJCWlmIHslZCA9PSAxICYmIFtzdHJpbmcgbGVuZ3RoICVTXSA+IDB9IHsKCQkJCXNldCBwdXNoX3VybHR5cGUgdXJsCgkJCX0KCQkJcmV0dXJuIDEKCQl9CglncmlkICR3LmRlc3QudXJsX3IgJHcuZGVzdC51cmxfdCAtc3RpY2t5IHdlIC1wYWR4IHswIDV9CglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5kZXN0IDEgLXdlaWdodCAxCglwYWNrICR3LmRlc3QgLWFuY2hvciBudyAtZmlsbCB4IC1wYWR5IDUgLXBhZHggNQoKCWxhYmVsZnJhbWUgJHcub3B0aW9ucyBcCgkJLXRleHQge1RyYW5zZmVyIE9wdGlvbnN9IFwKCQktZm9udCBmb250X3VpCgljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRoaW4gXAoJCS10ZXh0IHtVc2UgdGhpbiBwYWNrIChmb3Igc2xvdyBuZXR3b3JrIGNvbm5lY3Rpb25zKX0gXAoJCS12YXJpYWJsZSBwdXNoX3RoaW4gXAoJCS1mb250IGZvbnRfdWkKCWdyaWQgJHcub3B0aW9ucy50aGluIC1jb2x1bW5zcGFuIDIgLXN0aWNreSB3CgljaGVja2J1dHRvbiAkdy5vcHRpb25zLnRhZ3MgXAoJCS10ZXh0IHtJbmNsdWRlIHRhZ3N9IFwKCQktdmFyaWFibGUgcHVzaF90YWdzIFwKCQktZm9udCBmb250X3VpCglncmlkICR3Lm9wdGlvbnMudGFncyAtY29sdW1uc3BhbiAyIC1zdGlja3kgdwoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcub3B0aW9ucyAxIC13ZWlnaHQgMQoJcGFjayAkdy5vcHRpb25zIC1hbmNob3IgbncgLWZpbGwgeCAtcGFkeSA1IC1wYWR4IDUKCglzZXQgcHVzaF91cmwge30KCXNldCBwdXNoX3RoaW4gMAoJc2V0IHB1c2hfdGFncyAwCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBQdXNoIgoJdGt3YWl0IHdpbmRvdyAkdwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIG1lcmdlCgpwcm9jIGNhbl9tZXJnZSB7fSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBmaWxlX3N0YXRlcwoKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJaW5mb19wb3B1cCB7Q2Fubm90IG1lcmdlIHdoaWxlIGFtZW5kaW5nLgoKWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0IGJlZm9yZQpzdGFydGluZyBhbnkgdHlwZSBvZiBtZXJnZS4KfQoJCXJldHVybiAwCgl9CgoJaWYge1tjb21taXR0ZXJfaWRlbnRdIGVxIHt9fSB7cmV0dXJuIDB9CglpZiB7IVtsb2NrX2luZGV4IG1lcmdlXX0ge3JldHVybiAwfQoKCSMgLS0gT3VyIGluIG1lbW9yeSBzdGF0ZSBzaG91bGQgbWF0Y2ggdGhlIHJlcG9zaXRvcnkuCgkjCglyZXBvc2l0b3J5X3N0YXRlIGN1clR5cGUgY3VySEVBRCBjdXJNRVJHRV9IRUFECglpZiB7JGNvbW1pdF90eXBlIG5lICRjdXJUeXBlIHx8ICRIRUFEIG5lICRjdXJIRUFEfSB7CgkJaW5mb19wb3B1cCB7TGFzdCBzY2FubmVkIHN0YXRlIGRvZXMgbm90IG1hdGNoIHJlcG9zaXRvcnkgc3RhdGUuCgpBbm90aGVyIEdpdCBwcm9ncmFtIGhhcyBtb2RpZmllZCB0aGlzIHJlcG9zaXRvcnkKc2luY2UgdGhlIGxhc3Qgc2Nhbi4gIEEgcmVzY2FuIG11c3QgYmUgcGVyZm9ybWVkCmJlZm9yZSBhIG1lcmdlIGNhbiBiZSBwZXJmb3JtZWQuCgpUaGUgcmVzY2FuIHdpbGwgYmUgYXV0b21hdGljYWxseSBzdGFydGVkIG5vdy4KfQoJCXVubG9ja19pbmRleAoJCXJlc2NhbiB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX0KCQlyZXR1cm4gMAoJfQoKCWZvcmVhY2ggcGF0aCBbYXJyYXkgbmFtZXMgZmlsZV9zdGF0ZXNdIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlfTyB7CgkJCWNvbnRpbnVlOyAjIGFuZCBwcmF5IGl0IHdvcmtzIQoJCX0KCQlVPyB7CgkJCWVycm9yX3BvcHVwICJZb3UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25mbGljdGVkIG1lcmdlLgoKRmlsZSBbc2hvcnRfcGF0aCAkcGF0aF0gaGFzIG1lcmdlIGNvbmZsaWN0cy4KCllvdSBtdXN0IHJlc29sdmUgdGhlbSwgYWRkIHRoZSBmaWxlLCBhbmQgY29tbWl0IHRvCmNvbXBsZXRlIHRoZSBjdXJyZW50IG1lcmdlLiAgT25seSB0aGVuIGNhbiB5b3UKYmVnaW4gYW5vdGhlciBtZXJnZS4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuIDAKCQl9CgkJPz8gewoJCQllcnJvcl9wb3B1cCAiWW91IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhbmdlLgoKRmlsZSBbc2hvcnRfcGF0aCAkcGF0aF0gaXMgbW9kaWZpZWQuCgpZb3Ugc2hvdWxkIGNvbXBsZXRlIHRoZSBjdXJyZW50IGNvbW1pdCBiZWZvcmUKc3RhcnRpbmcgYSBtZXJnZS4gIERvaW5nIHNvIHdpbGwgaGVscCB5b3UgYWJvcnQKYSBmYWlsZWQgbWVyZ2UsIHNob3VsZCB0aGUgbmVlZCBhcmlzZS4KIgoJCQl1bmxvY2tfaW5kZXgKCQkJcmV0dXJuIDAKCQl9CgkJfQoJfQoKCXJldHVybiAxCn0KCnByb2MgdmlzdWFsaXplX2xvY2FsX21lcmdlIHt3fSB7CglzZXQgcmV2cyB7fQoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlsYXBwZW5kIHJldnMgWyR3LnNvdXJjZS5sIGdldCAkaV0KCX0KCWlmIHskcmV2cyBlcSB7fX0gcmV0dXJuCglsYXBwZW5kIHJldnMgLS1ub3QgSEVBRAoJZG9fZ2l0ayAkcmV2cwp9Cgpwcm9jIHN0YXJ0X2xvY2FsX21lcmdlX2FjdGlvbiB7d30gewoJZ2xvYmFsIEhFQUQgdWlfc3RhdHVzX3ZhbHVlIGN1cnJlbnRfYnJhbmNoCgoJc2V0IGNtZCBbbGlzdCBnaXQgbWVyZ2VdCglzZXQgbmFtZXMge30KCXNldCByZXZjbnQgMAoJZm9yZWFjaCBpIFskdy5zb3VyY2UubCBjdXJzZWxlY3Rpb25dIHsKCQlzZXQgYiBbJHcuc291cmNlLmwgZ2V0ICRpXQoJCWxhcHBlbmQgY21kICRiCgkJbGFwcGVuZCBuYW1lcyAkYgoJCWluY3IgcmV2Y250Cgl9CgoJaWYgeyRyZXZjbnQgPT0gMH0gewoJCXJldHVybgoJfSBlbHNlaWYgeyRyZXZjbnQgPT0gMX0gewoJCXNldCB1bml0IGJyYW5jaAoJfSBlbHNlaWYgeyRyZXZjbnQgPD0gMTV9IHsKCQlzZXQgdW5pdCBicmFuY2hlcwoJfSBlbHNlIHsKCQl0a19tZXNzYWdlQm94IFwKCQkJLWljb24gZXJyb3IgXAoJCQktdHlwZSBvayBcCgkJCS10aXRsZSBbd20gdGl0bGUgJHddIFwKCQkJLXBhcmVudCAkdyBcCgkJCS1tZXNzYWdlICJUb28gbWFueSBicmFuY2hlcyBzZWxlY3RlZC4KCllvdSBoYXZlIHJlcXVlc3RlZCB0byBtZXJnZSAkcmV2Y250IGJyYW5jaGVzCmluIGFuIG9jdG9wdXMgbWVyZ2UuICBUaGlzIGV4Y2VlZHMgR2l0J3MKaW50ZXJuYWwgbGltaXQgb2YgMTUgYnJhbmNoZXMgcGVyIG1lcmdlLgoKUGxlYXNlIHNlbGVjdCBmZXdlciBicmFuY2hlcy4gIFRvIG1lcmdlIG1vcmUKdGhhbiAxNSBicmFuY2hlcywgbWVyZ2UgdGhlIGJyYW5jaGVzIGluIGJhdGNoZXMuCiIKCQlyZXR1cm4KCX0KCglzZXQgbXNnICJNZXJnaW5nICRjdXJyZW50X2JyYW5jaCwgW2pvaW4gJG5hbWVzIHssIH1dIgoJc2V0IHVpX3N0YXR1c192YWx1ZSAiJG1zZy4uLiIKCXNldCBjb25zIFtuZXdfY29uc29sZSAiTWVyZ2UiICRtc2ddCgljb25zb2xlX2V4ZWMgJGNvbnMgJGNtZCBbbGlzdCBmaW5pc2hfbWVyZ2UgJHJldmNudF0KCWJpbmQgJHcgPERlc3Ryb3k+IHt9CglkZXN0cm95ICR3Cn0KCnByb2MgZmluaXNoX21lcmdlIHtyZXZjbnQgdyBva30gewoJY29uc29sZV9kb25lICR3ICRvawoJaWYgeyRva30gewoJCXNldCBtc2cge01lcmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkufQoJfSBlbHNlIHsKCQlpZiB7JHJldmNudCAhPSAxfSB7CgkJCWluZm9fcG9wdXAgIk9jdG9wdXMgbWVyZ2UgZmFpbGVkLgoKWW91ciBtZXJnZSBvZiAkcmV2Y250IGJyYW5jaGVzIGhhcyBmYWlsZWQuCgpUaGVyZSBhcmUgZmlsZS1sZXZlbCBjb25mbGljdHMgYmV0d2VlbiB0aGUKYnJhbmNoZXMgd2hpY2ggbXVzdCBiZSByZXNvbHZlZCBtYW51YWxseS4KClRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aWxsIG5vdyBiZSByZXNldC4KCllvdSBjYW4gYXR0ZW1wdCB0aGlzIG1lcmdlIGFnYWluCmJ5IG1lcmdpbmcgb25seSBvbmUgYnJhbmNoIGF0IGEgdGltZS4iICR3CgoJCQlzZXQgZmQgW29wZW4gInwgZ2l0IHJlYWQtdHJlZSAtLXJlc2V0IC11IEhFQUQiIHJdCgkJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZXNldF9oYXJkX3dhaXQgJGZkXQoJCQlzZXQgdWlfc3RhdHVzX3ZhbHVlIHtBYm9ydGluZy4uLiBwbGVhc2Ugd2FpdC4uLn0KCQkJcmV0dXJuCgkJfQoKCQlzZXQgbXNnIHtNZXJnZSBmYWlsZWQuICBDb25mbGljdCByZXNvbHV0aW9uIGlzIHJlcXVpcmVkLn0KCX0KCXVubG9ja19pbmRleAoJcmVzY2FuIFtsaXN0IHNldCB1aV9zdGF0dXNfdmFsdWUgJG1zZ10KfQoKcHJvYyBkb19sb2NhbF9tZXJnZSB7fSB7CglnbG9iYWwgY3VycmVudF9icmFuY2gKCglpZiB7IVtjYW5fbWVyZ2VdfSByZXR1cm4KCglzZXQgdyAubWVyZ2Vfc2V0dXAKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIFwKCQktdGV4dCAiTWVyZ2UgSW50byAkY3VycmVudF9icmFuY2giIFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zCglidXR0b24gJHcuYnV0dG9ucy52aXN1YWxpemUgLXRleHQgVmlzdWFsaXplIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCB2aXN1YWxpemVfbG9jYWxfbWVyZ2UgJHddCglwYWNrICR3LmJ1dHRvbnMudmlzdWFsaXplIC1zaWRlIGxlZnQKCWJ1dHRvbiAkdy5idXR0b25zLmNyZWF0ZSAtdGV4dCBNZXJnZSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3Qgc3RhcnRfbG9jYWxfbWVyZ2VfYWN0aW9uICR3XQoJcGFjayAkdy5idXR0b25zLmNyZWF0ZSAtc2lkZSByaWdodAoJYnV0dG9uICR3LmJ1dHRvbnMuY2FuY2VsIC10ZXh0IHtDYW5jZWx9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBbbGlzdCBkZXN0cm95ICR3XQoJcGFjayAkdy5idXR0b25zLmNhbmNlbCAtc2lkZSByaWdodCAtcGFkeCA1CglwYWNrICR3LmJ1dHRvbnMgLXNpZGUgYm90dG9tIC1maWxsIHggLXBhZHkgMTAgLXBhZHggMTAKCglsYWJlbGZyYW1lICR3LnNvdXJjZSBcCgkJLXRleHQge1NvdXJjZSBCcmFuY2hlc30gXAoJCS1mb250IGZvbnRfdWkKCWxpc3Rib3ggJHcuc291cmNlLmwgXAoJCS1oZWlnaHQgMTAgXAoJCS13aWR0aCA3MCBcCgkJLXNlbGVjdG1vZGUgZXh0ZW5kZWQgXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5zb3VyY2Uuc2J5IHNldF0gXAoJCS1mb250IGZvbnRfdWkKCXNjcm9sbGJhciAkdy5zb3VyY2Uuc2J5IC1jb21tYW5kIFtsaXN0ICR3LnNvdXJjZS5sIHl2aWV3XQoJcGFjayAkdy5zb3VyY2Uuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHcuc291cmNlLmwgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5zb3VyY2UgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CgoJc2V0IGNtZCBbbGlzdCBnaXQgZm9yLWVhY2gtcmVmXQoJbGFwcGVuZCBjbWQgey0tZm9ybWF0PSUob2JqZWN0bmFtZSkgJSgqb2JqZWN0bmFtZSkgJShyZWZuYW1lKX0KCWxhcHBlbmQgY21kIHJlZnMvaGVhZHMKCWxhcHBlbmQgY21kIHJlZnMvcmVtb3RlcwoJbGFwcGVuZCBjbWQgcmVmcy90YWdzCglzZXQgZnJfZmQgW29wZW4gInwgJGNtZCIgcl0KCWZjb25maWd1cmUgJGZyX2ZkIC10cmFuc2xhdGlvbiBiaW5hcnkKCXdoaWxlIHtbZ2V0cyAkZnJfZmQgbGluZV0gPiAwfSB7CgkJc2V0IGxpbmUgW3NwbGl0ICRsaW5lIHsgfV0KCQlzZXQgc2hhMShbbGluZGV4ICRsaW5lIDBdKSBbbGluZGV4ICRsaW5lIDJdCgkJc2V0IHNoYTEoW2xpbmRleCAkbGluZSAxXSkgW2xpbmRleCAkbGluZSAyXQoJfQoJY2xvc2UgJGZyX2ZkCgoJc2V0IHRvX3Nob3cge30KCXNldCBmcl9mZCBbb3BlbiAifCBnaXQgcmV2LWxpc3QgLS1hbGwgLS1ub3QgSEVBRCJdCgl3aGlsZSB7W2dldHMgJGZyX2ZkIGxpbmVdID4gMH0gewoJCWlmIHtbY2F0Y2gge3NldCByZWYgJHNoYTEoJGxpbmUpfV19IGNvbnRpbnVlCgkJcmVnc3ViIF5yZWZzLyhoZWFkc3xyZW1vdGVzfHRhZ3MpLyAkcmVmIHt9IHJlZgoJCWxhcHBlbmQgdG9fc2hvdyAkcmVmCgl9CgljbG9zZSAkZnJfZmQKCglmb3JlYWNoIHJlZiBbbHNvcnQgLXVuaXF1ZSAkdG9fc2hvd10gewoJCSR3LnNvdXJjZS5sIGluc2VydCBlbmQgJHJlZgoJfQoKCWJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3IgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gInVubG9ja19pbmRleDtkZXN0cm95ICR3IgoJYmluZCAkdyA8RGVzdHJveT4gdW5sb2NrX2luZGV4Cgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogTWVyZ2UiCgl0a3dhaXQgd2luZG93ICR3Cn0KCnByb2MgZG9fcmVzZXRfaGFyZCB7fSB7CglnbG9iYWwgSEVBRCBjb21taXRfdHlwZSBmaWxlX3N0YXRlcwoKCWlmIHtbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJaW5mb19wb3B1cCB7Q2Fubm90IGFib3J0IHdoaWxlIGFtZW5kaW5nLgoKWW91IG11c3QgZmluaXNoIGFtZW5kaW5nIHRoaXMgY29tbWl0Lgp9CgkJcmV0dXJuCgl9CgoJaWYgeyFbbG9ja19pbmRleCBhYm9ydF19IHJldHVybgoKCWlmIHtbc3RyaW5nIG1hdGNoICptZXJnZSogJGNvbW1pdF90eXBlXX0gewoJCXNldCBvcCBtZXJnZQoJfSBlbHNlIHsKCQlzZXQgb3AgY29tbWl0Cgl9CgoJaWYge1thc2tfcG9wdXAgIkFib3J0ICRvcD8KCkFib3J0aW5nIHRoZSBjdXJyZW50ICRvcCB3aWxsIGNhdXNlCipBTEwqIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYmUgbG9zdC4KCkNvbnRpbnVlIHdpdGggYWJvcnRpbmcgdGhlIGN1cnJlbnQgJG9wPyJdIGVxIHt5ZXN9fSB7CgkJc2V0IGZkIFtvcGVuICJ8IGdpdCByZWFkLXRyZWUgLS1yZXNldCAtdSBIRUFEIiByXQoJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCQlmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtsaXN0IHJlc2V0X2hhcmRfd2FpdCAkZmRdCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7QWJvcnRpbmcuLi4gcGxlYXNlIHdhaXQuLi59Cgl9IGVsc2UgewoJCXVubG9ja19pbmRleAoJfQp9Cgpwcm9jIHJlc2V0X2hhcmRfd2FpdCB7ZmR9IHsKCWdsb2JhbCB1aV9jb21tCgoJcmVhZCAkZmQKCWlmIHtbZW9mICRmZF19IHsKCQljbG9zZSAkZmQKCQl1bmxvY2tfaW5kZXgKCgkJJHVpX2NvbW0gZGVsZXRlIDAuMCBlbmQKCQkkdWlfY29tbSBlZGl0IG1vZGlmaWVkIGZhbHNlCgoJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIE1FUkdFX0hFQURdfQoJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIHJyLWNhY2hlIE1FUkdFX1JSXX0KCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBTUVVBU0hfTVNHXX0KCQljYXRjaCB7ZmlsZSBkZWxldGUgW2dpdGRpciBNRVJHRV9NU0ddfQoJCWNhdGNoIHtmaWxlIGRlbGV0ZSBbZ2l0ZGlyIEdJVEdVSV9NU0ddfQoKCQlyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge0Fib3J0IGNvbXBsZXRlZC4gIFJlYWR5Ln19Cgl9Cn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgYnJvd3NlcgoKc2V0IG5leHRfYnJvd3Nlcl9pZCAwCgpwcm9jIG5ld19icm93c2VyIHtjb21taXR9IHsKCWdsb2JhbCBuZXh0X2Jyb3dzZXJfaWQgY3Vyc29yX3B0ciBNMUIKCWdsb2JhbCBicm93c2VyX2NvbW1pdCBicm93c2VyX3N0YXR1cyBicm93c2VyX3N0YWNrIGJyb3dzZXJfcGF0aCBicm93c2VyX2J1c3kKCglpZiB7W3dpbmZvIGlzbWFwcGVkIC5dfSB7CgkJc2V0IHcgLmJyb3dzZXJbaW5jciBuZXh0X2Jyb3dzZXJfaWRdCgkJc2V0IHRsICR3CgkJdG9wbGV2ZWwgJHcKCX0gZWxzZSB7CgkJc2V0IHcge30KCQlzZXQgdGwgLgoJfQoJc2V0IHdfbGlzdCAkdy5saXN0LmwKCXNldCBicm93c2VyX2NvbW1pdCgkd19saXN0KSAkY29tbWl0CglzZXQgYnJvd3Nlcl9zdGF0dXMoJHdfbGlzdCkge1N0YXJ0aW5nLi4ufQoJc2V0IGJyb3dzZXJfc3RhY2soJHdfbGlzdCkge30KCXNldCBicm93c2VyX3BhdGgoJHdfbGlzdCkgJGJyb3dzZXJfY29tbWl0KCR3X2xpc3QpOgoJc2V0IGJyb3dzZXJfYnVzeSgkd19saXN0KSAxCgoJbGFiZWwgJHcucGF0aCAtdGV4dHZhcmlhYmxlIGJyb3dzZXJfcGF0aCgkd19saXN0KSBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktYm9yZGVyd2lkdGggMSBcCgkJLXJlbGllZiBzdW5rZW4gXAoJCS1mb250IGZvbnRfdWlib2xkCglwYWNrICR3LnBhdGggLWFuY2hvciB3IC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcubGlzdAoJdGV4dCAkd19saXN0IC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCQktY3Vyc29yICRjdXJzb3JfcHRyIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS13cmFwIG5vbmUgXAoJCS1oZWlnaHQgMjAgXAoJCS13aWR0aCA3MCBcCgkJLXhzY3JvbGxjb21tYW5kIFtsaXN0ICR3Lmxpc3Quc2J4IHNldF0gXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5saXN0LnNieSBzZXRdIFwKCQktZm9udCBmb250X3VpCgkkd19saXN0IHRhZyBjb25mIGluX3NlbCBcCgkJLWJhY2tncm91bmQgWyR3X2xpc3QgY2dldCAtZm9yZWdyb3VuZF0gXAoJCS1mb3JlZ3JvdW5kIFskd19saXN0IGNnZXQgLWJhY2tncm91bmRdCglzY3JvbGxiYXIgJHcubGlzdC5zYnggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR3X2xpc3QgeHZpZXddCglzY3JvbGxiYXIgJHcubGlzdC5zYnkgLW9yaWVudCB2IC1jb21tYW5kIFtsaXN0ICR3X2xpc3QgeXZpZXddCglwYWNrICR3Lmxpc3Quc2J4IC1zaWRlIGJvdHRvbSAtZmlsbCB4CglwYWNrICR3Lmxpc3Quc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHdfbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCglwYWNrICR3Lmxpc3QgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxCgoJbGFiZWwgJHcuc3RhdHVzIC10ZXh0dmFyaWFibGUgYnJvd3Nlcl9zdGF0dXMoJHdfbGlzdCkgXAoJCS1hbmNob3IgdyBcCgkJLWp1c3RpZnkgbGVmdCBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktZm9udCBmb250X3VpCglwYWNrICR3LnN0YXR1cyAtYW5jaG9yIHcgLXNpZGUgYm90dG9tIC1maWxsIHgKCgliaW5kICR3X2xpc3QgPEJ1dHRvbi0xPiAgICAgICAgImJyb3dzZXJfY2xpY2sgMCAkd19saXN0IEAleCwleTticmVhayIKCWJpbmQgJHdfbGlzdCA8RG91YmxlLUJ1dHRvbi0xPiAiYnJvd3Nlcl9jbGljayAxICR3X2xpc3QgQCV4LCV5O2JyZWFrIgoJYmluZCAkd19saXN0IDwkTTFCLVVwPiAgICAgICAgICJicm93c2VyX3BhcmVudCAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDwkTTFCLUxlZnQ+ICAgICAgICJicm93c2VyX3BhcmVudCAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxVcD4gICAgICAgICAgICAgICJicm93c2VyX21vdmUgLTEgJHdfbGlzdDticmVhayIKCWJpbmQgJHdfbGlzdCA8RG93bj4gICAgICAgICAgICAiYnJvd3Nlcl9tb3ZlIDEgJHdfbGlzdDticmVhayIKCWJpbmQgJHdfbGlzdCA8JE0xQi1SaWdodD4gICAgICAiYnJvd3Nlcl9lbnRlciAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxSZXR1cm4+ICAgICAgICAgICJicm93c2VyX2VudGVyICR3X2xpc3Q7YnJlYWsiCgliaW5kICR3X2xpc3QgPFByaW9yPiAgICAgICAgICAgImJyb3dzZXJfcGFnZSAtMSAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxOZXh0PiAgICAgICAgICAgICJicm93c2VyX3BhZ2UgMSAkd19saXN0O2JyZWFrIgoJYmluZCAkd19saXN0IDxMZWZ0PiAgICAgICAgICAgIGJyZWFrCgliaW5kICR3X2xpc3QgPFJpZ2h0PiAgICAgICAgICAgYnJlYWsKCgliaW5kICR0bCA8VmlzaWJpbGl0eT4gImZvY3VzICR3IgoJYmluZCAkdGwgPERlc3Ryb3k+ICIKCQlhcnJheSB1bnNldCBicm93c2VyX2J1ZmZlciAkd19saXN0CgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9maWxlcyAkd19saXN0CgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9zdGF0dXMgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfc3RhY2sgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfcGF0aCAkd19saXN0CgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9jb21taXQgJHdfbGlzdAoJCWFycmF5IHVuc2V0IGJyb3dzZXJfYnVzeSAkd19saXN0CgkiCgl3bSB0aXRsZSAkdGwgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IEZpbGUgQnJvd3NlciIKCWxzX3RyZWUgJHdfbGlzdCAkYnJvd3Nlcl9jb21taXQoJHdfbGlzdCkge30KfQoKcHJvYyBicm93c2VyX21vdmUge2RpciB3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggaW5fc2VsLmZpcnN0XSAuXSAwXQoJaW5jciBsbm8gJGRpcgoJaWYge1tsaW5kZXggJGJyb3dzZXJfZmlsZXMoJHcpIFtleHByIHskbG5vIC0gMX1dXSBuZSB7fX0gewoJCSR3IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJCSR3IHNlZSAkbG5vLjAKCX0KfQoKcHJvYyBicm93c2VyX3BhZ2Uge2RpciB3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJJHcgeXZpZXcgc2Nyb2xsICRkaXIgcGFnZXMKCXNldCBsbm8gW2V4cHIge2ludCgKCQkgIFtsaW5kZXggWyR3IHl2aWV3XSAwXQoJCSogW2xsZW5ndGggJGJyb3dzZXJfZmlsZXMoJHcpXQoJCSsgMSl9XQoJaWYge1tsaW5kZXggJGJyb3dzZXJfZmlsZXMoJHcpIFtleHByIHskbG5vIC0gMX1dXSBuZSB7fX0gewoJCSR3IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCQkkdyB0YWcgYWRkIGluX3NlbCAkbG5vLjAgW2V4cHIgeyRsbm8gKyAxfV0uMAoJCSR3IHNlZSAkbG5vLjAKCX0KfQoKcHJvYyBicm93c2VyX3BhcmVudCB7d30gewoJZ2xvYmFsIGJyb3dzZXJfZmlsZXMgYnJvd3Nlcl9zdGF0dXMgYnJvd3Nlcl9wYXRoCglnbG9iYWwgYnJvd3Nlcl9zdGFjayBicm93c2VyX2J1c3kKCglpZiB7JGJyb3dzZXJfYnVzeSgkdyl9IHJldHVybgoJc2V0IGluZm8gW2xpbmRleCAkYnJvd3Nlcl9maWxlcygkdykgMF0KCWlmIHtbbGluZGV4ICRpbmZvIDBdIGVxIHtwYXJlbnR9fSB7CgkJc2V0IHBhcmVudCBbbGluZGV4ICRicm93c2VyX3N0YWNrKCR3KSBlbmQtMV0KCQlzZXQgYnJvd3Nlcl9zdGFjaygkdykgW2xyYW5nZSAkYnJvd3Nlcl9zdGFjaygkdykgMCBlbmQtMl0KCQlpZiB7JGJyb3dzZXJfc3RhY2soJHcpIGVxIHt9fSB7CgkJCXJlZ3N1YiB7Oi4qJH0gJGJyb3dzZXJfcGF0aCgkdykgezp9IGJyb3dzZXJfcGF0aCgkdykKCQl9IGVsc2UgewoJCQlyZWdzdWIgey9bXi9dKyR9ICRicm93c2VyX3BhdGgoJHcpIHt9IGJyb3dzZXJfcGF0aCgkdykKCQl9CgkJc2V0IGJyb3dzZXJfc3RhdHVzKCR3KSAiTG9hZGluZyAkYnJvd3Nlcl9wYXRoKCR3KS4uLiIKCQlsc190cmVlICR3IFtsaW5kZXggJHBhcmVudCAwXSBbbGluZGV4ICRwYXJlbnQgMV0KCX0KfQoKcHJvYyBicm93c2VyX2VudGVyIHt3fSB7CglnbG9iYWwgYnJvd3Nlcl9maWxlcyBicm93c2VyX3N0YXR1cyBicm93c2VyX3BhdGgKCWdsb2JhbCBicm93c2VyX2NvbW1pdCBicm93c2VyX3N0YWNrIGJyb3dzZXJfYnVzeQoKCWlmIHskYnJvd3Nlcl9idXN5KCR3KX0gcmV0dXJuCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBpbl9zZWwuZmlyc3RdIC5dIDBdCglzZXQgaW5mbyBbbGluZGV4ICRicm93c2VyX2ZpbGVzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KCWlmIHskaW5mbyBuZSB7fX0gewoJCXN3aXRjaCAtLSBbbGluZGV4ICRpbmZvIDBdIHsKCQlwYXJlbnQgewoJCQlicm93c2VyX3BhcmVudCAkdwoJCX0KCQl0cmVlIHsKCQkJc2V0IG5hbWUgW2xpbmRleCAkaW5mbyAyXQoJCQlzZXQgZXNjbiBbZXNjYXBlX3BhdGggJG5hbWVdCgkJCXNldCBicm93c2VyX3N0YXR1cygkdykgIkxvYWRpbmcgJGVzY24uLi4iCgkJCWFwcGVuZCBicm93c2VyX3BhdGgoJHcpICRlc2NuCgkJCWxzX3RyZWUgJHcgW2xpbmRleCAkaW5mbyAxXSAkbmFtZQoJCX0KCQlibG9iIHsKCQkJc2V0IG5hbWUgW2xpbmRleCAkaW5mbyAyXQoJCQlzZXQgcCB7fQoJCQlmb3JlYWNoIG4gJGJyb3dzZXJfc3RhY2soJHcpIHsKCQkJCWFwcGVuZCBwIFtsaW5kZXggJG4gMV0KCQkJfQoJCQlhcHBlbmQgcCAkbmFtZQoJCQlzaG93X2JsYW1lICRicm93c2VyX2NvbW1pdCgkdykgJHAKCQl9CgkJfQoJfQp9Cgpwcm9jIGJyb3dzZXJfY2xpY2sge3dhc19kb3VibGVfY2xpY2sgdyBwb3N9IHsKCWdsb2JhbCBicm93c2VyX2ZpbGVzIGJyb3dzZXJfYnVzeQoKCWlmIHskYnJvd3Nlcl9idXN5KCR3KX0gcmV0dXJuCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCAkcG9zXSAuXSAwXQoJZm9jdXMgJHcKCglpZiB7W2xpbmRleCAkYnJvd3Nlcl9maWxlcygkdykgW2V4cHIgeyRsbm8gLSAxfV1dIG5lIHt9fSB7CgkJJHcgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJCSR3IHRhZyBhZGQgaW5fc2VsICRsbm8uMCBbZXhwciB7JGxubyArIDF9XS4wCgkJaWYgeyR3YXNfZG91YmxlX2NsaWNrfSB7CgkJCWJyb3dzZXJfZW50ZXIgJHcKCQl9Cgl9Cn0KCnByb2MgbHNfdHJlZSB7dyB0cmVlX2lkIG5hbWV9IHsKCWdsb2JhbCBicm93c2VyX2J1ZmZlciBicm93c2VyX2ZpbGVzIGJyb3dzZXJfc3RhY2sgYnJvd3Nlcl9idXN5CgoJc2V0IGJyb3dzZXJfYnVmZmVyKCR3KSB7fQoJc2V0IGJyb3dzZXJfZmlsZXMoJHcpIHt9CglzZXQgYnJvd3Nlcl9idXN5KCR3KSAxCgoJJHcgY29uZiAtc3RhdGUgbm9ybWFsCgkkdyB0YWcgcmVtb3ZlIGluX3NlbCAwLjAgZW5kCgkkdyBkZWxldGUgMC4wIGVuZAoJaWYgeyRicm93c2VyX3N0YWNrKCR3KSBuZSB7fX0gewoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgXAoJCQktYWxpZ24gY2VudGVyIC1wYWR4IDUgLXBhZHkgMSBcCgkJCS1uYW1lIGljb24wIFwKCQkJLWltYWdlIGZpbGVfdXBsZXZlbAoJCSR3IGluc2VydCBlbmQge1tVcCBUbyBQYXJlbnRdfQoJCWxhcHBlbmQgYnJvd3Nlcl9maWxlcygkdykgcGFyZW50Cgl9CglsYXBwZW5kIGJyb3dzZXJfc3RhY2soJHcpIFtsaXN0ICR0cmVlX2lkICRuYW1lXQoJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglzZXQgY21kIFtsaXN0IGdpdCBscy10cmVlIC16ICR0cmVlX2lkXQoJc2V0IGZkIFtvcGVuICJ8ICRjbWQiIHJdCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gYmluYXJ5IC1lbmNvZGluZyBiaW5hcnkKCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgcmVhZF9sc190cmVlICRmZCAkd10KfQoKcHJvYyByZWFkX2xzX3RyZWUge2ZkIHd9IHsKCWdsb2JhbCBicm93c2VyX2J1ZmZlciBicm93c2VyX2ZpbGVzIGJyb3dzZXJfc3RhdHVzIGJyb3dzZXJfYnVzeQoKCWlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsKCQljYXRjaCB7Y2xvc2UgJGZkfQoJCXJldHVybgoJfQoKCWFwcGVuZCBicm93c2VyX2J1ZmZlcigkdykgW3JlYWQgJGZkXQoJc2V0IHBjayBbc3BsaXQgJGJyb3dzZXJfYnVmZmVyKCR3KSAiXDAiXQoJc2V0IGJyb3dzZXJfYnVmZmVyKCR3KSBbbGluZGV4ICRwY2sgZW5kXQoKCXNldCBuIFtsbGVuZ3RoICRicm93c2VyX2ZpbGVzKCR3KV0KCSR3IGNvbmYgLXN0YXRlIG5vcm1hbAoJZm9yZWFjaCBwIFtscmFuZ2UgJHBjayAwIGVuZC0xXSB7CgkJc2V0IGluZm8gW3NwbGl0ICRwICJcdCJdCgkJc2V0IHBhdGggW2xpbmRleCAkaW5mbyAxXQoJCXNldCBpbmZvIFtzcGxpdCBbbGluZGV4ICRpbmZvIDBdIHsgfV0KCQlzZXQgdHlwZSBbbGluZGV4ICRpbmZvIDFdCgkJc2V0IG9iamVjdCBbbGluZGV4ICRpbmZvIDJdCgoJCXN3aXRjaCAtLSAkdHlwZSB7CgkJYmxvYiB7CgkJCXNldCBpbWFnZSBmaWxlX21vZAoJCX0KCQl0cmVlIHsKCQkJc2V0IGltYWdlIGZpbGVfZGlyCgkJCWFwcGVuZCBwYXRoIC8KCQl9CgkJZGVmYXVsdCB7CgkJCXNldCBpbWFnZSBmaWxlX3F1ZXN0aW9uCgkJfQoJCX0KCgkJaWYgeyRuID4gMH0geyR3IGluc2VydCBlbmQgIlxuIn0KCQkkdyBpbWFnZSBjcmVhdGUgZW5kIFwKCQkJLWFsaWduIGNlbnRlciAtcGFkeCA1IC1wYWR5IDEgXAoJCQktbmFtZSBpY29uW2luY3Igbl0gXAoJCQktaW1hZ2UgJGltYWdlCgkJJHcgaW5zZXJ0IGVuZCBbZXNjYXBlX3BhdGggJHBhdGhdCgkJbGFwcGVuZCBicm93c2VyX2ZpbGVzKCR3KSBbbGlzdCAkdHlwZSAkb2JqZWN0ICRwYXRoXQoJfQoJJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKCglpZiB7W2VvZiAkZmRdfSB7CgkJY2xvc2UgJGZkCgkJc2V0IGJyb3dzZXJfc3RhdHVzKCR3KSBSZWFkeS4KCQlzZXQgYnJvd3Nlcl9idXN5KCR3KSAwCgkJYXJyYXkgdW5zZXQgYnJvd3Nlcl9idWZmZXIgJHcKCQlpZiB7JG4gPiAwfSB7CgkJCSR3IHRhZyBhZGQgaW5fc2VsIDEuMCAyLjAKCQkJZm9jdXMgLWZvcmNlICR3CgkJfQoJfQp9Cgpwcm9jIHNob3dfYmxhbWUge2NvbW1pdCBwYXRofSB7CglnbG9iYWwgbmV4dF9icm93c2VyX2lkIGJsYW1lX3N0YXR1cyBibGFtZV9kYXRhCgoJaWYge1t3aW5mbyBpc21hcHBlZCAuXX0gewoJCXNldCB3IC5icm93c2VyW2luY3IgbmV4dF9icm93c2VyX2lkXQoJCXNldCB0bCAkdwoJCXRvcGxldmVsICR3Cgl9IGVsc2UgewoJCXNldCB3IHt9CgkJc2V0IHRsIC4KCX0KCXNldCBibGFtZV9zdGF0dXMoJHcpIHtMb2FkaW5nIGN1cnJlbnQgZmlsZSBjb250ZW50Li4ufQoKCWxhYmVsICR3LnBhdGggLXRleHQgIiRjb21taXQ6JHBhdGgiIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcucGF0aCAtc2lkZSB0b3AgLWZpbGwgeAoKCWZyYW1lICR3Lm91dAoJdGV4dCAkdy5vdXQubG9hZGVkX3QgXAoJCS1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS13cmFwIG5vbmUgXAoJCS1oZWlnaHQgNDAgXAoJCS13aWR0aCAxIFwKCQktZm9udCBmb250X2RpZmYKCSR3Lm91dC5sb2FkZWRfdCB0YWcgY29uZiBhbm5vdGF0ZWQgLWJhY2tncm91bmQgZ3JleQoKCXRleHQgJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDAgXAoJCS1zdGF0ZSBkaXNhYmxlZCBcCgkJLXdyYXAgbm9uZSBcCgkJLWhlaWdodCA0MCBcCgkJLXdpZHRoIDUgXAoJCS1mb250IGZvbnRfZGlmZgoJJHcub3V0LmxpbmVudW1iZXJfdCB0YWcgY29uZiBsaW5lbnVtYmVyIC1qdXN0aWZ5IHJpZ2h0CgoJdGV4dCAkdy5vdXQuZmlsZV90IFwKCQktYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQktd3JhcCBub25lIFwKCQktaGVpZ2h0IDQwIFwKCQktd2lkdGggODAgXAoJCS14c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5vdXQuc2J4IHNldF0gXAoJCS1mb250IGZvbnRfZGlmZgoKCXNjcm9sbGJhciAkdy5vdXQuc2J4IC1vcmllbnQgaCAtY29tbWFuZCBbbGlzdCAkdy5vdXQuZmlsZV90IHh2aWV3XQoJc2Nyb2xsYmFyICR3Lm91dC5zYnkgLW9yaWVudCB2IFwKCQktY29tbWFuZCBbbGlzdCBzY3JvbGxiYXIybWFueSBbbGlzdCBcCgkJJHcub3V0LmxvYWRlZF90IFwKCQkkdy5vdXQubGluZW51bWJlcl90IFwKCQkkdy5vdXQuZmlsZV90IFwKCQldIHl2aWV3XQoJZ3JpZCBcCgkJJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJJHcub3V0LmxvYWRlZF90IFwKCQkkdy5vdXQuZmlsZV90IFwKCQkkdy5vdXQuc2J5IFwKCQktc3RpY2t5IG5zZXcKCWdyaWQgY29uZiAkdy5vdXQuc2J4IC1jb2x1bW4gMiAtc3RpY2t5IHdlCglncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5vdXQgMiAtd2VpZ2h0IDEKCWdyaWQgcm93Y29uZmlndXJlICR3Lm91dCAwIC13ZWlnaHQgMQoJcGFjayAkdy5vdXQgLWZpbGwgYm90aCAtZXhwYW5kIDEKCglsYWJlbCAkdy5zdGF0dXMgLXRleHR2YXJpYWJsZSBibGFtZV9zdGF0dXMoJHcpIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLWZvbnQgZm9udF91aQoJcGFjayAkdy5zdGF0dXMgLXNpZGUgYm90dG9tIC1maWxsIHgKCglmcmFtZSAkdy5jbQoJdGV4dCAkdy5jbS50IFwKCQktYmFja2dyb3VuZCB3aGl0ZSAtYm9yZGVyd2lkdGggMCBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQktd3JhcCBub25lIFwKCQktaGVpZ2h0IDEwIFwKCQktd2lkdGggODAgXAoJCS14c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5jbS5zYnggc2V0XSBcCgkJLXlzY3JvbGxjb21tYW5kIFtsaXN0ICR3LmNtLnNieSBzZXRdIFwKCQktZm9udCBmb250X2RpZmYKCXNjcm9sbGJhciAkdy5jbS5zYnggLW9yaWVudCBoIC1jb21tYW5kIFtsaXN0ICR3LmNtLnQgeHZpZXddCglzY3JvbGxiYXIgJHcuY20uc2J5IC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkdy5jbS50IHl2aWV3XQoJcGFjayAkdy5jbS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5jbS5zYnggLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcuY20udCAtZXhwYW5kIDEgLWZpbGwgYm90aAoJcGFjayAkdy5jbSAtc2lkZSBib3R0b20gLWZpbGwgeAoKCW1lbnUgJHcuY3R4bSAtdGVhcm9mZiAwCgkkdy5jdHhtIGFkZCBjb21tYW5kIC1sYWJlbCAiQ29weSBDb21taXQiIFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCAiYmxhbWVfY29weWNvbW1pdCAkdyBcJGN1cnNvclcgQFwkY3Vyc29yWCxcJGN1cnNvclkiCgoJZm9yZWFjaCBpIFtsaXN0IFwKCQkkdy5vdXQubG9hZGVkX3QgXAoJCSR3Lm91dC5saW5lbnVtYmVyX3QgXAoJCSR3Lm91dC5maWxlX3RdIHsKCQkkaSB0YWcgY29uZiBpbl9zZWwgXAoJCQktYmFja2dyb3VuZCBbJGkgY2dldCAtZm9yZWdyb3VuZF0gXAoJCQktZm9yZWdyb3VuZCBbJGkgY2dldCAtYmFja2dyb3VuZF0KCQkkaSBjb25mIC15c2Nyb2xsY29tbWFuZCBcCgkJCVtsaXN0IG1hbnkyc2Nyb2xsYmFyIFtsaXN0IFwKCQkJJHcub3V0LmxvYWRlZF90IFwKCQkJJHcub3V0LmxpbmVudW1iZXJfdCBcCgkJCSR3Lm91dC5maWxlX3QgXAoJCQldIHl2aWV3ICR3Lm91dC5zYnldCgkJYmluZCAkaSA8QnV0dG9uLTE+ICIKCQkJYmxhbWVfY2xpY2sgeyR3fSBcXAoJCQkJJHcuY20udCBcXAoJCQkJJHcub3V0LmxpbmVudW1iZXJfdCBcXAoJCQkJJHcub3V0LmZpbGVfdCBcXAoJCQkJJGkgQCV4LCV5CgkJCWZvY3VzICRpCgkJIgoJCWJpbmRfYnV0dG9uMyAkaSAiCgkJCXNldCBjdXJzb3JYICV4CgkJCXNldCBjdXJzb3JZICV5CgkJCXNldCBjdXJzb3JXICVXCgkJCXRrX3BvcHVwICR3LmN0eG0gJVggJVkKCQkiCgl9CgoJYmluZCAkdy5jbS50IDxCdXR0b24tMT4gImZvY3VzICR3LmNtLnQiCgliaW5kICR0bCA8VmlzaWJpbGl0eT4gImZvY3VzICR0bCIKCWJpbmQgJHRsIDxEZXN0cm95PiAiCgkJYXJyYXkgdW5zZXQgYmxhbWVfc3RhdHVzIHskd30KCQlhcnJheSB1bnNldCBibGFtZV9kYXRhICR3LCoKCSIKCXdtIHRpdGxlICR0bCAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogRmlsZSBWaWV3ZXIiCgoJc2V0IGJsYW1lX2RhdGEoJHcsY29tbWl0X2NvdW50KSAwCglzZXQgYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkge30KCXNldCBibGFtZV9kYXRhKCR3LHRvdGFsX2xpbmVzKSAwCglzZXQgYmxhbWVfZGF0YSgkdyxibGFtZV9saW5lcykgMAoJc2V0IGJsYW1lX2RhdGEoJHcsaGlnaGxpZ2h0X2NvbW1pdCkge30KCXNldCBibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSAtMQoKCXNldCBjbWQgW2xpc3QgZ2l0IGNhdC1maWxlIGJsb2IgIiRjb21taXQ6JHBhdGgiXQoJc2V0IGZkIFtvcGVuICJ8ICRjbWQiIHJdCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYgLWVuY29kaW5nIGJpbmFyeQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZWFkX2JsYW1lX2NhdGZpbGUgXAoJCSRmZCAkdyAkY29tbWl0ICRwYXRoIFwKCQkkdy5jbS50ICR3Lm91dC5sb2FkZWRfdCAkdy5vdXQubGluZW51bWJlcl90ICR3Lm91dC5maWxlX3RdCn0KCnByb2MgcmVhZF9ibGFtZV9jYXRmaWxlIHtmZCB3IGNvbW1pdCBwYXRoIHdfY21pdCB3X2xvYWQgd19saW5lIHdfZmlsZX0gewoJZ2xvYmFsIGJsYW1lX3N0YXR1cyBibGFtZV9kYXRhCgoJaWYgeyFbd2luZm8gZXhpc3RzICR3X2ZpbGVdfSB7CgkJY2F0Y2gge2Nsb3NlICRmZH0KCQlyZXR1cm4KCX0KCglzZXQgbiAkYmxhbWVfZGF0YSgkdyx0b3RhbF9saW5lcykKCSR3X2xvYWQgY29uZiAtc3RhdGUgbm9ybWFsCgkkd19saW5lIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHdfZmlsZSBjb25mIC1zdGF0ZSBub3JtYWwKCXdoaWxlIHtbZ2V0cyAkZmQgbGluZV0gPj0gMH0gewoJCXJlZ3N1YiAiXHJcJCIgJGxpbmUge30gbGluZQoJCWluY3IgbgoJCSR3X2xvYWQgaW5zZXJ0IGVuZCAiXG4iCgkJJHdfbGluZSBpbnNlcnQgZW5kICIkblxuIiBsaW5lbnVtYmVyCgkJJHdfZmlsZSBpbnNlcnQgZW5kICIkbGluZVxuIgoJfQoJJHdfbG9hZCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHdfbGluZSBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHdfZmlsZSBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJc2V0IGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpICRuCgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCWJsYW1lX2luY3JlbWVudGFsX3N0YXR1cyAkdwoJCXNldCBjbWQgW2xpc3QgZ2l0IGJsYW1lIC1NIC1DIC0taW5jcmVtZW50YWxdCgkJbGFwcGVuZCBjbWQgJGNvbW1pdCAtLSAkcGF0aAoJCXNldCBmZCBbb3BlbiAifCAkY21kIiByXQoJCWZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZiAtZW5jb2RpbmcgYmluYXJ5CgkJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCByZWFkX2JsYW1lX2luY3JlbWVudGFsICRmZCAkdyBcCgkJCSR3X2xvYWQgJHdfY21pdCAkd19saW5lICR3X2ZpbGVdCgl9Cn0KCnByb2MgcmVhZF9ibGFtZV9pbmNyZW1lbnRhbCB7ZmQgdyB3X2xvYWQgd19jbWl0IHdfbGluZSB3X2ZpbGV9IHsKCWdsb2JhbCBibGFtZV9zdGF0dXMgYmxhbWVfZGF0YQoKCWlmIHshW3dpbmZvIGV4aXN0cyAkd19maWxlXX0gewoJCWNhdGNoIHtjbG9zZSAkZmR9CgkJcmV0dXJuCgl9CgoJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CgkJaWYge1tyZWdleHAge14oW2EtejAtOV17NDB9KSAoXGQrKSAoXGQrKSAoXGQrKSR9ICRsaW5lIGxpbmUgXAoJCQljbWl0IG9yaWdpbmFsX2xpbmUgZmluYWxfbGluZSBsaW5lX2NvdW50XX0gewoJCQlzZXQgYmxhbWVfZGF0YSgkdyxjb21taXQpICRjbWl0CgkJCXNldCBibGFtZV9kYXRhKCR3LG9yaWdpbmFsX2xpbmUpICRvcmlnaW5hbF9saW5lCgkJCXNldCBibGFtZV9kYXRhKCR3LGZpbmFsX2xpbmUpICRmaW5hbF9saW5lCgkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmVfY291bnQpICRsaW5lX2NvdW50CgoJCQlpZiB7W2NhdGNoIHtzZXQgZyAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcil9XX0gewoJCQkJJHdfbGluZSB0YWcgY29uZiBnJGNtaXQKCQkJCSR3X2ZpbGUgdGFnIGNvbmYgZyRjbWl0CgkJCQkkd19saW5lIHRhZyByYWlzZSBpbl9zZWwKCQkJCSR3X2ZpbGUgdGFnIHJhaXNlIGluX3NlbAoJCQkJJHdfZmlsZSB0YWcgcmFpc2Ugc2VsCgkJCQlzZXQgYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcikgJGJsYW1lX2RhdGEoJHcsY29tbWl0X2NvdW50KQoJCQkJaW5jciBibGFtZV9kYXRhKCR3LGNvbW1pdF9jb3VudCkKCQkJCWxhcHBlbmQgYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkgJGNtaXQKCQkJfQoJCX0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoIHtmaWxlbmFtZSAqfSAkbGluZV19IHsKCQkJc2V0IGZpbGUgW3N0cmluZyByYW5nZSAkbGluZSA5IGVuZF0KCQkJc2V0IG4gJGJsYW1lX2RhdGEoJHcsbGluZV9jb3VudCkKCQkJc2V0IGxubyAkYmxhbWVfZGF0YSgkdyxmaW5hbF9saW5lKQoJCQlzZXQgY21pdCAkYmxhbWVfZGF0YSgkdyxjb21taXQpCgoJCQl3aGlsZSB7JG4gPiAwfSB7CgkJCQlpZiB7W2NhdGNoIHtzZXQgZyBnJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sY29tbWl0KX1dfSB7CgkJCQkJJHdfbG9hZCB0YWcgYWRkIGFubm90YXRlZCAkbG5vLjAgIiRsbm8uMCBsaW5lZW5kICsgMWMiCgkJCQl9IGVsc2UgewoJCQkJCSR3X2xpbmUgdGFnIHJlbW92ZSBnJGcgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoJCQkJCSR3X2ZpbGUgdGFnIHJlbW92ZSBnJGcgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoJCQkJfQoKCQkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGNvbW1pdCkgJGNtaXQKCQkJCXNldCBibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGZpbGUpICRmaWxlCgkJCQkkd19saW5lIHRhZyBhZGQgZyRjbWl0ICRsbm8uMCAiJGxuby4wIGxpbmVlbmQgKyAxYyIKCQkJCSR3X2ZpbGUgdGFnIGFkZCBnJGNtaXQgJGxuby4wICIkbG5vLjAgbGluZWVuZCArIDFjIgoKCQkJCWlmIHskYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfbGluZSkgPT0gLTF9IHsKCQkJCQlpZiB7W2xpbmRleCBbJHdfZmlsZSB5dmlld10gMF0gPT0gMH0gewoJCQkJCQkkd19maWxlIHNlZSAkbG5vLjAKCQkJCQkJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCgkJCQkJfQoJCQkJfSBlbHNlaWYgeyRibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSA9PSAkbG5vfSB7CgkJCQkJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCgkJCQl9CgoJCQkJaW5jciBuIC0xCgkJCQlpbmNyIGxubwoJCQkJaW5jciBibGFtZV9kYXRhKCR3LGJsYW1lX2xpbmVzKQoJCQl9CgoJCQlzZXQgaGMgJGJsYW1lX2RhdGEoJHcsaGlnaGxpZ2h0X2NvbW1pdCkKCQkJaWYgeyRoYyBuZSB7fQoJCQkJJiYgW2V4cHIgeyRibGFtZV9kYXRhKCR3LCRoYyxvcmRlcikgKyAxfV0KCQkJCQk9PSAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcil9IHsKCQkJCWJsYW1lX3Nob3djb21taXQgJHcgJHdfY21pdCAkd19saW5lICR3X2ZpbGUgXAoJCQkJCSRibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKQoJCQl9CgkJfSBlbHNlaWYge1tyZWdleHAge14oW2Etei1dKykgKC4qKSR9ICRsaW5lIGxpbmUgaGVhZGVyIGRhdGFdfSB7CgkJCXNldCBibGFtZV9kYXRhKCR3LCRibGFtZV9kYXRhKCR3LGNvbW1pdCksJGhlYWRlcikgJGRhdGEKCQl9Cgl9CgoJaWYge1tlb2YgJGZkXX0gewoJCWNsb3NlICRmZAoJCXNldCBibGFtZV9zdGF0dXMoJHcpIHtBbm5vdGF0aW9uIGNvbXBsZXRlLn0KCX0gZWxzZSB7CgkJYmxhbWVfaW5jcmVtZW50YWxfc3RhdHVzICR3Cgl9Cn0KCnByb2MgYmxhbWVfaW5jcmVtZW50YWxfc3RhdHVzIHt3fSB7CglnbG9iYWwgYmxhbWVfc3RhdHVzIGJsYW1lX2RhdGEKCglzZXQgYmxhbWVfc3RhdHVzKCR3KSBbZm9ybWF0IFwKCQkiTG9hZGluZyBhbm5vdGF0aW9ucy4uLiAlaSBvZiAlaSBsaW5lcyBhbm5vdGF0ZWQgKCUyaSUlKSIgXAoJCSRibGFtZV9kYXRhKCR3LGJsYW1lX2xpbmVzKSBcCgkJJGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpIFwKCQlbZXhwciB7MTAwICogJGJsYW1lX2RhdGEoJHcsYmxhbWVfbGluZXMpCgkJCS8gJGJsYW1lX2RhdGEoJHcsdG90YWxfbGluZXMpfV1dCn0KCnByb2MgYmxhbWVfY2xpY2sge3cgd19jbWl0IHdfbGluZSB3X2ZpbGUgY3VyX3cgcG9zfSB7CglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskY3VyX3cgaW5kZXggJHBvc10gLl0gMF0KCWlmIHskbG5vIGVxIHt9fSByZXR1cm4KCgkkd19saW5lIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCSR3X2ZpbGUgdGFnIHJlbW92ZSBpbl9zZWwgMC4wIGVuZAoJJHdfbGluZSB0YWcgYWRkIGluX3NlbCAkbG5vLjAgIiRsbm8uMCArIDEgbGluZSIKCSR3X2ZpbGUgdGFnIGFkZCBpbl9zZWwgJGxuby4wICIkbG5vLjAgKyAxIGxpbmUiCgoJYmxhbWVfc2hvd2NvbW1pdCAkdyAkd19jbWl0ICR3X2xpbmUgJHdfZmlsZSAkbG5vCn0KCnNldCBibGFtZV9jb2xvcnMgewoJI2ZmNDA0MAoJI2ZmNDBmZgoJIzQwNDBmZgp9Cgpwcm9jIGJsYW1lX3Nob3djb21taXQge3cgd19jbWl0IHdfbGluZSB3X2ZpbGUgbG5vfSB7CglnbG9iYWwgYmxhbWVfY29sb3JzIGJsYW1lX2RhdGEgcmVwb19jb25maWcKCglzZXQgY21pdCAkYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfY29tbWl0KQoJaWYgeyRjbWl0IG5lIHt9fSB7CgkJc2V0IGlkeCAkYmxhbWVfZGF0YSgkdywkY21pdCxvcmRlcikKCQlzZXQgaSAwCgkJZm9yZWFjaCBjICRibGFtZV9jb2xvcnMgewoJCQlzZXQgaCBbbGluZGV4ICRibGFtZV9kYXRhKCR3LGNvbW1pdF9saXN0KSBbZXhwciB7JGlkeCAtIDEgKyAkaX1dXQoJCQkkd19saW5lIHRhZyBjb25mIGckaCAtYmFja2dyb3VuZCB3aGl0ZQoJCQkkd19maWxlIHRhZyBjb25mIGckaCAtYmFja2dyb3VuZCB3aGl0ZQoJCQlpbmNyIGkKCQl9Cgl9CgoJJHdfY21pdCBjb25mIC1zdGF0ZSBub3JtYWwKCSR3X2NtaXQgZGVsZXRlIDAuMCBlbmQKCWlmIHtbY2F0Y2gge3NldCBjbWl0ICRibGFtZV9kYXRhKCR3LGxpbmUkbG5vLGNvbW1pdCl9XX0gewoJCXNldCBjbWl0IHt9CgkJJHdfY21pdCBpbnNlcnQgZW5kICJMb2FkaW5nIGFubm90YXRpb24uLi4iCgl9IGVsc2UgewoJCXNldCBpZHggJGJsYW1lX2RhdGEoJHcsJGNtaXQsb3JkZXIpCgkJc2V0IGkgMAoJCWZvcmVhY2ggYyAkYmxhbWVfY29sb3JzIHsKCQkJc2V0IGggW2xpbmRleCAkYmxhbWVfZGF0YSgkdyxjb21taXRfbGlzdCkgW2V4cHIgeyRpZHggLSAxICsgJGl9XV0KCQkJJHdfbGluZSB0YWcgY29uZiBnJGggLWJhY2tncm91bmQgJGMKCQkJJHdfZmlsZSB0YWcgY29uZiBnJGggLWJhY2tncm91bmQgJGMKCQkJaW5jciBpCgkJfQoKCQlpZiB7W2NhdGNoIHtzZXQgbXNnICRibGFtZV9kYXRhKCR3LCRjbWl0LG1lc3NhZ2UpfV19IHsKCQkJc2V0IG1zZyB7fQoJCQljYXRjaCB7CgkJCQlzZXQgZmQgW29wZW4gInwgZ2l0IGNhdC1maWxlIGNvbW1pdCAkY21pdCIgcl0KCQkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyBiaW5hcnkgLXRyYW5zbGF0aW9uIGxmCgkJCQlpZiB7W2NhdGNoIHtzZXQgZW5jICRyZXBvX2NvbmZpZyhpMThuLmNvbW1pdGVuY29kaW5nKX1dfSB7CgkJCQkJc2V0IGVuYyB1dGYtOAoJCQkJfQoJCQkJd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+IDB9IHsKCQkJCQlpZiB7W3N0cmluZyBtYXRjaCB7ZW5jb2RpbmcgKn0gJGxpbmVdfSB7CgkJCQkJCXNldCBlbmMgW3N0cmluZyB0b2xvd2VyIFtzdHJpbmcgcmFuZ2UgJGxpbmUgOSBlbmRdXQoJCQkJCX0KCQkJCX0KCQkJCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkZW5jCgkJCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSBbcmVhZCAkZmRdXQoJCQkJY2xvc2UgJGZkCgkJCX0KCQkJc2V0IGJsYW1lX2RhdGEoJHcsJGNtaXQsbWVzc2FnZSkgJG1zZwoJCX0KCgkJc2V0IGF1dGhvcl9uYW1lIHt9CgkJc2V0IGF1dGhvcl9lbWFpbCB7fQoJCXNldCBhdXRob3JfdGltZSB7fQoJCWNhdGNoIHtzZXQgYXV0aG9yX25hbWUgJGJsYW1lX2RhdGEoJHcsJGNtaXQsYXV0aG9yKX0KCQljYXRjaCB7c2V0IGF1dGhvcl9lbWFpbCAkYmxhbWVfZGF0YSgkdywkY21pdCxhdXRob3ItbWFpbCl9CgkJY2F0Y2gge3NldCBhdXRob3JfdGltZSBbY2xvY2sgZm9ybWF0ICRibGFtZV9kYXRhKCR3LCRjbWl0LGF1dGhvci10aW1lKV19CgoJCXNldCBjb21taXR0ZXJfbmFtZSB7fQoJCXNldCBjb21taXR0ZXJfZW1haWwge30KCQlzZXQgY29tbWl0dGVyX3RpbWUge30KCQljYXRjaCB7c2V0IGNvbW1pdHRlcl9uYW1lICRibGFtZV9kYXRhKCR3LCRjbWl0LGNvbW1pdHRlcil9CgkJY2F0Y2gge3NldCBjb21taXR0ZXJfZW1haWwgJGJsYW1lX2RhdGEoJHcsJGNtaXQsY29tbWl0dGVyLW1haWwpfQoJCWNhdGNoIHtzZXQgY29tbWl0dGVyX3RpbWUgW2Nsb2NrIGZvcm1hdCAkYmxhbWVfZGF0YSgkdywkY21pdCxjb21taXR0ZXItdGltZSldfQoKCQkkd19jbWl0IGluc2VydCBlbmQgImNvbW1pdCAkY21pdFxuIgoJCSR3X2NtaXQgaW5zZXJ0IGVuZCAiQXV0aG9yOiAkYXV0aG9yX25hbWUgJGF1dGhvcl9lbWFpbCAkYXV0aG9yX3RpbWVcbiIKCQkkd19jbWl0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogJGNvbW1pdHRlcl9uYW1lICRjb21taXR0ZXJfZW1haWwgJGNvbW1pdHRlcl90aW1lXG4iCgkJJHdfY21pdCBpbnNlcnQgZW5kICJPcmlnaW5hbCBGaWxlOiBbZXNjYXBlX3BhdGggJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sZmlsZSldXG4iCgkJJHdfY21pdCBpbnNlcnQgZW5kICJcbiIKCQkkd19jbWl0IGluc2VydCBlbmQgJG1zZwoJfQoJJHdfY21pdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoKCXNldCBibGFtZV9kYXRhKCR3LGhpZ2hsaWdodF9saW5lKSAkbG5vCglzZXQgYmxhbWVfZGF0YSgkdyxoaWdobGlnaHRfY29tbWl0KSAkY21pdAp9Cgpwcm9jIGJsYW1lX2NvcHljb21taXQge3cgaSBwb3N9IHsKCWdsb2JhbCBibGFtZV9kYXRhCglzZXQgbG5vIFtsaW5kZXggW3NwbGl0IFskaSBpbmRleCAkcG9zXSAuXSAwXQoJaWYgeyFbY2F0Y2gge3NldCBjb21taXQgJGJsYW1lX2RhdGEoJHcsbGluZSRsbm8sY29tbWl0KX1dfSB7CgkJY2xpcGJvYXJkIGNsZWFyCgkJY2xpcGJvYXJkIGFwcGVuZCBcCgkJCS1mb3JtYXQgU1RSSU5HIFwKCQkJLXR5cGUgU1RSSU5HIFwKCQkJLS0gJGNvbW1pdAoJfQp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGljb25zCgpzZXQgZmlsZW1hc2sgewojZGVmaW5lIG1hc2tfd2lkdGggMTQKI2RlZmluZSBtYXNrX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBtYXNrX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwKICAgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZiwgMHhmZSwgMHgxZn07Cn0KCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9wbGFpbiAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibGFjayAtZGF0YSB7CiNkZWZpbmUgcGxhaW5fd2lkdGggMTQKI2RlZmluZSBwbGFpbl9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhaW5fYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDA1LCAweDAyLCAweDA5LCAweDAyLCAweDFmLCAweDAyLCAweDEwLAogICAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweDAyLCAweDEwLAogICAweDAyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfbW9kIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewojZGVmaW5lIG1vZF93aWR0aCAxNAojZGVmaW5lIG1vZF9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgbW9kX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg3YSwgMHgwNSwgMHgwMiwgMHgwOSwgMHg3YSwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX2Z1bGx0aWNrIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kICIjMDA3MDAwIiAtZGF0YSB7CiNkZWZpbmUgZmlsZV9mdWxsdGlja193aWR0aCAxNAojZGVmaW5lIGZpbGVfZnVsbHRpY2tfaGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfZnVsbHRpY2tfYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDFhLCAweDAyLCAweDBjLCAweDAyLCAweDBjLCAweDAyLCAweDE2LCAweDAyLCAweDE2LAogICAweDAyLCAweDEzLCAweDAwLCAweDEzLCAweDg2LCAweDExLCAweDhjLCAweDExLCAweGQ4LCAweDEwLCAweGYyLCAweDEwLAogICAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcGFydHRpY2sgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgIiMwMDUwNTAiIC1kYXRhIHsKI2RlZmluZSBwYXJ0dGlja193aWR0aCAxNAojZGVmaW5lIHBhcnR0aWNrX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBwYXJ0dGlja19iaXRzW10gPSB7CiAgIDB4ZmUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4N2EsIDB4MDUsIDB4MDIsIDB4MDksIDB4N2EsIDB4MWYsIDB4MDIsIDB4MTAsCiAgIDB4N2EsIDB4MTQsIDB4MDIsIDB4MTYsIDB4MDIsIDB4MTMsIDB4OGEsIDB4MTEsIDB4ZGEsIDB4MTAsIDB4NzIsIDB4MTAsCiAgIDB4MjIsIDB4MTAsIDB4MDIsIDB4MTAsIDB4ZmUsIDB4MWZ9Owp9IC1tYXNrZGF0YSAkZmlsZW1hc2sKCmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9xdWVzdGlvbiAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCBibGFjayAtZGF0YSB7CiNkZWZpbmUgZmlsZV9xdWVzdGlvbl93aWR0aCAxNAojZGVmaW5lIGZpbGVfcXVlc3Rpb25faGVpZ2h0IDE1CnN0YXRpYyB1bnNpZ25lZCBjaGFyIGZpbGVfcXVlc3Rpb25fYml0c1tdID0gewogICAweGZlLCAweDAxLCAweDAyLCAweDAyLCAweGUyLCAweDA0LCAweGYyLCAweDA5LCAweDFhLCAweDFiLCAweDBhLCAweDEzLAogICAweDgyLCAweDExLCAweGMyLCAweDEwLCAweDYyLCAweDEwLCAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweDYyLCAweDEwLAogICAweDYyLCAweDEwLCAweDAyLCAweDEwLCAweGZlLCAweDFmfTsKfSAtbWFza2RhdGEgJGZpbGVtYXNrCgppbWFnZSBjcmVhdGUgYml0bWFwIGZpbGVfcmVtb3ZlZCAtYmFja2dyb3VuZCB3aGl0ZSAtZm9yZWdyb3VuZCByZWQgLWRhdGEgewojZGVmaW5lIGZpbGVfcmVtb3ZlZF93aWR0aCAxNAojZGVmaW5lIGZpbGVfcmVtb3ZlZF9oZWlnaHQgMTUKc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlsZV9yZW1vdmVkX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwNSwgMHgwMiwgMHgwOSwgMHgwMiwgMHgxZiwgMHgwMiwgMHgxMCwKICAgMHgxYSwgMHgxNiwgMHgzMiwgMHgxMywgMHhlMiwgMHgxMSwgMHhjMiwgMHgxMCwgMHhlMiwgMHgxMSwgMHgzMiwgMHgxMywKICAgMHgxYSwgMHgxNiwgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKaW1hZ2UgY3JlYXRlIGJpdG1hcCBmaWxlX21lcmdlIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewojZGVmaW5lIGZpbGVfbWVyZ2Vfd2lkdGggMTQKI2RlZmluZSBmaWxlX21lcmdlX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX21lcmdlX2JpdHNbXSA9IHsKICAgMHhmZSwgMHgwMSwgMHgwMiwgMHgwMywgMHg2MiwgMHgwNSwgMHg2MiwgMHgwOSwgMHg2MiwgMHgxZiwgMHg2MiwgMHgxMCwKICAgMHhmYSwgMHgxMSwgMHhmMiwgMHgxMCwgMHg2MiwgMHgxMCwgMHgwMiwgMHgxMCwgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwKICAgMHhmYSwgMHgxNywgMHgwMiwgMHgxMCwgMHhmZSwgMHgxZn07Cn0gLW1hc2tkYXRhICRmaWxlbWFzawoKc2V0IGZpbGVfZGlyX2RhdGEgewojZGVmaW5lIGZpbGVfd2lkdGggMTgKI2RlZmluZSBmaWxlX2hlaWdodCAxOApzdGF0aWMgdW5zaWduZWQgY2hhciBmaWxlX2JpdHNbXSA9IHsKICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY4LCAweDAzLCAweDAwLAogIDB4MGMsIDB4MDMsIDB4MDAsIDB4MDQsIDB4ZmUsIDB4MDAsIDB4MDYsIDB4ODAsIDB4MDAsIDB4ZmYsIDB4OWYsIDB4MDAsCiAgMHgwMywgMHg5OCwgMHgwMCwgMHgwMiwgMHg5MCwgMHgwMCwgMHgwNiwgMHhiMCwgMHgwMCwgMHgwNCwgMHhhMCwgMHgwMCwKICAweDBjLCAweGUwLCAweDAwLCAweDA4LCAweGMwLCAweDAwLCAweGY4LCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Owp9CmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV9kaXIgLWJhY2tncm91bmQgd2hpdGUgLWZvcmVncm91bmQgYmx1ZSBcCgktZGF0YSAkZmlsZV9kaXJfZGF0YSAtbWFza2RhdGEgJGZpbGVfZGlyX2RhdGEKdW5zZXQgZmlsZV9kaXJfZGF0YQoKc2V0IGZpbGVfdXBsZXZlbF9kYXRhIHsKI2RlZmluZSB1cF93aWR0aCAxNQojZGVmaW5lIHVwX2hlaWdodCAxNQpzdGF0aWMgdW5zaWduZWQgY2hhciB1cF9iaXRzW10gPSB7CiAgMHg4MCwgMHgwMCwgMHhjMCwgMHgwMSwgMHhlMCwgMHgwMywgMHhmMCwgMHgwNywgMHhmOCwgMHgwZiwgMHhmYywgMHgxZiwKICAweGZlLCAweDNmLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLCAweGMwLCAweDAxLAogIDB4YzAsIDB4MDEsIDB4YzAsIDB4MDEsIDB4MDAsIDB4MDB9Owp9CmltYWdlIGNyZWF0ZSBiaXRtYXAgZmlsZV91cGxldmVsIC1iYWNrZ3JvdW5kIHdoaXRlIC1mb3JlZ3JvdW5kIHJlZCBcCgktZGF0YSAkZmlsZV91cGxldmVsX2RhdGEgLW1hc2tkYXRhICRmaWxlX3VwbGV2ZWxfZGF0YQp1bnNldCBmaWxlX3VwbGV2ZWxfZGF0YQoKc2V0IHVpX2luZGV4IC52cGFuZS5maWxlcy5pbmRleC5saXN0CnNldCB1aV93b3JrZGlyIC52cGFuZS5maWxlcy53b3JrZGlyLmxpc3QKCnNldCBhbGxfaWNvbnMoXyR1aV9pbmRleCkgICBmaWxlX3BsYWluCnNldCBhbGxfaWNvbnMoQSR1aV9pbmRleCkgICBmaWxlX2Z1bGx0aWNrCnNldCBhbGxfaWNvbnMoTSR1aV9pbmRleCkgICBmaWxlX2Z1bGx0aWNrCnNldCBhbGxfaWNvbnMoRCR1aV9pbmRleCkgICBmaWxlX3JlbW92ZWQKc2V0IGFsbF9pY29ucyhVJHVpX2luZGV4KSAgIGZpbGVfbWVyZ2UKCnNldCBhbGxfaWNvbnMoXyR1aV93b3JrZGlyKSBmaWxlX3BsYWluCnNldCBhbGxfaWNvbnMoTSR1aV93b3JrZGlyKSBmaWxlX21vZApzZXQgYWxsX2ljb25zKEQkdWlfd29ya2RpcikgZmlsZV9xdWVzdGlvbgpzZXQgYWxsX2ljb25zKFUkdWlfd29ya2RpcikgZmlsZV9tZXJnZQpzZXQgYWxsX2ljb25zKE8kdWlfd29ya2RpcikgZmlsZV9wbGFpbgoKc2V0IG1heF9zdGF0dXNfZGVzYyAwCmZvcmVhY2ggaSB7CgkJe19fICJVbm1vZGlmaWVkIn0KCgkJe19NICJNb2RpZmllZCwgbm90IHN0YWdlZCJ9CgkJe01fICJTdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe01NICJQb3J0aW9ucyBzdGFnZWQgZm9yIGNvbW1pdCJ9CgkJe01EICJTdGFnZWQgZm9yIGNvbW1pdCwgbWlzc2luZyJ9CgoJCXtfTyAiVW50cmFja2VkLCBub3Qgc3RhZ2VkIn0KCQl7QV8gIlN0YWdlZCBmb3IgY29tbWl0In0KCQl7QU0gIlBvcnRpb25zIHN0YWdlZCBmb3IgY29tbWl0In0KCQl7QUQgIlN0YWdlZCBmb3IgY29tbWl0LCBtaXNzaW5nIn0KCgkJe19EICJNaXNzaW5nIn0KCQl7RF8gIlN0YWdlZCBmb3IgcmVtb3ZhbCJ9CgkJe0RPICJTdGFnZWQgZm9yIHJlbW92YWwsIHN0aWxsIHByZXNlbnQifQoKCQl7VV8gIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJCXtVVSAiUmVxdWlyZXMgbWVyZ2UgcmVzb2x1dGlvbiJ9CgkJe1VNICJSZXF1aXJlcyBtZXJnZSByZXNvbHV0aW9uIn0KCQl7VUQgIlJlcXVpcmVzIG1lcmdlIHJlc29sdXRpb24ifQoJfSB7CglpZiB7JG1heF9zdGF0dXNfZGVzYyA8IFtzdHJpbmcgbGVuZ3RoIFtsaW5kZXggJGkgMV1dfSB7CgkJc2V0IG1heF9zdGF0dXNfZGVzYyBbc3RyaW5nIGxlbmd0aCBbbGluZGV4ICRpIDFdXQoJfQoJc2V0IGFsbF9kZXNjcyhbbGluZGV4ICRpIDBdKSBbbGluZGV4ICRpIDFdCn0KdW5zZXQgaQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyB1dGlsCgpwcm9jIGJpbmRfYnV0dG9uMyB7dyBjbWR9IHsKCWJpbmQgJHcgPEFueS1CdXR0b24tMz4gJGNtZAoJaWYge1tpc19NYWNPU1hdfSB7CgkJYmluZCAkdyA8Q29udHJvbC1CdXR0b24tMT4gJGNtZAoJfQp9Cgpwcm9jIHNjcm9sbGJhcjJtYW55IHtsaXN0IG1vZGUgYXJnc30gewoJZm9yZWFjaCB3ICRsaXN0IHtldmFsICR3ICRtb2RlICRhcmdzfQp9Cgpwcm9jIG1hbnkyc2Nyb2xsYmFyIHtsaXN0IG1vZGUgc2IgdG9wIGJvdHRvbX0gewoJJHNiIHNldCAkdG9wICRib3R0b20KCWZvcmVhY2ggdyAkbGlzdCB7JHcgJG1vZGUgbW92ZXRvICR0b3B9Cn0KCnByb2MgaW5jcl9mb250X3NpemUge2ZvbnQge2FtdCAxfX0gewoJc2V0IHN6IFtmb250IGNvbmZpZ3VyZSAkZm9udCAtc2l6ZV0KCWluY3Igc3ogJGFtdAoJZm9udCBjb25maWd1cmUgJGZvbnQgLXNpemUgJHN6Cglmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCAtc2l6ZSAkc3oKfQoKcHJvYyBob29rX2ZhaWxlZF9wb3B1cCB7aG9vayBtc2d9IHsKCXNldCB3IC5ob29rZmFpbAoJdG9wbGV2ZWwgJHcKCglmcmFtZSAkdy5tCglsYWJlbCAkdy5tLmwxIC10ZXh0ICIkaG9vayBob29rIGZhaWxlZDoiIFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1mb250IGZvbnRfdWlib2xkCgl0ZXh0ICR3Lm0udCBcCgkJLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc3Vua2VuIFwKCQktd2lkdGggODAgLWhlaWdodCAxMCBcCgkJLWZvbnQgZm9udF9kaWZmIFwKCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubS5zYnkgc2V0XQoJbGFiZWwgJHcubS5sMiBcCgkJLXRleHQge1lvdSBtdXN0IGNvcnJlY3QgdGhlIGFib3ZlIGVycm9ycyBiZWZvcmUgY29tbWl0dGluZy59IFwKCQktYW5jaG9yIHcgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1mb250IGZvbnRfdWlib2xkCglzY3JvbGxiYXIgJHcubS5zYnkgLWNvbW1hbmQgW2xpc3QgJHcubS50IHl2aWV3XQoJcGFjayAkdy5tLmwxIC1zaWRlIHRvcCAtZmlsbCB4CglwYWNrICR3Lm0ubDIgLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcubS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5tLnQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeCA1IC1wYWR5IDEwCgoJJHcubS50IGluc2VydCAxLjAgJG1zZwoJJHcubS50IGNvbmYgLXN0YXRlIGRpc2FibGVkCgoJYnV0dG9uICR3Lm9rIC10ZXh0IE9LIFwKCQktd2lkdGggMTUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kICJkZXN0cm95ICR3IgoJcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWFuY2hvciBlIC1wYWR5IDEwIC1wYWR4IDEwCgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgoJYmluZCAkdyA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHciCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogZXJyb3IiCgl0a3dhaXQgd2luZG93ICR3Cn0KCnNldCBuZXh0X2NvbnNvbGVfaWQgMAoKcHJvYyBuZXdfY29uc29sZSB7c2hvcnRfdGl0bGUgbG9uZ190aXRsZX0gewoJZ2xvYmFsIG5leHRfY29uc29sZV9pZCBjb25zb2xlX2RhdGEKCXNldCB3IC5jb25zb2xlW2luY3IgbmV4dF9jb25zb2xlX2lkXQoJc2V0IGNvbnNvbGVfZGF0YSgkdykgW2xpc3QgJHNob3J0X3RpdGxlICRsb25nX3RpdGxlXQoJcmV0dXJuIFtjb25zb2xlX2luaXQgJHddCn0KCnByb2MgY29uc29sZV9pbml0IHt3fSB7CglnbG9iYWwgY29uc29sZV9jciBjb25zb2xlX2RhdGEgTTFCCgoJc2V0IGNvbnNvbGVfY3IoJHcpIDEuMAoJdG9wbGV2ZWwgJHcKCWZyYW1lICR3Lm0KCWxhYmVsICR3Lm0ubDEgLXRleHQgIltsaW5kZXggJGNvbnNvbGVfZGF0YSgkdykgMV06IiBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktZm9udCBmb250X3VpYm9sZAoJdGV4dCAkdy5tLnQgXAoJCS1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHN1bmtlbiBcCgkJLXdpZHRoIDgwIC1oZWlnaHQgMTAgXAoJCS1mb250IGZvbnRfZGlmZiBcCgkJLXN0YXRlIGRpc2FibGVkIFwKCQkteXNjcm9sbGNvbW1hbmQgW2xpc3QgJHcubS5zYnkgc2V0XQoJbGFiZWwgJHcubS5zIC10ZXh0IHtXb3JraW5nLi4uIHBsZWFzZSB3YWl0Li4ufSBcCgkJLWFuY2hvciB3IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktZm9udCBmb250X3VpYm9sZAoJc2Nyb2xsYmFyICR3Lm0uc2J5IC1jb21tYW5kIFtsaXN0ICR3Lm0udCB5dmlld10KCXBhY2sgJHcubS5sMSAtc2lkZSB0b3AgLWZpbGwgeAoJcGFjayAkdy5tLnMgLXNpZGUgYm90dG9tIC1maWxsIHgKCXBhY2sgJHcubS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQoJcGFjayAkdy5tLnQgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoJcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMSAtcGFkeCA1IC1wYWR5IDEwCgoJbWVudSAkdy5jdHhtIC10ZWFyb2ZmIDAKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJDb3B5IiBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgInRrX3RleHRDb3B5ICR3Lm0udCIKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJTZWxlY3QgQWxsIiBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgImZvY3VzICR3Lm0udDskdy5tLnQgdGFnIGFkZCBzZWwgMC4wIGVuZCIKCSR3LmN0eG0gYWRkIGNvbW1hbmQgLWxhYmVsICJDb3B5IEFsbCIgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kICIKCQkJJHcubS50IHRhZyBhZGQgc2VsIDAuMCBlbmQKCQkJdGtfdGV4dENvcHkgJHcubS50CgkJCSR3Lm0udCB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kCgkJIgoKCWJ1dHRvbiAkdy5vayAtdGV4dCB7Q2xvc2V9IFwKCQktZm9udCBmb250X3VpIFwKCQktc3RhdGUgZGlzYWJsZWQgXAoJCS1jb21tYW5kICJkZXN0cm95ICR3IgoJcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWFuY2hvciBlIC1wYWR5IDEwIC1wYWR4IDEwCgoJYmluZF9idXR0b24zICR3Lm0udCAidGtfcG9wdXAgJHcuY3R4bSAlWCAlWSIKCWJpbmQgJHcubS50IDwkTTFCLUtleS1hPiAiJHcubS50IHRhZyBhZGQgc2VsIDAuMCBlbmQ7YnJlYWsiCgliaW5kICR3Lm0udCA8JE0xQi1LZXktQT4gIiR3Lm0udCB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrIgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImZvY3VzICR3IgoJd20gdGl0bGUgJHcgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IFtsaW5kZXggJGNvbnNvbGVfZGF0YSgkdykgMF0iCglyZXR1cm4gJHcKfQoKcHJvYyBjb25zb2xlX2V4ZWMge3cgY21kIGFmdGVyfSB7CgkjIC0tIEN5Z3dpbidzIFRjbCB0b3NzZXMgdGhlIGVudmlyb21lbnQgd2hlbiB3ZSBleGVjIG91ciBjaGlsZC4KCSMgICAgQnV0IG1vc3QgdXNlcnMgbmVlZCB0aGF0IHNvIHdlIGhhdmUgdG8gcmVsb2dpbi4gOi0oCgkjCglpZiB7W2lzX0N5Z3dpbl19IHsKCQlzZXQgY21kIFtsaXN0IHNoIC0tbG9naW4gLWMgImNkIFwiW3B3ZF1cIiAmJiBbam9pbiAkY21kIHsgfV0iXQoJfQoKCSMgLS0gVGNsIHdvbid0IGxldCB1cyByZWRpcmVjdCBib3RoIHN0ZG91dCBhbmQgc3RkZXJyIHRvCgkjICAgIHRoZSBzYW1lIHBpcGUuICBTbyBwYXNzIGl0IHRocm91Z2ggY2F0Li4uCgkjCglzZXQgY21kIFtjb25jYXQgfCAkY21kIHwmIGNhdF0KCglzZXQgZmRfZiBbb3BlbiAkY21kIHJdCglmY29uZmlndXJlICRmZF9mIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKCWZpbGVldmVudCAkZmRfZiByZWFkYWJsZSBbbGlzdCBjb25zb2xlX3JlYWQgJHcgJGZkX2YgJGFmdGVyXQp9Cgpwcm9jIGNvbnNvbGVfcmVhZCB7dyBmZCBhZnRlcn0gewoJZ2xvYmFsIGNvbnNvbGVfY3IKCglzZXQgYnVmIFtyZWFkICRmZF0KCWlmIHskYnVmIG5lIHt9fSB7CgkJaWYgeyFbd2luZm8gZXhpc3RzICR3XX0ge2NvbnNvbGVfaW5pdCAkd30KCQkkdy5tLnQgY29uZiAtc3RhdGUgbm9ybWFsCgkJc2V0IGMgMAoJCXNldCBuIFtzdHJpbmcgbGVuZ3RoICRidWZdCgkJd2hpbGUgeyRjIDwgJG59IHsKCQkJc2V0IGNyIFtzdHJpbmcgZmlyc3QgIlxyIiAkYnVmICRjXQoJCQlzZXQgbGYgW3N0cmluZyBmaXJzdCAiXG4iICRidWYgJGNdCgkJCWlmIHskY3IgPCAwfSB7c2V0IGNyIFtleHByIHskbiArIDF9XX0KCQkJaWYgeyRsZiA8IDB9IHtzZXQgbGYgW2V4cHIgeyRuICsgMX1dfQoKCQkJaWYgeyRsZiA8ICRjcn0gewoJCQkJJHcubS50IGluc2VydCBlbmQgW3N0cmluZyByYW5nZSAkYnVmICRjICRsZl0KCQkJCXNldCBjb25zb2xlX2NyKCR3KSBbJHcubS50IGluZGV4IHtlbmQgLTFjfV0KCQkJCXNldCBjICRsZgoJCQkJaW5jciBjCgkJCX0gZWxzZSB7CgkJCQkkdy5tLnQgZGVsZXRlICRjb25zb2xlX2NyKCR3KSBlbmQKCQkJCSR3Lm0udCBpbnNlcnQgZW5kICJcbiIKCQkJCSR3Lm0udCBpbnNlcnQgZW5kIFtzdHJpbmcgcmFuZ2UgJGJ1ZiAkYyAkY3JdCgkJCQlzZXQgYyAkY3IKCQkJCWluY3IgYwoJCQl9CgkJfQoJCSR3Lm0udCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJCSR3Lm0udCBzZWUgZW5kCgl9CgoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDEKCWlmIHtbZW9mICRmZF19IHsKCQlpZiB7W2NhdGNoIHtjbG9zZSAkZmR9XX0gewoJCQlzZXQgb2sgMAoJCX0gZWxzZSB7CgkJCXNldCBvayAxCgkJfQoJCXVwbGV2ZWwgIzAgJGFmdGVyICR3ICRvawoJCXJldHVybgoJfQoJZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAKfQoKcHJvYyBjb25zb2xlX2NoYWluIHtjbWRsaXN0IHcge29rIDF9fSB7CglpZiB7JG9rfSB7CgkJaWYge1tsbGVuZ3RoICRjbWRsaXN0XSA9PSAwfSB7CgkJCWNvbnNvbGVfZG9uZSAkdyAkb2sKCQkJcmV0dXJuCgkJfQoKCQlzZXQgY21kIFtsaW5kZXggJGNtZGxpc3QgMF0KCQlzZXQgY21kbGlzdCBbbHJhbmdlICRjbWRsaXN0IDEgZW5kXQoKCQlpZiB7W2xpbmRleCAkY21kIDBdIGVxIHtjb25zb2xlX2V4ZWN9fSB7CgkJCWNvbnNvbGVfZXhlYyAkdyBcCgkJCQlbbGluZGV4ICRjbWQgMV0gXAoJCQkJW2xpc3QgY29uc29sZV9jaGFpbiAkY21kbGlzdF0KCQl9IGVsc2UgewoJCQl1cGxldmVsICMwICRjbWQgJGNtZGxpc3QgJHcgJG9rCgkJfQoJfSBlbHNlIHsKCQljb25zb2xlX2RvbmUgJHcgJG9rCgl9Cn0KCnByb2MgY29uc29sZV9kb25lIHthcmdzfSB7CglnbG9iYWwgY29uc29sZV9jciBjb25zb2xlX2RhdGEKCglzd2l0Y2ggLS0gW2xsZW5ndGggJGFyZ3NdIHsKCTIgewoJCXNldCB3IFtsaW5kZXggJGFyZ3MgMF0KCQlzZXQgb2sgW2xpbmRleCAkYXJncyAxXQoJfQoJMyB7CgkJc2V0IHcgW2xpbmRleCAkYXJncyAxXQoJCXNldCBvayBbbGluZGV4ICRhcmdzIDJdCgl9CglkZWZhdWx0IHsKCQllcnJvciAid3JvbmcgbnVtYmVyIG9mIGFyZ3M6IGNvbnNvbGVfZG9uZSA/aWdub3JlZD8gdyBvayIKCX0KCX0KCglpZiB7JG9rfSB7CgkJaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CgkJCSR3Lm0ucyBjb25mIC1iYWNrZ3JvdW5kIGdyZWVuIC10ZXh0IHtTdWNjZXNzfQoJCQkkdy5vayBjb25mIC1zdGF0ZSBub3JtYWwKCQl9Cgl9IGVsc2UgewoJCWlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsKCQkJY29uc29sZV9pbml0ICR3CgkJfQoJCSR3Lm0ucyBjb25mIC1iYWNrZ3JvdW5kIHJlZCAtdGV4dCB7RXJyb3I6IENvbW1hbmQgRmFpbGVkfQoJCSR3Lm9rIGNvbmYgLXN0YXRlIG5vcm1hbAoJfQoKCWFycmF5IHVuc2V0IGNvbnNvbGVfY3IgJHcKCWFycmF5IHVuc2V0IGNvbnNvbGVfZGF0YSAkdwp9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIHVpIGNvbW1hbmRzCgpzZXQgc3RhcnRpbmdfZ2l0a19tc2cge1N0YXJ0aW5nIGdpdGsuLi4gcGxlYXNlIHdhaXQuLi59Cgpwcm9jIGRvX2dpdGsge3JldnN9IHsKCWdsb2JhbCBlbnYgdWlfc3RhdHVzX3ZhbHVlIHN0YXJ0aW5nX2dpdGtfbXNnCgoJIyAtLSBBbHdheXMgc3RhcnQgZ2l0ayB0aHJvdWdoIHdoYXRldmVyIHdlIHdlcmUgbG9hZGVkIHdpdGguICBUaGlzCgkjICAgIGxldHMgdXMgYnlwYXNzIHVzaW5nIHNoZWxsIHByb2Nlc3Mgb24gV2luZG93cyBzeXN0ZW1zLgoJIwoJc2V0IGNtZCBbaW5mbyBuYW1lb2ZleGVjdXRhYmxlXQoJbGFwcGVuZCBjbWQgW2dpdGV4ZWMgZ2l0a10KCWlmIHskcmV2cyBuZSB7fX0gewoJCWFwcGVuZCBjbWQgeyB9CgkJYXBwZW5kIGNtZCAkcmV2cwoJfQoKCWlmIHtbY2F0Y2gge2V2YWwgZXhlYyAkY21kICZ9IGVycl19IHsKCQllcnJvcl9wb3B1cCAiRmFpbGVkIHRvIHN0YXJ0IGdpdGs6XG5cbiRlcnIiCgl9IGVsc2UgewoJCXNldCB1aV9zdGF0dXNfdmFsdWUgJHN0YXJ0aW5nX2dpdGtfbXNnCgkJYWZ0ZXIgMTAwMDAgewoJCQlpZiB7JHVpX3N0YXR1c192YWx1ZSBlcSAkc3RhcnRpbmdfZ2l0a19tc2d9IHsKCQkJCXNldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln0KCQkJfQoJCX0KCX0KfQoKcHJvYyBkb19zdGF0cyB7fSB7CglzZXQgZmQgW29wZW4gInwgZ2l0IGNvdW50LW9iamVjdHMgLXYiIHJdCgl3aGlsZSB7W2dldHMgJGZkIGxpbmVdID4gMH0gewoJCWlmIHtbcmVnZXhwIHteKFteOl0rKTogKFxkKykkfSAkbGluZSBfIG5hbWUgdmFsdWVdfSB7CgkJCXNldCBzdGF0cygkbmFtZSkgJHZhbHVlCgkJfQoJfQoJY2xvc2UgJGZkCgoJc2V0IHBhY2tlZF9zeiAwCglmb3JlYWNoIHAgW2dsb2IgLWRpcmVjdG9yeSBbZ2l0ZGlyIG9iamVjdHMgcGFja10gXAoJCS10eXBlIGYgXAoJCS1ub2NvbXBsYWluIC0tICpdIHsKCQlpbmNyIHBhY2tlZF9zeiBbZmlsZSBzaXplICRwXQoJfQoJaWYgeyRwYWNrZWRfc3ogPiAwfSB7CgkJc2V0IHN0YXRzKHNpemUtcGFjaykgW2V4cHIgeyRwYWNrZWRfc3ogLyAxMDI0fV0KCX0KCglzZXQgdyAuc3RhdHNfdmlldwoJdG9wbGV2ZWwgJHcKCXdtIGdlb21ldHJ5ICR3ICIrW3dpbmZvIHJvb3R4IC5dK1t3aW5mbyByb290eSAuXSIKCglsYWJlbCAkdy5oZWFkZXIgLXRleHQge0RhdGFiYXNlIFN0YXRpc3RpY3N9IFwKCQktZm9udCBmb250X3VpYm9sZAoJcGFjayAkdy5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKCglmcmFtZSAkdy5idXR0b25zIC1ib3JkZXIgMQoJYnV0dG9uICR3LmJ1dHRvbnMuY2xvc2UgLXRleHQgQ2xvc2UgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHddCglidXR0b24gJHcuYnV0dG9ucy5nYyAtdGV4dCB7Q29tcHJlc3MgRGF0YWJhc2V9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCAiZGVzdHJveSAkdztkb19nYyIKCXBhY2sgJHcuYnV0dG9ucy5jbG9zZSAtc2lkZSByaWdodAoJcGFjayAkdy5idXR0b25zLmdjIC1zaWRlIGxlZnQKCXBhY2sgJHcuYnV0dG9ucyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeSAxMCAtcGFkeCAxMAoKCWZyYW1lICR3LnN0YXQgLWJvcmRlcndpZHRoIDEgLXJlbGllZiBzb2xpZAoJZm9yZWFjaCBzIHsKCQl7Y291bnQgICAgICAgICAgIHtOdW1iZXIgb2YgbG9vc2Ugb2JqZWN0c319CgkJe3NpemUgICAgICAgICAgICB7RGlzayBzcGFjZSB1c2VkIGJ5IGxvb3NlIG9iamVjdHN9IHsgS2lCfX0KCQl7aW4tcGFjayAgICAgICAgIHtOdW1iZXIgb2YgcGFja2VkIG9iamVjdHN9fQoJCXtwYWNrcyAgICAgICAgICAge051bWJlciBvZiBwYWNrc319CgkJe3NpemUtcGFjayAgICAgICB7RGlzayBzcGFjZSB1c2VkIGJ5IHBhY2tlZCBvYmplY3RzfSB7IEtpQn19CgkJe3BydW5lLXBhY2thYmxlICB7UGFja2VkIG9iamVjdHMgd2FpdGluZyBmb3IgcHJ1bmluZ319CgkJe2dhcmJhZ2UgICAgICAgICB7R2FyYmFnZSBmaWxlc319CgkJfSB7CgkJc2V0IG5hbWUgW2xpbmRleCAkcyAwXQoJCXNldCBsYWJlbCBbbGluZGV4ICRzIDFdCgkJaWYge1tjYXRjaCB7c2V0IHZhbHVlICRzdGF0cygkbmFtZSl9XX0gY29udGludWUKCQlpZiB7W2xsZW5ndGggJHNdID4gMn0gewoJCQlzZXQgdmFsdWUgIiR2YWx1ZVtsaW5kZXggJHMgMl0iCgkJfQoKCQlsYWJlbCAkdy5zdGF0LmxfJG5hbWUgLXRleHQgIiRsYWJlbDoiIC1hbmNob3IgdyAtZm9udCBmb250X3VpCgkJbGFiZWwgJHcuc3RhdC52XyRuYW1lIC10ZXh0ICR2YWx1ZSAtYW5jaG9yIHcgLWZvbnQgZm9udF91aQoJCWdyaWQgJHcuc3RhdC5sXyRuYW1lICR3LnN0YXQudl8kbmFtZSAtc3RpY2t5IHdlIC1wYWR4IHswIDV9Cgl9CglwYWNrICR3LnN0YXQgLXBhZHkgMTAgLXBhZHggMTAKCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQoJYmluZCAkdyA8S2V5LVJldHVybj4gW2xpc3QgZGVzdHJveSAkd10KCXdtIHRpdGxlICR3ICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBEYXRhYmFzZSBTdGF0aXN0aWNzIgoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIGRvX2djIHt9IHsKCXNldCB3IFtuZXdfY29uc29sZSB7Z2N9IHtDb21wcmVzc2luZyB0aGUgb2JqZWN0IGRhdGFiYXNlfV0KCWNvbnNvbGVfY2hhaW4gewoJCXtjb25zb2xlX2V4ZWMge2dpdCBwYWNrLXJlZnMgLS1wcnVuZX19CgkJe2NvbnNvbGVfZXhlYyB7Z2l0IHJlZmxvZyBleHBpcmUgLS1hbGx9fQoJCXtjb25zb2xlX2V4ZWMge2dpdCByZXBhY2sgLWEgLWQgLWx9fQoJCXtjb25zb2xlX2V4ZWMge2dpdCByZXJlcmUgZ2N9fQoJfSAkdwp9Cgpwcm9jIGRvX2ZzY2tfb2JqZWN0cyB7fSB7CglzZXQgdyBbbmV3X2NvbnNvbGUge2ZzY2stb2JqZWN0c30gXAoJCXtWZXJpZnlpbmcgdGhlIG9iamVjdCBkYXRhYmFzZSB3aXRoIGZzY2stb2JqZWN0c31dCglzZXQgY21kIFtsaXN0IGdpdCBmc2NrLW9iamVjdHNdCglsYXBwZW5kIGNtZCAtLWZ1bGwKCWxhcHBlbmQgY21kIC0tY2FjaGUKCWxhcHBlbmQgY21kIC0tc3RyaWN0Cgljb25zb2xlX2V4ZWMgJHcgJGNtZCBjb25zb2xlX2RvbmUKfQoKc2V0IGlzX3F1aXR0aW5nIDAKCnByb2MgZG9fcXVpdCB7fSB7CglnbG9iYWwgdWlfY29tbSBpc19xdWl0dGluZyByZXBvX2NvbmZpZyBjb21taXRfdHlwZQoKCWlmIHskaXNfcXVpdHRpbmd9IHJldHVybgoJc2V0IGlzX3F1aXR0aW5nIDEKCglpZiB7W3dpbmZvIGV4aXN0cyAkdWlfY29tbV19IHsKCQkjIC0tIFN0YXNoIG91ciBjdXJyZW50IGNvbW1pdCBidWZmZXIuCgkJIwoJCXNldCBzYXZlIFtnaXRkaXIgR0lUR1VJX01TR10KCQlzZXQgbXNnIFtzdHJpbmcgdHJpbSBbJHVpX2NvbW0gZ2V0IDAuMCBlbmRdXQoJCXJlZ3N1YiAtYWxsIC1saW5lIHtbIFxyXHRdKyR9ICRtc2cge30gbXNnCgkJaWYgeyghW3N0cmluZyBtYXRjaCBhbWVuZCogJGNvbW1pdF90eXBlXQoJCQl8fCBbJHVpX2NvbW0gZWRpdCBtb2RpZmllZF0pCgkJCSYmICRtc2cgbmUge319IHsKCQkJY2F0Y2ggewoJCQkJc2V0IGZkIFtvcGVuICRzYXZlIHddCgkJCQlwdXRzIC1ub25ld2xpbmUgJGZkICRtc2cKCQkJCWNsb3NlICRmZAoJCQl9CgkJfSBlbHNlIHsKCQkJY2F0Y2gge2ZpbGUgZGVsZXRlICRzYXZlfQoJCX0KCgkJIyAtLSBTdGFzaCBvdXIgY3VycmVudCB3aW5kb3cgZ2VvbWV0cnkgaW50byB0aGlzIHJlcG9zaXRvcnkuCgkJIwoJCXNldCBjZmdfZ2VvbWV0cnkgW2xpc3RdCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW3dtIGdlb21ldHJ5IC5dCgkJbGFwcGVuZCBjZmdfZ2VvbWV0cnkgW2xpbmRleCBbLnZwYW5lIHNhc2ggY29vcmQgMF0gMV0KCQlsYXBwZW5kIGNmZ19nZW9tZXRyeSBbbGluZGV4IFsudnBhbmUuZmlsZXMgc2FzaCBjb29yZCAwXSAwXQoJCWlmIHtbY2F0Y2gge3NldCByY19nZW9tZXRyeSAkcmVwb19jb25maWcoZ3VpLmdlb21ldHJ5KX1dfSB7CgkJCXNldCByY19nZW9tZXRyeSB7fQoJCX0KCQlpZiB7JGNmZ19nZW9tZXRyeSBuZSAkcmNfZ2VvbWV0cnl9IHsKCQkJY2F0Y2gge2dpdCBjb25maWcgZ3VpLmdlb21ldHJ5ICRjZmdfZ2VvbWV0cnl9CgkJfQoJfQoKCWRlc3Ryb3kgLgp9Cgpwcm9jIGRvX3Jlc2NhbiB7fSB7CglyZXNjYW4ge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19Cn0KCnByb2MgdW5zdGFnZV9oZWxwZXIge3R4dCBwYXRoc30gewoJZ2xvYmFsIGZpbGVfc3RhdGVzIGN1cnJlbnRfZGlmZl9wYXRoCgoJaWYgeyFbbG9ja19pbmRleCBiZWdpbi11cGRhdGVdfSByZXR1cm4KCglzZXQgcGF0aExpc3QgW2xpc3RdCglzZXQgYWZ0ZXIge30KCWZvcmVhY2ggcGF0aCAkcGF0aHMgewoJCXN3aXRjaCAtZ2xvYiAtLSBbbGluZGV4ICRmaWxlX3N0YXRlcygkcGF0aCkgMF0gewoJCUE/IC0KCQlNPyAtCgkJRD8gewoJCQlsYXBwZW5kIHBhdGhMaXN0ICRwYXRoCgkJCWlmIHskcGF0aCBlcSAkY3VycmVudF9kaWZmX3BhdGh9IHsKCQkJCXNldCBhZnRlciB7cmVzaG93X2RpZmY7fQoJCQl9CgkJfQoJCX0KCX0KCWlmIHskcGF0aExpc3QgZXEge319IHsKCQl1bmxvY2tfaW5kZXgKCX0gZWxzZSB7CgkJdXBkYXRlX2luZGV4aW5mbyBcCgkJCSR0eHQgXAoJCQkkcGF0aExpc3QgXAoJCQlbY29uY2F0ICRhZnRlciB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX1dCgl9Cn0KCnByb2MgZG9fdW5zdGFnZV9zZWxlY3Rpb24ge30gewoJZ2xvYmFsIGN1cnJlbnRfZGlmZl9wYXRoIHNlbGVjdGVkX3BhdGhzCgoJaWYge1thcnJheSBzaXplIHNlbGVjdGVkX3BhdGhzXSA+IDB9IHsKCQl1bnN0YWdlX2hlbHBlciBcCgkJCXtVbnN0YWdpbmcgc2VsZWN0ZWQgZmlsZXMgZnJvbSBjb21taXR9IFwKCQkJW2FycmF5IG5hbWVzIHNlbGVjdGVkX3BhdGhzXQoJfSBlbHNlaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBuZSB7fX0gewoJCXVuc3RhZ2VfaGVscGVyIFwKCQkJIlVuc3RhZ2luZyBbc2hvcnRfcGF0aCAkY3VycmVudF9kaWZmX3BhdGhdIGZyb20gY29tbWl0IiBcCgkJCVtsaXN0ICRjdXJyZW50X2RpZmZfcGF0aF0KCX0KfQoKcHJvYyBhZGRfaGVscGVyIHt0eHQgcGF0aHN9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBjdXJyZW50X2RpZmZfcGF0aAoKCWlmIHshW2xvY2tfaW5kZXggYmVnaW4tdXBkYXRlXX0gcmV0dXJuCgoJc2V0IHBhdGhMaXN0IFtsaXN0XQoJc2V0IGFmdGVyIHt9Cglmb3JlYWNoIHBhdGggJHBhdGhzIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlfTyAtCgkJP00gLQoJCT9EIC0KCQlVPyB7CgkJCWxhcHBlbmQgcGF0aExpc3QgJHBhdGgKCQkJaWYgeyRwYXRoIGVxICRjdXJyZW50X2RpZmZfcGF0aH0gewoJCQkJc2V0IGFmdGVyIHtyZXNob3dfZGlmZjt9CgkJCX0KCQl9CgkJfQoJfQoJaWYgeyRwYXRoTGlzdCBlcSB7fX0gewoJCXVubG9ja19pbmRleAoJfSBlbHNlIHsKCQl1cGRhdGVfaW5kZXggXAoJCQkkdHh0IFwKCQkJJHBhdGhMaXN0IFwKCQkJW2NvbmNhdCAkYWZ0ZXIge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5IHRvIGNvbW1pdC59fV0KCX0KfQoKcHJvYyBkb19hZGRfc2VsZWN0aW9uIHt9IHsKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBzZWxlY3RlZF9wYXRocwoKCWlmIHtbYXJyYXkgc2l6ZSBzZWxlY3RlZF9wYXRoc10gPiAwfSB7CgkJYWRkX2hlbHBlciBcCgkJCXtBZGRpbmcgc2VsZWN0ZWQgZmlsZXN9IFwKCQkJW2FycmF5IG5hbWVzIHNlbGVjdGVkX3BhdGhzXQoJfSBlbHNlaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBuZSB7fX0gewoJCWFkZF9oZWxwZXIgXAoJCQkiQWRkaW5nIFtzaG9ydF9wYXRoICRjdXJyZW50X2RpZmZfcGF0aF0iIFwKCQkJW2xpc3QgJGN1cnJlbnRfZGlmZl9wYXRoXQoJfQp9Cgpwcm9jIGRvX2FkZF9hbGwge30gewoJZ2xvYmFsIGZpbGVfc3RhdGVzCgoJc2V0IHBhdGhzIFtsaXN0XQoJZm9yZWFjaCBwYXRoIFthcnJheSBuYW1lcyBmaWxlX3N0YXRlc10gewoJCXN3aXRjaCAtZ2xvYiAtLSBbbGluZGV4ICRmaWxlX3N0YXRlcygkcGF0aCkgMF0gewoJCVU/IHtjb250aW51ZX0KCQk/TSAtCgkJP0Qge2xhcHBlbmQgcGF0aHMgJHBhdGh9CgkJfQoJfQoJYWRkX2hlbHBlciB7QWRkaW5nIGFsbCBjaGFuZ2VkIGZpbGVzfSAkcGF0aHMKfQoKcHJvYyByZXZlcnRfaGVscGVyIHt0eHQgcGF0aHN9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBjdXJyZW50X2RpZmZfcGF0aAoKCWlmIHshW2xvY2tfaW5kZXggYmVnaW4tdXBkYXRlXX0gcmV0dXJuCgoJc2V0IHBhdGhMaXN0IFtsaXN0XQoJc2V0IGFmdGVyIHt9Cglmb3JlYWNoIHBhdGggJHBhdGhzIHsKCQlzd2l0Y2ggLWdsb2IgLS0gW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHBhdGgpIDBdIHsKCQlVPyB7Y29udGludWV9CgkJP00gLQoJCT9EIHsKCQkJbGFwcGVuZCBwYXRoTGlzdCAkcGF0aAoJCQlpZiB7JHBhdGggZXEgJGN1cnJlbnRfZGlmZl9wYXRofSB7CgkJCQlzZXQgYWZ0ZXIge3Jlc2hvd19kaWZmO30KCQkJfQoJCX0KCQl9Cgl9CgoJc2V0IG4gW2xsZW5ndGggJHBhdGhMaXN0XQoJaWYgeyRuID09IDB9IHsKCQl1bmxvY2tfaW5kZXgKCQlyZXR1cm4KCX0gZWxzZWlmIHskbiA9PSAxfSB7CgkJc2V0IHMgIltzaG9ydF9wYXRoIFtsaW5kZXggJHBhdGhMaXN0XV0iCgl9IGVsc2UgewoJCXNldCBzICJ0aGVzZSAkbiBmaWxlcyIKCX0KCglzZXQgcmVwbHkgW3RrX2RpYWxvZyBcCgkJLmNvbmZpcm1fcmV2ZXJ0IFwKCQkiW2FwcG5hbWVdIChbcmVwb25hbWVdKSIgXAoJCSJSZXZlcnQgY2hhbmdlcyBpbiAkcz8KCkFueSB1bmFkZGVkIGNoYW5nZXMgd2lsbCBiZSBwZXJtYW5lbnRseSBsb3N0IGJ5IHRoZSByZXZlcnQuIiBcCgkJcXVlc3Rpb24gXAoJCTEgXAoJCXtEbyBOb3RoaW5nfSBcCgkJe1JldmVydCBDaGFuZ2VzfSBcCgkJXQoJaWYgeyRyZXBseSA9PSAxfSB7CgkJY2hlY2tvdXRfaW5kZXggXAoJCQkkdHh0IFwKCQkJJHBhdGhMaXN0IFwKCQkJW2NvbmNhdCAkYWZ0ZXIge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19XQoJfSBlbHNlIHsKCQl1bmxvY2tfaW5kZXgKCX0KfQoKcHJvYyBkb19yZXZlcnRfc2VsZWN0aW9uIHt9IHsKCWdsb2JhbCBjdXJyZW50X2RpZmZfcGF0aCBzZWxlY3RlZF9wYXRocwoKCWlmIHtbYXJyYXkgc2l6ZSBzZWxlY3RlZF9wYXRoc10gPiAwfSB7CgkJcmV2ZXJ0X2hlbHBlciBcCgkJCXtSZXZlcnRpbmcgc2VsZWN0ZWQgZmlsZXN9IFwKCQkJW2FycmF5IG5hbWVzIHNlbGVjdGVkX3BhdGhzXQoJfSBlbHNlaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBuZSB7fX0gewoJCXJldmVydF9oZWxwZXIgXAoJCQkiUmV2ZXJ0aW5nIFtzaG9ydF9wYXRoICRjdXJyZW50X2RpZmZfcGF0aF0iIFwKCQkJW2xpc3QgJGN1cnJlbnRfZGlmZl9wYXRoXQoJfQp9Cgpwcm9jIGRvX3NpZ25vZmYge30gewoJZ2xvYmFsIHVpX2NvbW0KCglzZXQgbWUgW2NvbW1pdHRlcl9pZGVudF0KCWlmIHskbWUgZXEge319IHJldHVybgoKCXNldCBzb2IgIlNpZ25lZC1vZmYtYnk6ICRtZSIKCXNldCBsYXN0IFskdWlfY29tbSBnZXQge2VuZCAtMWMgbGluZXN0YXJ0fSB7ZW5kIC0xY31dCglpZiB7JGxhc3QgbmUgJHNvYn0gewoJCSR1aV9jb21tIGVkaXQgc2VwYXJhdG9yCgkJaWYgeyRsYXN0IG5lIHt9CgkJCSYmICFbcmVnZXhwIHteW0EtWl1bQS1aYS16XSotW0EtWmEtei1dKzogKn0gJGxhc3RdfSB7CgkJCSR1aV9jb21tIGluc2VydCBlbmQgIlxuIgoJCX0KCQkkdWlfY29tbSBpbnNlcnQgZW5kICJcbiRzb2IiCgkJJHVpX2NvbW0gZWRpdCBzZXBhcmF0b3IKCQkkdWlfY29tbSBzZWUgZW5kCgl9Cn0KCnByb2MgZG9fc2VsZWN0X2NvbW1pdF90eXBlIHt9IHsKCWdsb2JhbCBjb21taXRfdHlwZSBzZWxlY3RlZF9jb21taXRfdHlwZQoKCWlmIHskc2VsZWN0ZWRfY29tbWl0X3R5cGUgZXEge25ld30KCQkmJiBbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJY3JlYXRlX25ld19jb21taXQKCX0gZWxzZWlmIHskc2VsZWN0ZWRfY29tbWl0X3R5cGUgZXEge2FtZW5kfQoJCSYmICFbc3RyaW5nIG1hdGNoIGFtZW5kKiAkY29tbWl0X3R5cGVdfSB7CgkJbG9hZF9sYXN0X2NvbW1pdAoKCQkjIFRoZSBhbWVuZCByZXF1ZXN0IHdhcyByZWplY3RlZC4uLgoJCSMKCQlpZiB7IVtzdHJpbmcgbWF0Y2ggYW1lbmQqICRjb21taXRfdHlwZV19IHsKCQkJc2V0IHNlbGVjdGVkX2NvbW1pdF90eXBlIG5ldwoJCX0KCX0KfQoKcHJvYyBkb19jb21taXQge30gewoJY29tbWl0X3RyZWUKfQoKcHJvYyBkb19jcmVkaXRzIHt9IHsKCWdsb2JhbCBnaXRndWlfY3JlZGl0cwoKCXNldCB3IC5jcmVkaXRzX2RpYWxvZwoKCXRvcGxldmVsICR3Cgl3bSBnZW9tZXRyeSAkdyAiK1t3aW5mbyByb290eCAuXStbd2luZm8gcm9vdHkgLl0iCgoJbGFiZWwgJHcuaGVhZGVyIC10ZXh0IHtnaXQtZ3VpIENvbnRyaWJ1dG9yc30gLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcuYnV0dG9ucwoJYnV0dG9uICR3LmJ1dHRvbnMuY2xvc2UgLXRleHQge0Nsb3NlfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KCXBhY2sgJHcuYnV0dG9ucy5jbG9zZSAtc2lkZSByaWdodAoJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCgoJZnJhbWUgJHcuY3JlZGl0cwoJdGV4dCAkdy5jcmVkaXRzLnQgXAoJCS1iYWNrZ3JvdW5kIFskdy5oZWFkZXIgY2dldCAtYmFja2dyb3VuZF0gXAoJCS15c2Nyb2xsY29tbWFuZCBbbGlzdCAkdy5jcmVkaXRzLnNieSBzZXRdIFwKCQktd2lkdGggMjAgXAoJCS1oZWlnaHQgMTAgXAoJCS13cmFwIG5vbmUgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHNvbGlkIFwKCQktcGFkeCA1IC1wYWR5IDUgXAoJCS1mb250IGZvbnRfdWkKCXNjcm9sbGJhciAkdy5jcmVkaXRzLnNieSAtY29tbWFuZCBbbGlzdCAkdy5jcmVkaXRzLnQgeXZpZXddCglwYWNrICR3LmNyZWRpdHMuc2J5IC1zaWRlIHJpZ2h0IC1maWxsIHkKCXBhY2sgJHcuY3JlZGl0cy50IC1maWxsIGJvdGggLWV4cGFuZCAxCglwYWNrICR3LmNyZWRpdHMgLXNpZGUgdG9wIC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR4IDUgLXBhZHkgNQoKCWxhYmVsICR3LmRlc2MgXAoJCS10ZXh0ICJBbGwgcG9ydGlvbnMgYXJlIGNvcHlyaWdodGVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgYXV0aG9ycwphbmQgYXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4iIFwKCQktcGFkeCA1IC1wYWR5IDUgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1hbmNob3IgdyBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc29saWQgXAoJCS1mb250IGZvbnRfdWkKCXBhY2sgJHcuZGVzYyAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCA1IC1wYWR5IDUKCgkkdy5jcmVkaXRzLnQgaW5zZXJ0IGVuZCAiW3N0cmluZyB0cmltICRnaXRndWlfY3JlZGl0c11cbiIKCSR3LmNyZWRpdHMudCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoJJHcuY3JlZGl0cy50IHNlZSAxLjAKCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiBbbGlzdCBkZXN0cm95ICR3XQoJd20gdGl0bGUgJHcgWyR3LmhlYWRlciBjZ2V0IC10ZXh0XQoJdGt3YWl0IHdpbmRvdyAkdwp9Cgpwcm9jIGRvX2Fib3V0IHt9IHsKCWdsb2JhbCBhcHB2ZXJzIGNvcHlyaWdodAoJZ2xvYmFsIHRjbF9wYXRjaExldmVsIHRrX3BhdGNoTGV2ZWwKCglzZXQgdyAuYWJvdXRfZGlhbG9nCgl0b3BsZXZlbCAkdwoJd20gZ2VvbWV0cnkgJHcgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgoKCWxhYmVsICR3LmhlYWRlciAtdGV4dCAiQWJvdXQgW2FwcG5hbWVdIiBcCgkJLWZvbnQgZm9udF91aWJvbGQKCXBhY2sgJHcuaGVhZGVyIC1zaWRlIHRvcCAtZmlsbCB4CgoJZnJhbWUgJHcuYnV0dG9ucwoJYnV0dG9uICR3LmJ1dHRvbnMuY2xvc2UgLXRleHQge0Nsb3NlfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KCWJ1dHRvbiAkdy5idXR0b25zLmNyZWRpdHMgLXRleHQge0NvbnRyaWJ1dG9yc30gXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIGRvX2NyZWRpdHMKCXBhY2sgJHcuYnV0dG9ucy5jcmVkaXRzIC1zaWRlIGxlZnQKCXBhY2sgJHcuYnV0dG9ucy5jbG9zZSAtc2lkZSByaWdodAoJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCgoJbGFiZWwgJHcuZGVzYyBcCgkJLXRleHQgImdpdC1ndWkgLSBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBmb3IgR2l0LgokY29weXJpZ2h0IiBcCgkJLXBhZHggNSAtcGFkeSA1IFwKCQktanVzdGlmeSBsZWZ0IFwKCQktYW5jaG9yIHcgXAoJCS1ib3JkZXJ3aWR0aCAxIFwKCQktcmVsaWVmIHNvbGlkIFwKCQktZm9udCBmb250X3VpCglwYWNrICR3LmRlc2MgLXNpZGUgdG9wIC1maWxsIHggLXBhZHggNSAtcGFkeSA1CgoJc2V0IHYge30KCWFwcGVuZCB2ICJnaXQtZ3VpIHZlcnNpb24gJGFwcHZlcnNcbiIKCWFwcGVuZCB2ICJbZ2l0IHZlcnNpb25dXG4iCglhcHBlbmQgdiAiXG4iCglpZiB7JHRjbF9wYXRjaExldmVsIGVxICR0a19wYXRjaExldmVsfSB7CgkJYXBwZW5kIHYgIlRjbC9UayB2ZXJzaW9uICR0Y2xfcGF0Y2hMZXZlbCIKCX0gZWxzZSB7CgkJYXBwZW5kIHYgIlRjbCB2ZXJzaW9uICR0Y2xfcGF0Y2hMZXZlbCIKCQlhcHBlbmQgdiAiLCBUayB2ZXJzaW9uICR0a19wYXRjaExldmVsIgoJfQoKCWxhYmVsICR3LnZlcnMgXAoJCS10ZXh0ICR2IFwKCQktcGFkeCA1IC1wYWR5IDUgXAoJCS1qdXN0aWZ5IGxlZnQgXAoJCS1hbmNob3IgdyBcCgkJLWJvcmRlcndpZHRoIDEgXAoJCS1yZWxpZWYgc29saWQgXAoJCS1mb250IGZvbnRfdWkKCXBhY2sgJHcudmVycyAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCA1IC1wYWR5IDUKCgltZW51ICR3LmN0eG0gLXRlYXJvZmYgMAoJJHcuY3R4bSBhZGQgY29tbWFuZCBcCgkJLWxhYmVsIHtDb3B5fSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgIgoJCWNsaXBib2FyZCBjbGVhcgoJCWNsaXBib2FyZCBhcHBlbmQgLWZvcm1hdCBTVFJJTkcgLXR5cGUgU1RSSU5HIC0tIFxbJHcudmVycyBjZ2V0IC10ZXh0XF0KCSIKCgliaW5kICR3IDxWaXNpYmlsaXR5PiAiZ3JhYiAkdzsgZm9jdXMgJHciCgliaW5kICR3IDxLZXktRXNjYXBlPiAiZGVzdHJveSAkdyIKCWJpbmRfYnV0dG9uMyAkdy52ZXJzICJ0a19wb3B1cCAkdy5jdHhtICVYICVZOyBncmFiICR3OyBmb2N1cyAkdyIKCXdtIHRpdGxlICR3ICJBYm91dCBbYXBwbmFtZV0iCgl0a3dhaXQgd2luZG93ICR3Cn0KCnByb2MgZG9fb3B0aW9ucyB7fSB7CglnbG9iYWwgcmVwb19jb25maWcgZ2xvYmFsX2NvbmZpZyBmb250X2Rlc2NzCglnbG9iYWwgcmVwb19jb25maWdfbmV3IGdsb2JhbF9jb25maWdfbmV3CgoJYXJyYXkgdW5zZXQgcmVwb19jb25maWdfbmV3CglhcnJheSB1bnNldCBnbG9iYWxfY29uZmlnX25ldwoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyByZXBvX2NvbmZpZ10gewoJCXNldCByZXBvX2NvbmZpZ19uZXcoJG5hbWUpICRyZXBvX2NvbmZpZygkbmFtZSkKCX0KCWxvYWRfY29uZmlnIDEKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgcmVwb19jb25maWddIHsKCQlzd2l0Y2ggLS0gJG5hbWUgewoJCWd1aS5kaWZmY29udGV4dCB7Y29udGludWV9CgkJfQoJCXNldCByZXBvX2NvbmZpZ19uZXcoJG5hbWUpICRyZXBvX2NvbmZpZygkbmFtZSkKCX0KCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZ2xvYmFsX2NvbmZpZ10gewoJCXNldCBnbG9iYWxfY29uZmlnX25ldygkbmFtZSkgJGdsb2JhbF9jb25maWcoJG5hbWUpCgl9CgoJc2V0IHcgLm9wdGlvbnNfZWRpdG9yCgl0b3BsZXZlbCAkdwoJd20gZ2VvbWV0cnkgJHcgIitbd2luZm8gcm9vdHggLl0rW3dpbmZvIHJvb3R5IC5dIgoKCWxhYmVsICR3LmhlYWRlciAtdGV4dCAiT3B0aW9ucyIgXAoJCS1mb250IGZvbnRfdWlib2xkCglwYWNrICR3LmhlYWRlciAtc2lkZSB0b3AgLWZpbGwgeAoKCWZyYW1lICR3LmJ1dHRvbnMKCWJ1dHRvbiAkdy5idXR0b25zLnJlc3RvcmUgLXRleHQge1Jlc3RvcmUgRGVmYXVsdHN9IFwKCQktZm9udCBmb250X3VpIFwKCQktY29tbWFuZCBkb19yZXN0b3JlX2RlZmF1bHRzCglwYWNrICR3LmJ1dHRvbnMucmVzdG9yZSAtc2lkZSBsZWZ0CglidXR0b24gJHcuYnV0dG9ucy5zYXZlIC10ZXh0IFNhdmUgXAoJCS1mb250IGZvbnRfdWkgXAoJCS1jb21tYW5kIFtsaXN0IGRvX3NhdmVfY29uZmlnICR3XQoJcGFjayAkdy5idXR0b25zLnNhdmUgLXNpZGUgcmlnaHQKCWJ1dHRvbiAkdy5idXR0b25zLmNhbmNlbCAtdGV4dCB7Q2FuY2VsfSBcCgkJLWZvbnQgZm9udF91aSBcCgkJLWNvbW1hbmQgW2xpc3QgZGVzdHJveSAkd10KCXBhY2sgJHcuYnV0dG9ucy5jYW5jZWwgLXNpZGUgcmlnaHQgLXBhZHggNQoJcGFjayAkdy5idXR0b25zIC1zaWRlIGJvdHRvbSAtZmlsbCB4IC1wYWR5IDEwIC1wYWR4IDEwCgoJbGFiZWxmcmFtZSAkdy5yZXBvIC10ZXh0ICJbcmVwb25hbWVdIFJlcG9zaXRvcnkiIFwKCQktZm9udCBmb250X3VpCglsYWJlbGZyYW1lICR3Lmdsb2JhbCAtdGV4dCB7R2xvYmFsIChBbGwgUmVwb3NpdG9yaWVzKX0gXAoJCS1mb250IGZvbnRfdWkKCXBhY2sgJHcucmVwbyAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxIC1wYWR5IDUgLXBhZHggNQoJcGFjayAkdy5nbG9iYWwgLXNpZGUgcmlnaHQgLWZpbGwgYm90aCAtZXhwYW5kIDEgLXBhZHkgNSAtcGFkeCA1CgoJc2V0IG9wdGlkIDAKCWZvcmVhY2ggb3B0aW9uIHsKCQl7dCB1c2VyLm5hbWUge1VzZXIgTmFtZX19CgkJe3QgdXNlci5lbWFpbCB7RW1haWwgQWRkcmVzc319CgoJCXtiIG1lcmdlLnN1bW1hcnkge1N1bW1hcml6ZSBNZXJnZSBDb21taXRzfX0KCQl7aS0xLi41IG1lcmdlLnZlcmJvc2l0eSB7TWVyZ2UgVmVyYm9zaXR5fX0KCgkJe2IgZ3VpLnRydXN0bXRpbWUgIHtUcnVzdCBGaWxlIE1vZGlmaWNhdGlvbiBUaW1lc3RhbXBzfX0KCQl7aS0xLi45OSBndWkuZGlmZmNvbnRleHQge051bWJlciBvZiBEaWZmIENvbnRleHQgTGluZXN9fQoJCXt0IGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSB7TmV3IEJyYW5jaCBOYW1lIFRlbXBsYXRlfX0KCQl9IHsKCQlzZXQgdHlwZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMV0KCQlzZXQgdGV4dCBbbGluZGV4ICRvcHRpb24gMl0KCQlpbmNyIG9wdGlkCgkJZm9yZWFjaCBmIHtyZXBvIGdsb2JhbH0gewoJCQlzd2l0Y2ggLWdsb2IgLS0gJHR5cGUgewoJCQliIHsKCQkJCWNoZWNrYnV0dG9uICR3LiRmLiRvcHRpZCAtdGV4dCAkdGV4dCBcCgkJCQkJLXZhcmlhYmxlICR7Zn1fY29uZmlnX25ldygkbmFtZSkgXAoJCQkJCS1vbnZhbHVlIHRydWUgXAoJCQkJCS1vZmZ2YWx1ZSBmYWxzZSBcCgkJCQkJLWZvbnQgZm9udF91aQoJCQkJcGFjayAkdy4kZi4kb3B0aWQgLXNpZGUgdG9wIC1hbmNob3IgdwoJCQl9CgkJCWktKiB7CgkJCQlyZWdleHAgLS0gey0oXGQrKVwuXC4oXGQrKSR9ICR0eXBlIF9qdW5rIG1pbiBtYXgKCQkJCWZyYW1lICR3LiRmLiRvcHRpZAoJCQkJbGFiZWwgJHcuJGYuJG9wdGlkLmwgLXRleHQgIiR0ZXh0OiIgLWZvbnQgZm9udF91aQoJCQkJcGFjayAkdy4kZi4kb3B0aWQubCAtc2lkZSBsZWZ0IC1hbmNob3IgdyAtZmlsbCB4CgkJCQlzcGluYm94ICR3LiRmLiRvcHRpZC52IFwKCQkJCQktdGV4dHZhcmlhYmxlICR7Zn1fY29uZmlnX25ldygkbmFtZSkgXAoJCQkJCS1mcm9tICRtaW4gXAoJCQkJCS10byAkbWF4IFwKCQkJCQktaW5jcmVtZW50IDEgXAoJCQkJCS13aWR0aCBbZXhwciB7MSArIFtzdHJpbmcgbGVuZ3RoICRtYXhdfV0gXAoJCQkJCS1mb250IGZvbnRfdWkKCQkJCWJpbmQgJHcuJGYuJG9wdGlkLnYgPEZvY3VzSW4+IHslVyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmR9CgkJCQlwYWNrICR3LiRmLiRvcHRpZC52IC1zaWRlIHJpZ2h0IC1hbmNob3IgZSAtcGFkeCA1CgkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3IC1maWxsIHgKCQkJfQoJCQl0IHsKCQkJCWZyYW1lICR3LiRmLiRvcHRpZAoJCQkJbGFiZWwgJHcuJGYuJG9wdGlkLmwgLXRleHQgIiR0ZXh0OiIgLWZvbnQgZm9udF91aQoJCQkJZW50cnkgJHcuJGYuJG9wdGlkLnYgXAoJCQkJCS1ib3JkZXJ3aWR0aCAxIFwKCQkJCQktcmVsaWVmIHN1bmtlbiBcCgkJCQkJLXdpZHRoIDIwIFwKCQkJCQktdGV4dHZhcmlhYmxlICR7Zn1fY29uZmlnX25ldygkbmFtZSkgXAoJCQkJCS1mb250IGZvbnRfdWkKCQkJCXBhY2sgJHcuJGYuJG9wdGlkLmwgLXNpZGUgbGVmdCAtYW5jaG9yIHcKCQkJCXBhY2sgJHcuJGYuJG9wdGlkLnYgLXNpZGUgbGVmdCAtYW5jaG9yIHcgXAoJCQkJCS1maWxsIHggLWV4cGFuZCAxIFwKCQkJCQktcGFkeCA1CgkJCQlwYWNrICR3LiRmLiRvcHRpZCAtc2lkZSB0b3AgLWFuY2hvciB3IC1maWxsIHgKCQkJfQoJCQl9CgkJfQoJfQoKCXNldCBhbGxfZm9udHMgW2xzb3J0IFtmb250IGZhbWlsaWVzXV0KCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgZm9udCBbbGluZGV4ICRvcHRpb24gMV0KCQlzZXQgdGV4dCBbbGluZGV4ICRvcHRpb24gMl0KCgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5eZmFtaWx5KSBcCgkJCVtmb250IGNvbmZpZ3VyZSAkZm9udCAtZmFtaWx5XQoJCXNldCBnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXnNpemUpIFwKCQkJW2ZvbnQgY29uZmlndXJlICRmb250IC1zaXplXQoKCQlmcmFtZSAkdy5nbG9iYWwuJG5hbWUKCQlsYWJlbCAkdy5nbG9iYWwuJG5hbWUubCAtdGV4dCAiJHRleHQ6IiAtZm9udCBmb250X3VpCgkJcGFjayAkdy5nbG9iYWwuJG5hbWUubCAtc2lkZSBsZWZ0IC1hbmNob3IgdyAtZmlsbCB4CgkJZXZhbCB0a19vcHRpb25NZW51ICR3Lmdsb2JhbC4kbmFtZS5mYW1pbHkgXAoJCQlnbG9iYWxfY29uZmlnX25ldyhndWkuJGZvbnReXmZhbWlseSkgXAoJCQkkYWxsX2ZvbnRzCgkJc3BpbmJveCAkdy5nbG9iYWwuJG5hbWUuc2l6ZSBcCgkJCS10ZXh0dmFyaWFibGUgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5zaXplKSBcCgkJCS1mcm9tIDIgLXRvIDgwIC1pbmNyZW1lbnQgMSBcCgkJCS13aWR0aCAzIFwKCQkJLWZvbnQgZm9udF91aQoJCWJpbmQgJHcuZ2xvYmFsLiRuYW1lLnNpemUgPEZvY3VzSW4+IHslVyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmR9CgkJcGFjayAkdy5nbG9iYWwuJG5hbWUuc2l6ZSAtc2lkZSByaWdodCAtYW5jaG9yIGUKCQlwYWNrICR3Lmdsb2JhbC4kbmFtZS5mYW1pbHkgLXNpZGUgcmlnaHQgLWFuY2hvciBlCgkJcGFjayAkdy5nbG9iYWwuJG5hbWUgLXNpZGUgdG9wIC1hbmNob3IgdyAtZmlsbCB4Cgl9CgoJYmluZCAkdyA8VmlzaWJpbGl0eT4gImdyYWIgJHc7IGZvY3VzICR3IgoJYmluZCAkdyA8S2V5LUVzY2FwZT4gImRlc3Ryb3kgJHciCgl3bSB0aXRsZSAkdyAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogT3B0aW9ucyIKCXRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBkb19yZXN0b3JlX2RlZmF1bHRzIHt9IHsKCWdsb2JhbCBmb250X2Rlc2NzIGRlZmF1bHRfY29uZmlnIHJlcG9fY29uZmlnCglnbG9iYWwgcmVwb19jb25maWdfbmV3IGdsb2JhbF9jb25maWdfbmV3CgoJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBkZWZhdWx0X2NvbmZpZ10gewoJCXNldCByZXBvX2NvbmZpZ19uZXcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoJG5hbWUpICRkZWZhdWx0X2NvbmZpZygkbmFtZSkKCX0KCglmb3JlYWNoIG9wdGlvbiAkZm9udF9kZXNjcyB7CgkJc2V0IG5hbWUgW2xpbmRleCAkb3B0aW9uIDBdCgkJc2V0IHJlcG9fY29uZmlnKGd1aS4kbmFtZSkgJGRlZmF1bHRfY29uZmlnKGd1aS4kbmFtZSkKCX0KCWFwcGx5X2NvbmZpZwoKCWZvcmVhY2ggb3B0aW9uICRmb250X2Rlc2NzIHsKCQlzZXQgbmFtZSBbbGluZGV4ICRvcHRpb24gMF0KCQlzZXQgZm9udCBbbGluZGV4ICRvcHRpb24gMV0KCQlzZXQgZ2xvYmFsX2NvbmZpZ19uZXcoZ3VpLiRmb250Xl5mYW1pbHkpIFwKCQkJW2ZvbnQgY29uZmlndXJlICRmb250IC1mYW1pbHldCgkJc2V0IGdsb2JhbF9jb25maWdfbmV3KGd1aS4kZm9udF5ec2l6ZSkgXAoJCQlbZm9udCBjb25maWd1cmUgJGZvbnQgLXNpemVdCgl9Cn0KCnByb2MgZG9fc2F2ZV9jb25maWcge3d9IHsKCWlmIHtbY2F0Y2gge3NhdmVfY29uZmlnfSBlcnJdfSB7CgkJZXJyb3JfcG9wdXAgIkZhaWxlZCB0byBjb21wbGV0ZWx5IHNhdmUgb3B0aW9uczpcblxuJGVyciIKCX0KCXJlc2hvd19kaWZmCglkZXN0cm95ICR3Cn0KCnByb2MgZG9fd2luZG93c19zaG9ydGN1dCB7fSB7CglnbG9iYWwgYXJndjAKCglzZXQgZm4gW3RrX2dldFNhdmVGaWxlIFwKCQktcGFyZW50IC4gXAoJCS10aXRsZSAiW2FwcG5hbWVdIChbcmVwb25hbWVdKTogQ3JlYXRlIERlc2t0b3AgSWNvbiIgXAoJCS1pbml0aWFsZmlsZSAiR2l0IFtyZXBvbmFtZV0uYmF0Il0KCWlmIHskZm4gIT0ge319IHsKCQlpZiB7W2NhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiAkZm4gd10KCQkJCXB1dHMgJGZkICJARUNITyBFbnRlcmluZyBbcmVwb25hbWVdIgoJCQkJcHV0cyAkZmQgIkBFQ0hPIFN0YXJ0aW5nIGdpdC1ndWkuLi4gcGxlYXNlIHdhaXQuLi4iCgkJCQlwdXRzICRmZCAiQFNFVCBQQVRIPVtmaWxlIG5vcm1hbGl6ZSBbZ2l0ZXhlY11dOyVQQVRIJSIKCQkJCXB1dHMgJGZkICJAU0VUIEdJVF9ESVI9W2ZpbGUgbm9ybWFsaXplIFtnaXRkaXJdXSIKCQkJCXB1dHMgLW5vbmV3bGluZSAkZmQgIkBcIltpbmZvIG5hbWVvZmV4ZWN1dGFibGVdXCIiCgkJCQlwdXRzICRmZCAiIFwiW2ZpbGUgbm9ybWFsaXplICRhcmd2MF1cIiIKCQkJCWNsb3NlICRmZAoJCQl9IGVycl19IHsKCQkJZXJyb3JfcG9wdXAgIkNhbm5vdCB3cml0ZSBzY3JpcHQ6XG5cbiRlcnIiCgkJfQoJfQp9Cgpwcm9jIGRvX2N5Z3dpbl9zaG9ydGN1dCB7fSB7CglnbG9iYWwgYXJndjAKCglpZiB7W2NhdGNoIHsKCQlzZXQgZGVza3RvcCBbZXhlYyBjeWdwYXRoIFwKCQkJLS13aW5kb3dzIFwKCQkJLS1hYnNvbHV0ZSBcCgkJCS0tbG9uZy1uYW1lIFwKCQkJLS1kZXNrdG9wXQoJCX1dfSB7CgkJCXNldCBkZXNrdG9wIC4KCX0KCXNldCBmbiBbdGtfZ2V0U2F2ZUZpbGUgXAoJCS1wYXJlbnQgLiBcCgkJLXRpdGxlICJbYXBwbmFtZV0gKFtyZXBvbmFtZV0pOiBDcmVhdGUgRGVza3RvcCBJY29uIiBcCgkJLWluaXRpYWxkaXIgJGRlc2t0b3AgXAoJCS1pbml0aWFsZmlsZSAiR2l0IFtyZXBvbmFtZV0uYmF0Il0KCWlmIHskZm4gIT0ge319IHsKCQlpZiB7W2NhdGNoIHsKCQkJCXNldCBmZCBbb3BlbiAkZm4gd10KCQkJCXNldCBzaCBbZXhlYyBjeWdwYXRoIFwKCQkJCQktLXdpbmRvd3MgXAoJCQkJCS0tYWJzb2x1dGUgXAoJCQkJCS9iaW4vc2hdCgkJCQlzZXQgbWUgW2V4ZWMgY3lncGF0aCBcCgkJCQkJLS11bml4IFwKCQkJCQktLWFic29sdXRlIFwKCQkJCQkkYXJndjBdCgkJCQlzZXQgZ2QgW2V4ZWMgY3lncGF0aCBcCgkJCQkJLS11bml4IFwKCQkJCQktLWFic29sdXRlIFwKCQkJCQlbZ2l0ZGlyXV0KCQkJCXNldCBndyBbZXhlYyBjeWdwYXRoIFwKCQkJCQktLXdpbmRvd3MgXAoJCQkJCS0tYWJzb2x1dGUgXAoJCQkJCVtmaWxlIGRpcm5hbWUgW2dpdGRpcl1dXQoJCQkJcmVnc3ViIC1hbGwgJyAkbWUgIidcXCcnIiBtZQoJCQkJcmVnc3ViIC1hbGwgJyAkZ2QgIidcXCcnIiBnZAoJCQkJcHV0cyAkZmQgIkBFQ0hPIEVudGVyaW5nICRndyIKCQkJCXB1dHMgJGZkICJARUNITyBTdGFydGluZyBnaXQtZ3VpLi4uIHBsZWFzZSB3YWl0Li4uIgoJCQkJcHV0cyAtbm9uZXdsaW5lICRmZCAiQFwiJHNoXCIgLS1sb2dpbiAtYyBcIiIKCQkJCXB1dHMgLW5vbmV3bGluZSAkZmQgIkdJVF9ESVI9JyRnZCciCgkJCQlwdXRzIC1ub25ld2xpbmUgJGZkICIgJyRtZSciCgkJCQlwdXRzICRmZCAiJlwiIgoJCQkJY2xvc2UgJGZkCgkJCX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiQ2Fubm90IHdyaXRlIHNjcmlwdDpcblxuJGVyciIKCQl9Cgl9Cn0KCnByb2MgZG9fbWFjb3N4X2FwcCB7fSB7CglnbG9iYWwgYXJndjAgZW52CgoJc2V0IGZuIFt0a19nZXRTYXZlRmlsZSBcCgkJLXBhcmVudCAuIFwKCQktdGl0bGUgIlthcHBuYW1lXSAoW3JlcG9uYW1lXSk6IENyZWF0ZSBEZXNrdG9wIEljb24iIFwKCQktaW5pdGlhbGRpciBbZmlsZSBqb2luICRlbnYoSE9NRSkgRGVza3RvcF0gXAoJCS1pbml0aWFsZmlsZSAiR2l0IFtyZXBvbmFtZV0uYXBwIl0KCWlmIHskZm4gIT0ge319IHsKCQlpZiB7W2NhdGNoIHsKCQkJCXNldCBDb250ZW50cyBbZmlsZSBqb2luICRmbiBDb250ZW50c10KCQkJCXNldCBNYWNPUyBbZmlsZSBqb2luICRDb250ZW50cyBNYWNPU10KCQkJCXNldCBleGUgW2ZpbGUgam9pbiAkTWFjT1MgZ2l0LWd1aV0KCgkJCQlmaWxlIG1rZGlyICRNYWNPUwoKCQkJCXNldCBmZCBbb3BlbiBbZmlsZSBqb2luICRDb250ZW50cyBJbmZvLnBsaXN0XSB3XQoJCQkJcHV0cyAkZmQgezw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgo8cGxpc3QgdmVyc2lvbj0iMS4wIj4KPGRpY3Q+Cgk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KCTxzdHJpbmc+Z2l0LWd1aTwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KCTxzdHJpbmc+b3JnLnNwZWFyY2UuZ2l0LWd1aTwvc3RyaW5nPgoJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgoJPHN0cmluZz42LjA8L3N0cmluZz4KCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgoJPHN0cmluZz5BUFBMPC9zdHJpbmc+Cgk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+Cgk8c3RyaW5nPj8/Pz88L3N0cmluZz4KCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjEuMDwvc3RyaW5nPgoJPGtleT5OU1ByaW5jaXBhbENsYXNzPC9rZXk+Cgk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pn0KCQkJCWNsb3NlICRmZAoKCQkJCXNldCBmZCBbb3BlbiAkZXhlIHddCgkJCQlzZXQgZ2QgW2ZpbGUgbm9ybWFsaXplIFtnaXRkaXJdXQoJCQkJc2V0IGVwIFtmaWxlIG5vcm1hbGl6ZSBbZ2l0ZXhlY11dCgkJCQlyZWdzdWIgLWFsbCAnICRnZCAiJ1xcJyciIGdkCgkJCQlyZWdzdWIgLWFsbCAnICRlcCAiJ1xcJyciIGVwCgkJCQlwdXRzICRmZCAiIyEvYmluL3NoIgoJCQkJZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBlbnZdIHsKCQkJCQlpZiB7W3N0cmluZyBtYXRjaCBHSVRfKiAkbmFtZV19IHsKCQkJCQkJcmVnc3ViIC1hbGwgJyAkZW52KCRuYW1lKSAiJ1xcJyciIHYKCQkJCQkJcHV0cyAkZmQgImV4cG9ydCAkbmFtZT0nJHYnIgoJCQkJCX0KCQkJCX0KCQkJCXB1dHMgJGZkICJleHBvcnQgUEFUSD0nJGVwJzpcJFBBVEgiCgkJCQlwdXRzICRmZCAiZXhwb3J0IEdJVF9ESVI9JyRnZCciCgkJCQlwdXRzICRmZCAiZXhlYyBbZmlsZSBub3JtYWxpemUgJGFyZ3YwXSIKCQkJCWNsb3NlICRmZAoKCQkJCWZpbGUgYXR0cmlidXRlcyAkZXhlIC1wZXJtaXNzaW9ucyB1K3gsZyt4LG8reAoJCQl9IGVycl19IHsKCQkJZXJyb3JfcG9wdXAgIkNhbm5vdCB3cml0ZSBpY29uOlxuXG4kZXJyIgoJCX0KCX0KfQoKcHJvYyB0b2dnbGVfb3JfZGlmZiB7dyB4IHl9IHsKCWdsb2JhbCBmaWxlX3N0YXRlcyBmaWxlX2xpc3RzIGN1cnJlbnRfZGlmZl9wYXRoIHVpX2luZGV4IHVpX3dvcmtkaXIKCWdsb2JhbCBsYXN0X2NsaWNrZWQgc2VsZWN0ZWRfcGF0aHMKCglzZXQgcG9zIFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXQoJc2V0IGxubyBbbGluZGV4ICRwb3MgMF0KCXNldCBjb2wgW2xpbmRleCAkcG9zIDFdCglzZXQgcGF0aCBbbGluZGV4ICRmaWxlX2xpc3RzKCR3KSBbZXhwciB7JGxubyAtIDF9XV0KCWlmIHskcGF0aCBlcSB7fX0gewoJCXNldCBsYXN0X2NsaWNrZWQge30KCQlyZXR1cm4KCX0KCglzZXQgbGFzdF9jbGlja2VkIFtsaXN0ICR3ICRsbm9dCglhcnJheSB1bnNldCBzZWxlY3RlZF9wYXRocwoJJHVpX2luZGV4IHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCSR1aV93b3JrZGlyIHRhZyByZW1vdmUgaW5fc2VsIDAuMCBlbmQKCglpZiB7JGNvbCA9PSAwfSB7CgkJaWYgeyRjdXJyZW50X2RpZmZfcGF0aCBlcSAkcGF0aH0gewoJCQlzZXQgYWZ0ZXIge3Jlc2hvd19kaWZmO30KCQl9IGVsc2UgewoJCQlzZXQgYWZ0ZXIge30KCQl9CgkJaWYgeyR3IGVxICR1aV9pbmRleH0gewoJCQl1cGRhdGVfaW5kZXhpbmZvIFwKCQkJCSJVbnN0YWdpbmcgW3Nob3J0X3BhdGggJHBhdGhdIGZyb20gY29tbWl0IiBcCgkJCQlbbGlzdCAkcGF0aF0gXAoJCQkJW2NvbmNhdCAkYWZ0ZXIge3NldCB1aV9zdGF0dXNfdmFsdWUge1JlYWR5Ln19XQoJCX0gZWxzZWlmIHskdyBlcSAkdWlfd29ya2Rpcn0gewoJCQl1cGRhdGVfaW5kZXggXAoJCQkJIkFkZGluZyBbc2hvcnRfcGF0aCAkcGF0aF0iIFwKCQkJCVtsaXN0ICRwYXRoXSBcCgkJCQlbY29uY2F0ICRhZnRlciB7c2V0IHVpX3N0YXR1c192YWx1ZSB7UmVhZHkufX1dCgkJfQoJfSBlbHNlIHsKCQlzaG93X2RpZmYgJHBhdGggJHcgJGxubwoJfQp9Cgpwcm9jIGFkZF9vbmVfdG9fc2VsZWN0aW9uIHt3IHggeX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMgbGFzdF9jbGlja2VkIHNlbGVjdGVkX3BhdGhzCgoJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXSAwXQoJc2V0IHBhdGggW2xpbmRleCAkZmlsZV9saXN0cygkdykgW2V4cHIgeyRsbm8gLSAxfV1dCglpZiB7JHBhdGggZXEge319IHsKCQlzZXQgbGFzdF9jbGlja2VkIHt9CgkJcmV0dXJuCgl9CgoJaWYgeyRsYXN0X2NsaWNrZWQgbmUge30KCQkmJiBbbGluZGV4ICRsYXN0X2NsaWNrZWQgMF0gbmUgJHd9IHsKCQlhcnJheSB1bnNldCBzZWxlY3RlZF9wYXRocwoJCVtsaW5kZXggJGxhc3RfY2xpY2tlZCAwXSB0YWcgcmVtb3ZlIGluX3NlbCAwLjAgZW5kCgl9CgoJc2V0IGxhc3RfY2xpY2tlZCBbbGlzdCAkdyAkbG5vXQoJaWYge1tjYXRjaCB7c2V0IGluX3NlbCAkc2VsZWN0ZWRfcGF0aHMoJHBhdGgpfV19IHsKCQlzZXQgaW5fc2VsIDAKCX0KCWlmIHskaW5fc2VsfSB7CgkJdW5zZXQgc2VsZWN0ZWRfcGF0aHMoJHBhdGgpCgkJJHcgdGFnIHJlbW92ZSBpbl9zZWwgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCX0gZWxzZSB7CgkJc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKSAxCgkJJHcgdGFnIGFkZCBpbl9zZWwgJGxuby4wIFtleHByIHskbG5vICsgMX1dLjAKCX0KfQoKcHJvYyBhZGRfcmFuZ2VfdG9fc2VsZWN0aW9uIHt3IHggeX0gewoJZ2xvYmFsIGZpbGVfbGlzdHMgbGFzdF9jbGlja2VkIHNlbGVjdGVkX3BhdGhzCgoJaWYge1tsaW5kZXggJGxhc3RfY2xpY2tlZCAwXSBuZSAkd30gewoJCXRvZ2dsZV9vcl9kaWZmICR3ICR4ICR5CgkJcmV0dXJuCgl9CgoJc2V0IGxubyBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggQCR4LCR5XSAuXSAwXQoJc2V0IGxjIFtsaW5kZXggJGxhc3RfY2xpY2tlZCAxXQoJaWYgeyRsYyA8ICRsbm99IHsKCQlzZXQgYmVnaW4gJGxjCgkJc2V0IGVuZCAkbG5vCgl9IGVsc2UgewoJCXNldCBiZWdpbiAkbG5vCgkJc2V0IGVuZCAkbGMKCX0KCglmb3JlYWNoIHBhdGggW2xyYW5nZSAkZmlsZV9saXN0cygkdykgXAoJCVtleHByIHskYmVnaW4gLSAxfV0gXAoJCVtleHByIHskZW5kIC0gMX1dXSB7CgkJc2V0IHNlbGVjdGVkX3BhdGhzKCRwYXRoKSAxCgl9CgkkdyB0YWcgYWRkIGluX3NlbCAkYmVnaW4uMCBbZXhwciB7JGVuZCArIDF9XS4wCn0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMKIyMgY29uZmlnIGRlZmF1bHRzCgpzZXQgY3Vyc29yX3B0ciBhcnJvdwpmb250IGNyZWF0ZSBmb250X2RpZmYgLWZhbWlseSBDb3VyaWVyIC1zaXplIDEwCmZvbnQgY3JlYXRlIGZvbnRfdWkKY2F0Y2ggewoJbGFiZWwgLmR1bW15CglldmFsIGZvbnQgY29uZmlndXJlIGZvbnRfdWkgW2ZvbnQgYWN0dWFsIFsuZHVtbXkgY2dldCAtZm9udF1dCglkZXN0cm95IC5kdW1teQp9Cgpmb250IGNyZWF0ZSBmb250X3VpYm9sZApmb250IGNyZWF0ZSBmb250X2RpZmZib2xkCgppZiB7W2lzX1dpbmRvd3NdfSB7CglzZXQgTTFCIENvbnRyb2wKCXNldCBNMVQgQ3RybAp9IGVsc2VpZiB7W2lzX01hY09TWF19IHsKCXNldCBNMUIgTTEKCXNldCBNMVQgQ21kCn0gZWxzZSB7CglzZXQgTTFCIE0xCglzZXQgTTFUIE0xCn0KCnByb2MgYXBwbHlfY29uZmlnIHt9IHsKCWdsb2JhbCByZXBvX2NvbmZpZyBmb250X2Rlc2NzCgoJZm9yZWFjaCBvcHRpb24gJGZvbnRfZGVzY3MgewoJCXNldCBuYW1lIFtsaW5kZXggJG9wdGlvbiAwXQoJCXNldCBmb250IFtsaW5kZXggJG9wdGlvbiAxXQoJCWlmIHtbY2F0Y2ggewoJCQlmb3JlYWNoIHtjbiBjdn0gJHJlcG9fY29uZmlnKGd1aS4kbmFtZSkgewoJCQkJZm9udCBjb25maWd1cmUgJGZvbnQgJGNuICRjdgoJCQl9CgkJCX0gZXJyXX0gewoJCQllcnJvcl9wb3B1cCAiSW52YWxpZCBmb250IHNwZWNpZmllZCBpbiBndWkuJG5hbWU6XG5cbiRlcnIiCgkJfQoJCWZvcmVhY2gge2NuIGN2fSBbZm9udCBjb25maWd1cmUgJGZvbnRdIHsKCQkJZm9udCBjb25maWd1cmUgJHtmb250fWJvbGQgJGNuICRjdgoJCX0KCQlmb250IGNvbmZpZ3VyZSAke2ZvbnR9Ym9sZCAtd2VpZ2h0IGJvbGQKCX0KfQoKc2V0IGRlZmF1bHRfY29uZmlnKG1lcmdlLnN1bW1hcnkpIGZhbHNlCnNldCBkZWZhdWx0X2NvbmZpZyhtZXJnZS52ZXJib3NpdHkpIDIKc2V0IGRlZmF1bHRfY29uZmlnKHVzZXIubmFtZSkge30Kc2V0IGRlZmF1bHRfY29uZmlnKHVzZXIuZW1haWwpIHt9CgpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLnRydXN0bXRpbWUpIGZhbHNlCnNldCBkZWZhdWx0X2NvbmZpZyhndWkuZGlmZmNvbnRleHQpIDUKc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5uZXdicmFuY2h0ZW1wbGF0ZSkge30Kc2V0IGRlZmF1bHRfY29uZmlnKGd1aS5mb250dWkpIFtmb250IGNvbmZpZ3VyZSBmb250X3VpXQpzZXQgZGVmYXVsdF9jb25maWcoZ3VpLmZvbnRkaWZmKSBbZm9udCBjb25maWd1cmUgZm9udF9kaWZmXQpzZXQgZm9udF9kZXNjcyB7Cgl7Zm9udHVpICAgZm9udF91aSAgIHtNYWluIEZvbnR9fQoJe2ZvbnRkaWZmIGZvbnRfZGlmZiB7RGlmZi9Db25zb2xlIEZvbnR9fQp9CmxvYWRfY29uZmlnIDAKYXBwbHlfY29uZmlnCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjIGZlYXR1cmUgb3B0aW9uIHNlbGVjdGlvbgoKaWYge1tyZWdleHAge15naXQtKC4rKSR9IFthcHBuYW1lXSBfanVuayBzdWJjb21tYW5kXX0gewoJdW5zZXQgX2p1bmsKfSBlbHNlIHsKCXNldCBzdWJjb21tYW5kIGd1aQp9CmlmIHskc3ViY29tbWFuZCBlcSB7Z3VpLnNofX0gewoJc2V0IHN1YmNvbW1hbmQgZ3VpCn0KaWYgeyRzdWJjb21tYW5kIGVxIHtndWl9ICYmIFtsbGVuZ3RoICRhcmd2XSA+IDB9IHsKCXNldCBzdWJjb21tYW5kIFtsaW5kZXggJGFyZ3YgMF0KCXNldCBhcmd2IFtscmFuZ2UgJGFyZ3YgMSBlbmRdCn0KCmVuYWJsZV9vcHRpb24gbXVsdGljb21taXQKZW5hYmxlX29wdGlvbiBicmFuY2gKZW5hYmxlX29wdGlvbiB0cmFuc3BvcnQKCnN3aXRjaCAtLSAkc3ViY29tbWFuZCB7Ci0tdmVyc2lvbiAtCnZlcnNpb24gLQpicm93c2VyIC0KYmxhbWUgewoJZGlzYWJsZV9vcHRpb24gbXVsdGljb21taXQKCWRpc2FibGVfb3B0aW9uIGJyYW5jaAoJZGlzYWJsZV9vcHRpb24gdHJhbnNwb3J0Cn0KY2l0b29sIHsKCWVuYWJsZV9vcHRpb24gc2luZ2xlY29tbWl0CgoJZGlzYWJsZV9vcHRpb24gbXVsdGljb21taXQKCWRpc2FibGVfb3B0aW9uIGJyYW5jaAoJZGlzYWJsZV9vcHRpb24gdHJhbnNwb3J0Cn0KfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIwojIyB1aSBjb25zdHJ1Y3Rpb24KCnNldCB1aV9jb21tIHt9CgojIC0tIE1lbnUgQmFyCiMKbWVudSAubWJhciAtdGVhcm9mZiAwCi5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBSZXBvc2l0b3J5IC1tZW51IC5tYmFyLnJlcG9zaXRvcnkKLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEVkaXQgLW1lbnUgLm1iYXIuZWRpdAppZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEJyYW5jaCAtbWVudSAubWJhci5icmFuY2gKfQppZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdIHx8IFtpc19lbmFibGVkIHNpbmdsZWNvbW1pdF19IHsKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBDb21taXQgLW1lbnUgLm1iYXIuY29tbWl0Cn0KaWYge1tpc19lbmFibGVkIHRyYW5zcG9ydF19IHsKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBNZXJnZSAtbWVudSAubWJhci5tZXJnZQoJLm1iYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEZldGNoIC1tZW51IC5tYmFyLmZldGNoCgkubWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgUHVzaCAtbWVudSAubWJhci5wdXNoCn0KLiBjb25maWd1cmUgLW1lbnUgLm1iYXIKCiMgLS0gUmVwb3NpdG9yeSBNZW51CiMKbWVudSAubWJhci5yZXBvc2l0b3J5CgoubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7QnJvd3NlIEN1cnJlbnQgQnJhbmNofSBcCgktY29tbWFuZCB7bmV3X2Jyb3dzZXIgJGN1cnJlbnRfYnJhbmNofSBcCgktZm9udCBmb250X3VpCnRyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2JyYW5jaCB3cml0ZSAiLm1iYXIucmVwb3NpdG9yeSBlbnRyeWNvbmYgWy5tYmFyLnJlcG9zaXRvcnkgaW5kZXggbGFzdF0gLWxhYmVsIFwiQnJvd3NlIFwkY3VycmVudF9icmFuY2hcIiA7IyIKLm1iYXIucmVwb3NpdG9yeSBhZGQgc2VwYXJhdG9yCgoubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7VmlzdWFsaXplIEN1cnJlbnQgQnJhbmNofSBcCgktY29tbWFuZCB7ZG9fZ2l0ayAkY3VycmVudF9icmFuY2h9IFwKCS1mb250IGZvbnRfdWkKdHJhY2UgYWRkIHZhcmlhYmxlIGN1cnJlbnRfYnJhbmNoIHdyaXRlICIubWJhci5yZXBvc2l0b3J5IGVudHJ5Y29uZiBbLm1iYXIucmVwb3NpdG9yeSBpbmRleCBsYXN0XSAtbGFiZWwgXCJWaXN1YWxpemUgXCRjdXJyZW50X2JyYW5jaFwiIDsjIgoubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7VmlzdWFsaXplIEFsbCBCcmFuY2hlc30gXAoJLWNvbW1hbmQge2RvX2dpdGsgLS1hbGx9IFwKCS1mb250IGZvbnRfdWkKLm1iYXIucmVwb3NpdG9yeSBhZGQgc2VwYXJhdG9yCgppZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdfSB7CgkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCB7RGF0YWJhc2UgU3RhdGlzdGljc30gXAoJCS1jb21tYW5kIGRvX3N0YXRzIFwKCQktZm9udCBmb250X3VpCgoJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCAtbGFiZWwge0NvbXByZXNzIERhdGFiYXNlfSBcCgkJLWNvbW1hbmQgZG9fZ2MgXAoJCS1mb250IGZvbnRfdWkKCgkubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCB7VmVyaWZ5IERhdGFiYXNlfSBcCgkJLWNvbW1hbmQgZG9fZnNja19vYmplY3RzIFwKCQktZm9udCBmb250X3VpCgoJLm1iYXIucmVwb3NpdG9yeSBhZGQgc2VwYXJhdG9yCgoJaWYge1tpc19DeWd3aW5dfSB7CgkJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgkJCS1sYWJlbCB7Q3JlYXRlIERlc2t0b3AgSWNvbn0gXAoJCQktY29tbWFuZCBkb19jeWd3aW5fc2hvcnRjdXQgXAoJCQktZm9udCBmb250X3VpCgl9IGVsc2VpZiB7W2lzX1dpbmRvd3NdfSB7CgkJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgkJCS1sYWJlbCB7Q3JlYXRlIERlc2t0b3AgSWNvbn0gXAoJCQktY29tbWFuZCBkb193aW5kb3dzX3Nob3J0Y3V0IFwKCQkJLWZvbnQgZm9udF91aQoJfSBlbHNlaWYge1tpc19NYWNPU1hdfSB7CgkJLm1iYXIucmVwb3NpdG9yeSBhZGQgY29tbWFuZCBcCgkJCS1sYWJlbCB7Q3JlYXRlIERlc2t0b3AgSWNvbn0gXAoJCQktY29tbWFuZCBkb19tYWNvc3hfYXBwIFwKCQkJLWZvbnQgZm9udF91aQoJfQp9CgoubWJhci5yZXBvc2l0b3J5IGFkZCBjb21tYW5kIC1sYWJlbCBRdWl0IFwKCS1jb21tYW5kIGRvX3F1aXQgXAoJLWFjY2VsZXJhdG9yICRNMVQtUSBcCgktZm9udCBmb250X3VpCgojIC0tIEVkaXQgTWVudQojCm1lbnUgLm1iYXIuZWRpdAoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBVbmRvIFwKCS1jb21tYW5kIHtjYXRjaCB7W2ZvY3VzXSBlZGl0IHVuZG99fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1aIFwKCS1mb250IGZvbnRfdWkKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgUmVkbyBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gZWRpdCByZWRvfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtWSBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIHNlcGFyYXRvcgoubWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCBDdXQgXAoJLWNvbW1hbmQge2NhdGNoIHt0a190ZXh0Q3V0IFtmb2N1c119fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1YIFwKCS1mb250IGZvbnRfdWkKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgQ29weSBcCgktY29tbWFuZCB7Y2F0Y2gge3RrX3RleHRDb3B5IFtmb2N1c119fSBcCgktYWNjZWxlcmF0b3IgJE0xVC1DIFwKCS1mb250IGZvbnRfdWkKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgUGFzdGUgXAoJLWNvbW1hbmQge2NhdGNoIHt0a190ZXh0UGFzdGUgW2ZvY3VzXTsgW2ZvY3VzXSBzZWUgaW5zZXJ0fX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtViBcCgktZm9udCBmb250X3VpCi5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIERlbGV0ZSBcCgktY29tbWFuZCB7Y2F0Y2gge1tmb2N1c10gZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdH19IFwKCS1hY2NlbGVyYXRvciBEZWwgXAoJLWZvbnQgZm9udF91aQoubWJhci5lZGl0IGFkZCBzZXBhcmF0b3IKLm1iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwge1NlbGVjdCBBbGx9IFwKCS1jb21tYW5kIHtjYXRjaCB7W2ZvY3VzXSB0YWcgYWRkIHNlbCAwLjAgZW5kfX0gXAoJLWFjY2VsZXJhdG9yICRNMVQtQSBcCgktZm9udCBmb250X3VpCgojIC0tIEJyYW5jaCBNZW51CiMKaWYge1tpc19lbmFibGVkIGJyYW5jaF19IHsKCW1lbnUgLm1iYXIuYnJhbmNoCgoJLm1iYXIuYnJhbmNoIGFkZCBjb21tYW5kIC1sYWJlbCB7Q3JlYXRlLi4ufSBcCgkJLWNvbW1hbmQgZG9fY3JlYXRlX2JyYW5jaCBcCgkJLWFjY2VsZXJhdG9yICRNMVQtTiBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgW2xpc3QgLm1iYXIuYnJhbmNoIGVudHJ5Y29uZiBcCgkJWy5tYmFyLmJyYW5jaCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuYnJhbmNoIGFkZCBjb21tYW5kIC1sYWJlbCB7RGVsZXRlLi4ufSBcCgkJLWNvbW1hbmQgZG9fZGVsZXRlX2JyYW5jaCBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgW2xpc3QgLm1iYXIuYnJhbmNoIGVudHJ5Y29uZiBcCgkJWy5tYmFyLmJyYW5jaCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuYnJhbmNoIGFkZCBjb21tYW5kIC1sYWJlbCB7UmVzZXQuLi59IFwKCQktY29tbWFuZCBkb19yZXNldF9oYXJkIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBbbGlzdCAubWJhci5icmFuY2ggZW50cnljb25mIFwKCQlbLm1iYXIuYnJhbmNoIGluZGV4IGxhc3RdIC1zdGF0ZV0KfQoKIyAtLSBDb21taXQgTWVudQojCmlmIHtbaXNfZW5hYmxlZCBtdWx0aWNvbW1pdF0gfHwgW2lzX2VuYWJsZWQgc2luZ2xlY29tbWl0XX0gewoJbWVudSAubWJhci5jb21taXQKCgkubWJhci5jb21taXQgYWRkIHJhZGlvYnV0dG9uIFwKCQktbGFiZWwge05ldyBDb21taXR9IFwKCQktY29tbWFuZCBkb19zZWxlY3RfY29tbWl0X3R5cGUgXAoJCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCgkJLXZhbHVlIG5ldyBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCByYWRpb2J1dHRvbiBcCgkJLWxhYmVsIHtBbWVuZCBMYXN0IENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgkJLXZhcmlhYmxlIHNlbGVjdGVkX2NvbW1pdF90eXBlIFwKCQktdmFsdWUgYW1lbmQgXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgc2VwYXJhdG9yCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCBSZXNjYW4gXAoJCS1jb21tYW5kIGRvX3Jlc2NhbiBcCgkJLWFjY2VsZXJhdG9yIEY1IFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtBZGQgVG8gQ29tbWl0fSBcCgkJLWNvbW1hbmQgZG9fYWRkX3NlbGVjdGlvbiBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7QWRkIEV4aXN0aW5nIFRvIENvbW1pdH0gXAoJCS1jb21tYW5kIGRvX2FkZF9hbGwgXAoJCS1hY2NlbGVyYXRvciAkTTFULUkgXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5jb21taXQgZW50cnljb25mIFsubWJhci5jb21taXQgaW5kZXggbGFzdF0gLXN0YXRlXQoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge1Vuc3RhZ2UgRnJvbSBDb21taXR9IFwKCQktY29tbWFuZCBkb191bnN0YWdlX3NlbGVjdGlvbiBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCgoJLm1iYXIuY29tbWl0IGFkZCBjb21tYW5kIC1sYWJlbCB7UmV2ZXJ0IENoYW5nZXN9IFwKCQktY29tbWFuZCBkb19yZXZlcnRfc2VsZWN0aW9uIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIuY29tbWl0IGVudHJ5Y29uZiBbLm1iYXIuY29tbWl0IGluZGV4IGxhc3RdIC1zdGF0ZV0KCgkubWJhci5jb21taXQgYWRkIHNlcGFyYXRvcgoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwge1NpZ24gT2ZmfSBcCgkJLWNvbW1hbmQgZG9fc2lnbm9mZiBcCgkJLWFjY2VsZXJhdG9yICRNMVQtUyBcCgkJLWZvbnQgZm9udF91aQoKCS5tYmFyLmNvbW1pdCBhZGQgY29tbWFuZCAtbGFiZWwgQ29tbWl0IFwKCQktY29tbWFuZCBkb19jb21taXQgXAoJCS1hY2NlbGVyYXRvciAkTTFULVJldHVybiBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLmNvbW1pdCBlbnRyeWNvbmYgWy5tYmFyLmNvbW1pdCBpbmRleCBsYXN0XSAtc3RhdGVdCn0KCiMgLS0gTWVyZ2UgTWVudQojCmlmIHtbaXNfZW5hYmxlZCBicmFuY2hdfSB7CgltZW51IC5tYmFyLm1lcmdlCgkubWJhci5tZXJnZSBhZGQgY29tbWFuZCAtbGFiZWwge0xvY2FsIE1lcmdlLi4ufSBcCgkJLWNvbW1hbmQgZG9fbG9jYWxfbWVyZ2UgXAoJCS1mb250IGZvbnRfdWkKCWxhcHBlbmQgZGlzYWJsZV9vbl9sb2NrIFwKCQlbbGlzdCAubWJhci5tZXJnZSBlbnRyeWNvbmYgWy5tYmFyLm1lcmdlIGluZGV4IGxhc3RdIC1zdGF0ZV0KCS5tYmFyLm1lcmdlIGFkZCBjb21tYW5kIC1sYWJlbCB7QWJvcnQgTWVyZ2UuLi59IFwKCQktY29tbWFuZCBkb19yZXNldF9oYXJkIFwKCQktZm9udCBmb250X3VpCglsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgkJW2xpc3QgLm1iYXIubWVyZ2UgZW50cnljb25mIFsubWJhci5tZXJnZSBpbmRleCBsYXN0XSAtc3RhdGVdCgp9CgojIC0tIFRyYW5zcG9ydCBNZW51CiMKaWYge1tpc19lbmFibGVkIHRyYW5zcG9ydF19IHsKCW1lbnUgLm1iYXIuZmV0Y2gKCgltZW51IC5tYmFyLnB1c2gKCS5tYmFyLnB1c2ggYWRkIGNvbW1hbmQgLWxhYmVsIHtQdXNoLi4ufSBcCgkJLWNvbW1hbmQgZG9fcHVzaF9hbnl3aGVyZSBcCgkJLWZvbnQgZm9udF91aQp9CgppZiB7W2lzX01hY09TWF19IHsKCSMgLS0gQXBwbGUgTWVudSAoTWFjIE9TIFggb25seSkKCSMKCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBBcHBsZSAtbWVudSAubWJhci5hcHBsZQoJbWVudSAubWJhci5hcHBsZQoKCS5tYmFyLmFwcGxlIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgW2FwcG5hbWVdIiBcCgkJLWNvbW1hbmQgZG9fYWJvdXQgXAoJCS1mb250IGZvbnRfdWkKCS5tYmFyLmFwcGxlIGFkZCBjb21tYW5kIC1sYWJlbCAiT3B0aW9ucy4uLiIgXAoJCS1jb21tYW5kIGRvX29wdGlvbnMgXAoJCS1mb250IGZvbnRfdWkKfSBlbHNlIHsKCSMgLS0gRWRpdCBNZW51CgkjCgkubWJhci5lZGl0IGFkZCBzZXBhcmF0b3IKCS5tYmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsIHtPcHRpb25zLi4ufSBcCgkJLWNvbW1hbmQgZG9fb3B0aW9ucyBcCgkJLWZvbnQgZm9udF91aQoKCSMgLS0gVG9vbHMgTWVudQoJIwoJaWYge1tmaWxlIGV4aXN0cyAvdXNyL2xvY2FsL21pZ2EvbGliL2d1aS1taWdhXQoJCSYmIFtmaWxlIGV4aXN0cyAucHZjc3JjXX0gewoJcHJvYyBkb19taWdhIHt9IHsKCQlnbG9iYWwgdWlfc3RhdHVzX3ZhbHVlCgkJaWYgeyFbbG9ja19pbmRleCB1cGRhdGVdfSByZXR1cm4KCQlzZXQgY21kIFtsaXN0IHNoIC0tbG9naW4gLWMgIi91c3IvbG9jYWwvbWlnYS9saWIvZ3VpLW1pZ2EgXCJbcHdkXVwiIl0KCQlzZXQgbWlnYV9mZCBbb3BlbiAifCRjbWQiIHJdCgkJZmNvbmZpZ3VyZSAkbWlnYV9mZCAtYmxvY2tpbmcgMAoJCWZpbGVldmVudCAkbWlnYV9mZCByZWFkYWJsZSBbbGlzdCBtaWdhX2RvbmUgJG1pZ2FfZmRdCgkJc2V0IHVpX3N0YXR1c192YWx1ZSB7UnVubmluZyBtaWdhLi4ufQoJfQoJcHJvYyBtaWdhX2RvbmUge2ZkfSB7CgkJcmVhZCAkZmQgNTEyCgkJaWYge1tlb2YgJGZkXX0gewoJCQljbG9zZSAkZmQKCQkJdW5sb2NrX2luZGV4CgkJCXJlc2NhbiBbbGlzdCBzZXQgdWlfc3RhdHVzX3ZhbHVlIHtSZWFkeS59XQoJCX0KCX0KCS5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBUb29scyAtbWVudSAubWJhci50b29scwoJbWVudSAubWJhci50b29scwoJLm1iYXIudG9vbHMgYWRkIGNvbW1hbmQgLWxhYmVsICJNaWdyYXRlIiBcCgkJLWNvbW1hbmQgZG9fbWlnYSBcCgkJLWZvbnQgZm9udF91aQoJbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJCVtsaXN0IC5tYmFyLnRvb2xzIGVudHJ5Y29uZiBbLm1iYXIudG9vbHMgaW5kZXggbGFzdF0gLXN0YXRlXQoJfQp9CgojIC0tIEhlbHAgTWVudQojCi5tYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBIZWxwIC1tZW51IC5tYmFyLmhlbHAKbWVudSAubWJhci5oZWxwCgppZiB7IVtpc19NYWNPU1hdfSB7CgkubWJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgW2FwcG5hbWVdIiBcCgkJLWNvbW1hbmQgZG9fYWJvdXQgXAoJCS1mb250IGZvbnRfdWkKfQoKc2V0IGJyb3dzZXIge30KY2F0Y2gge3NldCBicm93c2VyICRyZXBvX2NvbmZpZyhpbnN0YXdlYi5icm93c2VyKX0Kc2V0IGRvY19wYXRoIFtmaWxlIGRpcm5hbWUgW2dpdGV4ZWNdXQpzZXQgZG9jX3BhdGggW2ZpbGUgam9pbiAkZG9jX3BhdGggRG9jdW1lbnRhdGlvbiBpbmRleC5odG1sXQoKaWYge1tpc19DeWd3aW5dfSB7CglzZXQgZG9jX3BhdGggW2V4ZWMgY3lncGF0aCAtLW1peGVkICRkb2NfcGF0aF0KfQoKaWYgeyRicm93c2VyIGVxIHt9fSB7CglpZiB7W2lzX01hY09TWF19IHsKCQlzZXQgYnJvd3NlciBvcGVuCgl9IGVsc2VpZiB7W2lzX0N5Z3dpbl19IHsKCQlzZXQgcHJvZ3JhbV9maWxlcyBbZmlsZSBkaXJuYW1lIFtleGVjIGN5Z3BhdGggLS13aW5kaXJdXQoJCXNldCBwcm9ncmFtX2ZpbGVzIFtmaWxlIGpvaW4gJHByb2dyYW1fZmlsZXMge1Byb2dyYW0gRmlsZXN9XQoJCXNldCBmaXJlZm94IFtmaWxlIGpvaW4gJHByb2dyYW1fZmlsZXMge01vemlsbGEgRmlyZWZveH0gZmlyZWZveC5leGVdCgkJc2V0IGllIFtmaWxlIGpvaW4gJHByb2dyYW1fZmlsZXMge0ludGVybmV0IEV4cGxvcmVyfSBJRVhQTE9SRS5FWEVdCgkJaWYge1tmaWxlIGV4aXN0cyAkZmlyZWZveF19IHsKCQkJc2V0IGJyb3dzZXIgJGZpcmVmb3gKCQl9IGVsc2VpZiB7W2ZpbGUgZXhpc3RzICRpZV19IHsKCQkJc2V0IGJyb3dzZXIgJGllCgkJfQoJCXVuc2V0IHByb2dyYW1fZmlsZXMgZmlyZWZveCBpZQoJfQp9CgppZiB7W2ZpbGUgaXNmaWxlICRkb2NfcGF0aF19IHsKCXNldCBkb2NfdXJsICJmaWxlOiRkb2NfcGF0aCIKfSBlbHNlIHsKCXNldCBkb2NfdXJsIHtodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy99Cn0KCmlmIHskYnJvd3NlciBuZSB7fX0gewoJLm1iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwge09ubGluZSBEb2N1bWVudGF0aW9ufSBcCgkJLWNvbW1hbmQgW2xpc3QgZXhlYyAkYnJvd3NlciAkZG9jX3VybCAmXSBcCgkJLWZvbnQgZm9udF91aQp9CnVuc2V0IGJyb3dzZXIgZG9jX3BhdGggZG9jX3VybAoKIyAtLSBTdGFuZGFyZCBiaW5kaW5ncwojCmJpbmQgLiAgIDxEZXN0cm95PiBkb19xdWl0CmJpbmQgYWxsIDwkTTFCLUtleS1xPiBkb19xdWl0CmJpbmQgYWxsIDwkTTFCLUtleS1RPiBkb19xdWl0CmJpbmQgYWxsIDwkTTFCLUtleS13PiB7ZGVzdHJveSBbd2luZm8gdG9wbGV2ZWwgJVddfQpiaW5kIGFsbCA8JE0xQi1LZXktVz4ge2Rlc3Ryb3kgW3dpbmZvIHRvcGxldmVsICVXXX0KCiMgLS0gTm90IGEgbm9ybWFsIGNvbW1pdCB0eXBlIGludm9jYXRpb24/ICBEbyB0aGF0IGluc3RlYWQhCiMKc3dpdGNoIC0tICRzdWJjb21tYW5kIHsKLS12ZXJzaW9uIC0KdmVyc2lvbiB7CglwdXRzICJnaXQtZ3VpIHZlcnNpb24gJGFwcHZlcnMiCglleGl0Cn0KYnJvd3NlciB7CglpZiB7W2xsZW5ndGggJGFyZ3ZdICE9IDF9IHsKCQlwdXRzIHN0ZGVyciAidXNhZ2U6ICRhcmd2MCBicm93c2VyIGNvbW1pdCIKCQlleGl0IDEKCX0KCXNldCBjdXJyZW50X2JyYW5jaCBbbGluZGV4ICRhcmd2IDBdCgluZXdfYnJvd3NlciAkY3VycmVudF9icmFuY2gKCXJldHVybgp9CmJsYW1lIHsKCWlmIHtbbGxlbmd0aCAkYXJndl0gIT0gMn0gewoJCXB1dHMgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIGJsYW1lIGNvbW1pdCBwYXRoIgoJCWV4aXQgMQoJfQoJc2V0IGN1cnJlbnRfYnJhbmNoIFtsaW5kZXggJGFyZ3YgMF0KCXNob3dfYmxhbWUgJGN1cnJlbnRfYnJhbmNoIFtsaW5kZXggJGFyZ3YgMV0KCXJldHVybgp9CmNpdG9vbCAtCmd1aSB7CglpZiB7W2xsZW5ndGggJGFyZ3ZdICE9IDB9IHsKCQlwdXRzIC1ub25ld2xpbmUgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIgoJCWlmIHskc3ViY29tbWFuZCBuZSB7Z3VpfSAmJiBbYXBwbmFtZV0gbmUgImdpdC0kc3ViY29tbWFuZCJ9IHsKCQkJcHV0cyAtbm9uZXdsaW5lIHN0ZGVyciAiICRzdWJjb21tYW5kIgoJCX0KCQlwdXRzIHN0ZGVyciB7fQoJCWV4aXQgMQoJfQoJIyBmYWxsIHRocm91Z2ggdG8gc2V0dXAgVUkgZm9yIGNvbW1pdHMKfQpkZWZhdWx0IHsKCXB1dHMgc3RkZXJyICJ1c2FnZTogJGFyZ3YwIFxbe2JsYW1lfGJyb3dzZXJ8Y2l0b29sfVxdIgoJZXhpdCAxCn0KfQoKIyAtLSBCcmFuY2ggQ29udHJvbAojCmZyYW1lIC5icmFuY2ggXAoJLWJvcmRlcndpZHRoIDEgXAoJLXJlbGllZiBzdW5rZW4KbGFiZWwgLmJyYW5jaC5sMSBcCgktdGV4dCB7Q3VycmVudCBCcmFuY2g6fSBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdCBcCgktZm9udCBmb250X3VpCmxhYmVsIC5icmFuY2guY2IgXAoJLXRleHR2YXJpYWJsZSBjdXJyZW50X2JyYW5jaCBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdCBcCgktZm9udCBmb250X3VpCnBhY2sgLmJyYW5jaC5sMSAtc2lkZSBsZWZ0CnBhY2sgLmJyYW5jaC5jYiAtc2lkZSBsZWZ0IC1maWxsIHgKcGFjayAuYnJhbmNoIC1zaWRlIHRvcCAtZmlsbCB4CgojIC0tIE1haW4gV2luZG93IExheW91dAojCnBhbmVkd2luZG93IC52cGFuZSAtb3JpZW50IHZlcnRpY2FsCnBhbmVkd2luZG93IC52cGFuZS5maWxlcyAtb3JpZW50IGhvcml6b250YWwKLnZwYW5lIGFkZCAudnBhbmUuZmlsZXMgLXN0aWNreSBuc2V3IC1oZWlnaHQgMTAwIC13aWR0aCAyMDAKcGFjayAudnBhbmUgLWFuY2hvciBuIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQoKIyAtLSBJbmRleCBGaWxlIExpc3QKIwpmcmFtZSAudnBhbmUuZmlsZXMuaW5kZXggLWhlaWdodCAxMDAgLXdpZHRoIDIwMApsYWJlbCAudnBhbmUuZmlsZXMuaW5kZXgudGl0bGUgLXRleHQge0NoYW5nZXMgVG8gQmUgQ29tbWl0dGVkfSBcCgktYmFja2dyb3VuZCBncmVlbiBcCgktZm9udCBmb250X3VpCnRleHQgJHVpX2luZGV4IC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCS13aWR0aCAyMCAtaGVpZ2h0IDEwIFwKCS13cmFwIG5vbmUgXAoJLWZvbnQgZm9udF91aSBcCgktY3Vyc29yICRjdXJzb3JfcHRyIFwKCS14c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmZpbGVzLmluZGV4LnN4IHNldH0gXAoJLXlzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMuaW5kZXguc3kgc2V0fSBcCgktc3RhdGUgZGlzYWJsZWQKc2Nyb2xsYmFyIC52cGFuZS5maWxlcy5pbmRleC5zeCAtb3JpZW50IGggLWNvbW1hbmQgW2xpc3QgJHVpX2luZGV4IHh2aWV3XQpzY3JvbGxiYXIgLnZwYW5lLmZpbGVzLmluZGV4LnN5IC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkdWlfaW5kZXggeXZpZXddCnBhY2sgLnZwYW5lLmZpbGVzLmluZGV4LnRpdGxlIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmZpbGVzLmluZGV4LnN4IC1zaWRlIGJvdHRvbSAtZmlsbCB4CnBhY2sgLnZwYW5lLmZpbGVzLmluZGV4LnN5IC1zaWRlIHJpZ2h0IC1maWxsIHkKcGFjayAkdWlfaW5kZXggLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQoudnBhbmUuZmlsZXMgYWRkIC52cGFuZS5maWxlcy5pbmRleCAtc3RpY2t5IG5zZXcKCiMgLS0gV29ya2luZyBEaXJlY3RvcnkgRmlsZSBMaXN0CiMKZnJhbWUgLnZwYW5lLmZpbGVzLndvcmtkaXIgLWhlaWdodCAxMDAgLXdpZHRoIDIwMApsYWJlbCAudnBhbmUuZmlsZXMud29ya2Rpci50aXRsZSAtdGV4dCB7Q2hhbmdlZCBCdXQgTm90IFVwZGF0ZWR9IFwKCS1iYWNrZ3JvdW5kIHJlZCBcCgktZm9udCBmb250X3VpCnRleHQgJHVpX3dvcmtkaXIgLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDAgXAoJLXdpZHRoIDIwIC1oZWlnaHQgMTAgXAoJLXdyYXAgbm9uZSBcCgktZm9udCBmb250X3VpIFwKCS1jdXJzb3IgJGN1cnNvcl9wdHIgXAoJLXhzY3JvbGxjb21tYW5kIHsudnBhbmUuZmlsZXMud29ya2Rpci5zeCBzZXR9IFwKCS15c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmZpbGVzLndvcmtkaXIuc3kgc2V0fSBcCgktc3RhdGUgZGlzYWJsZWQKc2Nyb2xsYmFyIC52cGFuZS5maWxlcy53b3JrZGlyLnN4IC1vcmllbnQgaCAtY29tbWFuZCBbbGlzdCAkdWlfd29ya2RpciB4dmlld10Kc2Nyb2xsYmFyIC52cGFuZS5maWxlcy53b3JrZGlyLnN5IC1vcmllbnQgdiAtY29tbWFuZCBbbGlzdCAkdWlfd29ya2RpciB5dmlld10KcGFjayAudnBhbmUuZmlsZXMud29ya2Rpci50aXRsZSAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5maWxlcy53b3JrZGlyLnN4IC1zaWRlIGJvdHRvbSAtZmlsbCB4CnBhY2sgLnZwYW5lLmZpbGVzLndvcmtkaXIuc3kgLXNpZGUgcmlnaHQgLWZpbGwgeQpwYWNrICR1aV93b3JrZGlyIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKLnZwYW5lLmZpbGVzIGFkZCAudnBhbmUuZmlsZXMud29ya2RpciAtc3RpY2t5IG5zZXcKCmZvcmVhY2ggaSBbbGlzdCAkdWlfaW5kZXggJHVpX3dvcmtkaXJdIHsKCSRpIHRhZyBjb25mIGluX2RpZmYgLWZvbnQgZm9udF91aWJvbGQKCSRpIHRhZyBjb25mIGluX3NlbCBcCgkJLWJhY2tncm91bmQgWyRpIGNnZXQgLWZvcmVncm91bmRdIFwKCQktZm9yZWdyb3VuZCBbJGkgY2dldCAtYmFja2dyb3VuZF0KfQp1bnNldCBpCgojIC0tIERpZmYgYW5kIENvbW1pdCBBcmVhCiMKZnJhbWUgLnZwYW5lLmxvd2VyIC1oZWlnaHQgMzAwIC13aWR0aCA0MDAKZnJhbWUgLnZwYW5lLmxvd2VyLmNvbW1hcmVhCmZyYW1lIC52cGFuZS5sb3dlci5kaWZmIC1yZWxpZWYgc3Vua2VuIC1ib3JkZXJ3aWR0aCAxCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhIC1zaWRlIHRvcCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYgLXNpZGUgYm90dG9tIC1maWxsIGJvdGggLWV4cGFuZCAxCi52cGFuZSBhZGQgLnZwYW5lLmxvd2VyIC1zdGlja3kgbnNldwoKIyAtLSBDb21taXQgQXJlYSBCdXR0b25zCiMKZnJhbWUgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMKbGFiZWwgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMubCAtdGV4dCB7fSBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdCBcCgktZm9udCBmb250X3VpCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMubCAtc2lkZSB0b3AgLWZpbGwgeApwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zIC1zaWRlIGxlZnQgLWZpbGwgeQoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiAtdGV4dCB7UmVzY2FufSBcCgktY29tbWFuZCBkb19yZXNjYW4gXAoJLWZvbnQgZm9udF91aQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLnJlc2NhbiAtc2lkZSB0b3AgLWZpbGwgeApsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgl7LnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMucmVzY2FuIGNvbmYgLXN0YXRlfQoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmluY2FsbCAtdGV4dCB7QWRkIEV4aXN0aW5nfSBcCgktY29tbWFuZCBkb19hZGRfYWxsIFwKCS1mb250IGZvbnRfdWkKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5pbmNhbGwgLXNpZGUgdG9wIC1maWxsIHgKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJey52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmluY2FsbCBjb25mIC1zdGF0ZX0KCmJ1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnV0dG9ucy5zaWdub2ZmIC10ZXh0IHtTaWduIE9mZn0gXAoJLWNvbW1hbmQgZG9fc2lnbm9mZiBcCgktZm9udCBmb250X3VpCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuc2lnbm9mZiAtc2lkZSB0b3AgLWZpbGwgeAoKYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCAtdGV4dCB7Q29tbWl0fSBcCgktY29tbWFuZCBkb19jb21taXQgXAoJLWZvbnQgZm9udF91aQpwYWNrIC52cGFuZS5sb3dlci5jb21tYXJlYS5idXR0b25zLmNvbW1pdCAtc2lkZSB0b3AgLWZpbGwgeApsYXBwZW5kIGRpc2FibGVfb25fbG9jayBcCgl7LnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1dHRvbnMuY29tbWl0IGNvbmYgLXN0YXRlfQoKIyAtLSBDb21taXQgTWVzc2FnZSBCdWZmZXIKIwpmcmFtZSAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyCmZyYW1lIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyCnNldCB1aV9jb21tIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIudApzZXQgdWlfY29tbCAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5sCnJhZGlvYnV0dG9uIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuaGVhZGVyLm5ldyBcCgktdGV4dCB7TmV3IENvbW1pdH0gXAoJLWNvbW1hbmQgZG9fc2VsZWN0X2NvbW1pdF90eXBlIFwKCS12YXJpYWJsZSBzZWxlY3RlZF9jb21taXRfdHlwZSBcCgktdmFsdWUgbmV3IFwKCS1mb250IGZvbnRfdWkKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJW2xpc3QgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIubmV3IGNvbmYgLXN0YXRlXQpyYWRpb2J1dHRvbiAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5hbWVuZCBcCgktdGV4dCB7QW1lbmQgTGFzdCBDb21taXR9IFwKCS1jb21tYW5kIGRvX3NlbGVjdF9jb21taXRfdHlwZSBcCgktdmFyaWFibGUgc2VsZWN0ZWRfY29tbWl0X3R5cGUgXAoJLXZhbHVlIGFtZW5kIFwKCS1mb250IGZvbnRfdWkKbGFwcGVuZCBkaXNhYmxlX29uX2xvY2sgXAoJW2xpc3QgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIuYW1lbmQgY29uZiAtc3RhdGVdCmxhYmVsICR1aV9jb21sIFwKCS1hbmNob3IgdyBcCgktanVzdGlmeSBsZWZ0IFwKCS1mb250IGZvbnRfdWkKcHJvYyB0cmFjZV9jb21taXRfdHlwZSB7dmFybmFtZSBhcmdzfSB7CglnbG9iYWwgdWlfY29tbCBjb21taXRfdHlwZQoJc3dpdGNoIC1nbG9iIC0tICRjb21taXRfdHlwZSB7Cglpbml0aWFsICAgICAgIHtzZXQgdHh0IHtJbml0aWFsIENvbW1pdCBNZXNzYWdlOn19CglhbWVuZCAgICAgICAgIHtzZXQgdHh0IHtBbWVuZGVkIENvbW1pdCBNZXNzYWdlOn19CglhbWVuZC1pbml0aWFsIHtzZXQgdHh0IHtBbWVuZGVkIEluaXRpYWwgQ29tbWl0IE1lc3NhZ2U6fX0KCWFtZW5kLW1lcmdlICAge3NldCB0eHQge0FtZW5kZWQgTWVyZ2UgQ29tbWl0IE1lc3NhZ2U6fX0KCW1lcmdlICAgICAgICAge3NldCB0eHQge01lcmdlIENvbW1pdCBNZXNzYWdlOn19CgkqICAgICAgICAgICAgIHtzZXQgdHh0IHtDb21taXQgTWVzc2FnZTp9fQoJfQoJJHVpX2NvbWwgY29uZiAtdGV4dCAkdHh0Cn0KdHJhY2UgYWRkIHZhcmlhYmxlIGNvbW1pdF90eXBlIHdyaXRlIHRyYWNlX2NvbW1pdF90eXBlCnBhY2sgJHVpX2NvbWwgLXNpZGUgbGVmdCAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIuYW1lbmQgLXNpZGUgcmlnaHQKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLmhlYWRlci5uZXcgLXNpZGUgcmlnaHQKCnRleHQgJHVpX2NvbW0gLWJhY2tncm91bmQgd2hpdGUgLWJvcmRlcndpZHRoIDEgXAoJLXVuZG8gdHJ1ZSBcCgktbWF4dW5kbyAyMCBcCgktYXV0b3NlcGFyYXRvcnMgdHJ1ZSBcCgktcmVsaWVmIHN1bmtlbiBcCgktd2lkdGggNzUgLWhlaWdodCA5IC13cmFwIG5vbmUgXAoJLWZvbnQgZm9udF9kaWZmIFwKCS15c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5zYnkgc2V0fQpzY3JvbGxiYXIgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5zYnkgXAoJLWNvbW1hbmQgW2xpc3QgJHVpX2NvbW0geXZpZXddCnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlci5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuY29tbWFyZWEuYnVmZmVyLnNieSAtc2lkZSByaWdodCAtZmlsbCB5CnBhY2sgJHVpX2NvbW0gLXNpZGUgbGVmdCAtZmlsbCB5CnBhY2sgLnZwYW5lLmxvd2VyLmNvbW1hcmVhLmJ1ZmZlciAtc2lkZSBsZWZ0IC1maWxsIHkKCiMgLS0gQ29tbWl0IE1lc3NhZ2UgQnVmZmVyIENvbnRleHQgTWVudQojCnNldCBjdHhtIC52cGFuZS5sb3dlci5jb21tYXJlYS5idWZmZXIuY3R4bQptZW51ICRjdHhtIC10ZWFyb2ZmIDAKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtDdXR9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge3RrX3RleHRDdXQgJHVpX2NvbW19CiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q29weX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7dGtfdGV4dENvcHkgJHVpX2NvbW19CiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7UGFzdGV9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge3RrX3RleHRQYXN0ZSAkdWlfY29tbX0KJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtEZWxldGV9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQgeyR1aV9jb21tIGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3R9CiRjdHhtIGFkZCBzZXBhcmF0b3IKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTZWxlY3QgQWxsfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHtmb2N1cyAkdWlfY29tbTskdWlfY29tbSB0YWcgYWRkIHNlbCAwLjAgZW5kfQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHkgQWxsfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHsKCQkkdWlfY29tbSB0YWcgYWRkIHNlbCAwLjAgZW5kCgkJdGtfdGV4dENvcHkgJHVpX2NvbW0KCQkkdWlfY29tbSB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kCgl9CiRjdHhtIGFkZCBzZXBhcmF0b3IKJGN0eG0gYWRkIGNvbW1hbmQgXAoJLWxhYmVsIHtTaWduIE9mZn0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCBkb19zaWdub2ZmCmJpbmRfYnV0dG9uMyAkdWlfY29tbSAidGtfcG9wdXAgJGN0eG0gJVggJVkiCgojIC0tIERpZmYgSGVhZGVyCiMKcHJvYyB0cmFjZV9jdXJyZW50X2RpZmZfcGF0aCB7dmFybmFtZSBhcmdzfSB7CglnbG9iYWwgY3VycmVudF9kaWZmX3BhdGggZGlmZl9hY3Rpb25zIGZpbGVfc3RhdGVzCglpZiB7JGN1cnJlbnRfZGlmZl9wYXRoIGVxIHt9fSB7CgkJc2V0IHMge30KCQlzZXQgZiB7fQoJCXNldCBwIHt9CgkJc2V0IG8gZGlzYWJsZWQKCX0gZWxzZSB7CgkJc2V0IHAgJGN1cnJlbnRfZGlmZl9wYXRoCgkJc2V0IHMgW21hcGRlc2MgW2xpbmRleCAkZmlsZV9zdGF0ZXMoJHApIDBdICRwXQoJCXNldCBmIHtGaWxlOn0KCQlzZXQgcCBbZXNjYXBlX3BhdGggJHBdCgkJc2V0IG8gbm9ybWFsCgl9CgoJLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnN0YXR1cyBjb25maWd1cmUgLXRleHQgJHMKCS52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIGNvbmZpZ3VyZSAtdGV4dCAkZgoJLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnBhdGggY29uZmlndXJlIC10ZXh0ICRwCglmb3JlYWNoIHcgJGRpZmZfYWN0aW9ucyB7CgkJdXBsZXZlbCAjMCAkdyAkbwoJfQp9CnRyYWNlIGFkZCB2YXJpYWJsZSBjdXJyZW50X2RpZmZfcGF0aCB3cml0ZSB0cmFjZV9jdXJyZW50X2RpZmZfcGF0aAoKZnJhbWUgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyIC1iYWNrZ3JvdW5kIG9yYW5nZQpsYWJlbCAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIuc3RhdHVzIFwKCS1iYWNrZ3JvdW5kIG9yYW5nZSBcCgktd2lkdGggJG1heF9zdGF0dXNfZGVzYyBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdCBcCgktZm9udCBmb250X3VpCmxhYmVsIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5maWxlIFwKCS1iYWNrZ3JvdW5kIG9yYW5nZSBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdCBcCgktZm9udCBmb250X3VpCmxhYmVsIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5wYXRoIFwKCS1iYWNrZ3JvdW5kIG9yYW5nZSBcCgktYW5jaG9yIHcgXAoJLWp1c3RpZnkgbGVmdCBcCgktZm9udCBmb250X3VpCnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnN0YXR1cyAtc2lkZSBsZWZ0CnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLmZpbGUgLXNpZGUgbGVmdApwYWNrIC52cGFuZS5sb3dlci5kaWZmLmhlYWRlci5wYXRoIC1maWxsIHgKc2V0IGN0eG0gLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLmN0eG0KbWVudSAkY3R4bSAtdGVhcm9mZiAwCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q29weX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7CgkJY2xpcGJvYXJkIGNsZWFyCgkJY2xpcGJvYXJkIGFwcGVuZCBcCgkJCS1mb3JtYXQgU1RSSU5HIFwKCQkJLXR5cGUgU1RSSU5HIFwKCQkJLS0gJGN1cnJlbnRfZGlmZl9wYXRoCgl9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQpiaW5kX2J1dHRvbjMgLnZwYW5lLmxvd2VyLmRpZmYuaGVhZGVyLnBhdGggInRrX3BvcHVwICRjdHhtICVYICVZIgoKIyAtLSBEaWZmIEJvZHkKIwpmcmFtZSAudnBhbmUubG93ZXIuZGlmZi5ib2R5CnNldCB1aV9kaWZmIC52cGFuZS5sb3dlci5kaWZmLmJvZHkudAp0ZXh0ICR1aV9kaWZmIC1iYWNrZ3JvdW5kIHdoaXRlIC1ib3JkZXJ3aWR0aCAwIFwKCS13aWR0aCA4MCAtaGVpZ2h0IDE1IC13cmFwIG5vbmUgXAoJLWZvbnQgZm9udF9kaWZmIFwKCS14c2Nyb2xsY29tbWFuZCB7LnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnggc2V0fSBcCgkteXNjcm9sbGNvbW1hbmQgey52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J5IHNldH0gXAoJLXN0YXRlIGRpc2FibGVkCnNjcm9sbGJhciAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieCAtb3JpZW50IGhvcml6b250YWwgXAoJLWNvbW1hbmQgW2xpc3QgJHVpX2RpZmYgeHZpZXddCnNjcm9sbGJhciAudnBhbmUubG93ZXIuZGlmZi5ib2R5LnNieSAtb3JpZW50IHZlcnRpY2FsIFwKCS1jb21tYW5kIFtsaXN0ICR1aV9kaWZmIHl2aWV3XQpwYWNrIC52cGFuZS5sb3dlci5kaWZmLmJvZHkuc2J4IC1zaWRlIGJvdHRvbSAtZmlsbCB4CnBhY2sgLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5zYnkgLXNpZGUgcmlnaHQgLWZpbGwgeQpwYWNrICR1aV9kaWZmIC1zaWRlIGxlZnQgLWZpbGwgYm90aCAtZXhwYW5kIDEKcGFjayAudnBhbmUubG93ZXIuZGlmZi5oZWFkZXIgLXNpZGUgdG9wIC1maWxsIHgKcGFjayAudnBhbmUubG93ZXIuZGlmZi5ib2R5IC1zaWRlIGJvdHRvbSAtZmlsbCBib3RoIC1leHBhbmQgMQoKJHVpX2RpZmYgdGFnIGNvbmYgZF9jciAtZWxpZGUgdHJ1ZQokdWlfZGlmZiB0YWcgY29uZiBkX0AgLWZvcmVncm91bmQgYmx1ZSAtZm9udCBmb250X2RpZmZib2xkCiR1aV9kaWZmIHRhZyBjb25mIGRfKyAtZm9yZWdyb3VuZCB7IzAwYTAwMH0KJHVpX2RpZmYgdGFnIGNvbmYgZF8tIC1mb3JlZ3JvdW5kIHJlZAoKJHVpX2RpZmYgdGFnIGNvbmYgZF8rKyAtZm9yZWdyb3VuZCB7IzAwYTAwMH0KJHVpX2RpZmYgdGFnIGNvbmYgZF8tLSAtZm9yZWdyb3VuZCByZWQKJHVpX2RpZmYgdGFnIGNvbmYgZF8rcyBcCgktZm9yZWdyb3VuZCB7IzAwYTAwMH0gXAoJLWJhY2tncm91bmQgeyNlMmVmZmF9CiR1aV9kaWZmIHRhZyBjb25mIGRfLXMgXAoJLWZvcmVncm91bmQgcmVkIFwKCS1iYWNrZ3JvdW5kIHsjZTJlZmZhfQokdWlfZGlmZiB0YWcgY29uZiBkX3MrIFwKCS1mb3JlZ3JvdW5kIHsjMDBhMDAwfSBcCgktYmFja2dyb3VuZCBpdm9yeTEKJHVpX2RpZmYgdGFnIGNvbmYgZF9zLSBcCgktZm9yZWdyb3VuZCByZWQgXAoJLWJhY2tncm91bmQgaXZvcnkxCgokdWlfZGlmZiB0YWcgY29uZiBkPDw8PDw8PCBcCgktZm9yZWdyb3VuZCBvcmFuZ2UgXAoJLWZvbnQgZm9udF9kaWZmYm9sZAokdWlfZGlmZiB0YWcgY29uZiBkPT09PT09PSBcCgktZm9yZWdyb3VuZCBvcmFuZ2UgXAoJLWZvbnQgZm9udF9kaWZmYm9sZAokdWlfZGlmZiB0YWcgY29uZiBkPj4+Pj4+PiBcCgktZm9yZWdyb3VuZCBvcmFuZ2UgXAoJLWZvbnQgZm9udF9kaWZmYm9sZAoKJHVpX2RpZmYgdGFnIHJhaXNlIHNlbAoKIyAtLSBEaWZmIEJvZHkgQ29udGV4dCBNZW51CiMKc2V0IGN0eG0gLnZwYW5lLmxvd2VyLmRpZmYuYm9keS5jdHhtCm1lbnUgJGN0eG0gLXRlYXJvZmYgMAokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1JlZnJlc2h9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQgcmVzaG93X2RpZmYKbGFwcGVuZCBkaWZmX2FjdGlvbnMgW2xpc3QgJGN0eG0gZW50cnljb25mIFskY3R4bSBpbmRleCBsYXN0XSAtc3RhdGVdCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7Q29weX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7dGtfdGV4dENvcHkgJHVpX2RpZmZ9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1NlbGVjdCBBbGx9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge2ZvY3VzICR1aV9kaWZmOyR1aV9kaWZmIHRhZyBhZGQgc2VsIDAuMCBlbmR9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0NvcHkgQWxsfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHsKCQkkdWlfZGlmZiB0YWcgYWRkIHNlbCAwLjAgZW5kCgkJdGtfdGV4dENvcHkgJHVpX2RpZmYKCQkkdWlfZGlmZiB0YWcgcmVtb3ZlIHNlbCAwLjAgZW5kCgl9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7QXBwbHkvUmV2ZXJzZSBIdW5rfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHthcHBseV9odW5rICRjdXJzb3JYICRjdXJzb3JZfQpzZXQgdWlfZGlmZl9hcHBseWh1bmsgWyRjdHhtIGluZGV4IGxhc3RdCmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiAkdWlfZGlmZl9hcHBseWh1bmsgLXN0YXRlXQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7RGVjcmVhc2UgRm9udCBTaXplfSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHtpbmNyX2ZvbnRfc2l6ZSBmb250X2RpZmYgLTF9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge0luY3JlYXNlIEZvbnQgU2l6ZX0gXAoJLWZvbnQgZm9udF91aSBcCgktY29tbWFuZCB7aW5jcl9mb250X3NpemUgZm9udF9kaWZmIDF9CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgc2VwYXJhdG9yCiRjdHhtIGFkZCBjb21tYW5kIFwKCS1sYWJlbCB7U2hvdyBMZXNzIENvbnRleHR9IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQge2lmIHskcmVwb19jb25maWcoZ3VpLmRpZmZjb250ZXh0KSA+PSAyfSB7CgkJaW5jciByZXBvX2NvbmZpZyhndWkuZGlmZmNvbnRleHQpIC0xCgkJcmVzaG93X2RpZmYKCX19CmxhcHBlbmQgZGlmZl9hY3Rpb25zIFtsaXN0ICRjdHhtIGVudHJ5Y29uZiBbJGN0eG0gaW5kZXggbGFzdF0gLXN0YXRlXQokY3R4bSBhZGQgY29tbWFuZCBcCgktbGFiZWwge1Nob3cgTW9yZSBDb250ZXh0fSBcCgktZm9udCBmb250X3VpIFwKCS1jb21tYW5kIHsKCQlpbmNyIHJlcG9fY29uZmlnKGd1aS5kaWZmY29udGV4dCkKCQlyZXNob3dfZGlmZgoJfQpsYXBwZW5kIGRpZmZfYWN0aW9ucyBbbGlzdCAkY3R4bSBlbnRyeWNvbmYgWyRjdHhtIGluZGV4IGxhc3RdIC1zdGF0ZV0KJGN0eG0gYWRkIHNlcGFyYXRvcgokY3R4bSBhZGQgY29tbWFuZCAtbGFiZWwge09wdGlvbnMuLi59IFwKCS1mb250IGZvbnRfdWkgXAoJLWNvbW1hbmQgZG9fb3B0aW9ucwpiaW5kX2J1dHRvbjMgJHVpX2RpZmYgIgoJc2V0IGN1cnNvclggJXgKCXNldCBjdXJzb3JZICV5CglpZiB7XCR1aV9pbmRleCBlcSBcJGN1cnJlbnRfZGlmZl9zaWRlfSB7CgkJJGN0eG0gZW50cnljb25mICR1aV9kaWZmX2FwcGx5aHVuayAtbGFiZWwge1Vuc3RhZ2UgSHVuayBGcm9tIENvbW1pdH0KCX0gZWxzZSB7CgkJJGN0eG0gZW50cnljb25mICR1aV9kaWZmX2FwcGx5aHVuayAtbGFiZWwge1N0YWdlIEh1bmsgRm9yIENvbW1pdH0KCX0KCXRrX3BvcHVwICRjdHhtICVYICVZCiIKdW5zZXQgdWlfZGlmZl9hcHBseWh1bmsKCiMgLS0gU3RhdHVzIEJhcgojCmxhYmVsIC5zdGF0dXMgLXRleHR2YXJpYWJsZSB1aV9zdGF0dXNfdmFsdWUgXAoJLWFuY2hvciB3IFwKCS1qdXN0aWZ5IGxlZnQgXAoJLWJvcmRlcndpZHRoIDEgXAoJLXJlbGllZiBzdW5rZW4gXAoJLWZvbnQgZm9udF91aQpwYWNrIC5zdGF0dXMgLWFuY2hvciB3IC1zaWRlIGJvdHRvbSAtZmlsbCB4CgojIC0tIExvYWQgZ2VvbWV0cnkKIwpjYXRjaCB7CnNldCBnbSAkcmVwb19jb25maWcoZ3VpLmdlb21ldHJ5KQp3bSBnZW9tZXRyeSAuIFtsaW5kZXggJGdtIDBdCi52cGFuZSBzYXNoIHBsYWNlIDAgXAoJW2xpbmRleCBbLnZwYW5lIHNhc2ggY29vcmQgMF0gMF0gXAoJW2xpbmRleCAkZ20gMV0KLnZwYW5lLmZpbGVzIHNhc2ggcGxhY2UgMCBcCglbbGluZGV4ICRnbSAyXSBcCglbbGluZGV4IFsudnBhbmUuZmlsZXMgc2FzaCBjb29yZCAwXSAxXQp1bnNldCBnbQp9CgojIC0tIEtleSBCaW5kaW5ncwojCmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LVJldHVybj4ge2RvX2NvbW1pdDticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktaT4ge2RvX2FkZF9hbGw7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LUk+IHtkb19hZGRfYWxsO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS14PiB7dGtfdGV4dEN1dCAlVzticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktWD4ge3RrX3RleHRDdXQgJVc7YnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LWM+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktQz4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS12PiB7dGtfdGV4dFBhc3RlICVXOyAlVyBzZWUgaW5zZXJ0OyBicmVha30KYmluZCAkdWlfY29tbSA8JE0xQi1LZXktVj4ge3RrX3RleHRQYXN0ZSAlVzsgJVcgc2VlIGluc2VydDsgYnJlYWt9CmJpbmQgJHVpX2NvbW0gPCRNMUItS2V5LWE+IHslVyB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrfQpiaW5kICR1aV9jb21tIDwkTTFCLUtleS1BPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KCmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LXg+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktWD4ge3RrX3RleHRDb3B5ICVXO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1jPiB7dGtfdGV4dENvcHkgJVc7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LUM+IHt0a190ZXh0Q29weSAlVzticmVha30KYmluZCAkdWlfZGlmZiA8JE0xQi1LZXktdj4ge2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1WPiB7YnJlYWt9CmJpbmQgJHVpX2RpZmYgPCRNMUItS2V5LWE+IHslVyB0YWcgYWRkIHNlbCAwLjAgZW5kO2JyZWFrfQpiaW5kICR1aV9kaWZmIDwkTTFCLUtleS1BPiB7JVcgdGFnIGFkZCBzZWwgMC4wIGVuZDticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LVVwPiAgICAge2NhdGNoIHslVyB5dmlldyBzY3JvbGwgLTEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxLZXktRG93bj4gICB7Y2F0Y2ggeyVXIHl2aWV3IHNjcm9sbCAgMSB1bml0c307YnJlYWt9CmJpbmQgJHVpX2RpZmYgPEtleS1MZWZ0PiAgIHtjYXRjaCB7JVcgeHZpZXcgc2Nyb2xsIC0xIHVuaXRzfTticmVha30KYmluZCAkdWlfZGlmZiA8S2V5LVJpZ2h0PiAge2NhdGNoIHslVyB4dmlldyBzY3JvbGwgIDEgdW5pdHN9O2JyZWFrfQpiaW5kICR1aV9kaWZmIDxCdXR0b24tMT4gICB7Zm9jdXMgJVd9CgppZiB7W2lzX2VuYWJsZWQgYnJhbmNoXX0gewoJYmluZCAuIDwkTTFCLUtleS1uPiBkb19jcmVhdGVfYnJhbmNoCgliaW5kIC4gPCRNMUItS2V5LU4+IGRvX2NyZWF0ZV9icmFuY2gKfQoKYmluZCBhbGwgPEtleS1GNT4gZG9fcmVzY2FuCmJpbmQgYWxsIDwkTTFCLUtleS1yPiBkb19yZXNjYW4KYmluZCBhbGwgPCRNMUItS2V5LVI+IGRvX3Jlc2NhbgpiaW5kIC4gICA8JE0xQi1LZXktcz4gZG9fc2lnbm9mZgpiaW5kIC4gICA8JE0xQi1LZXktUz4gZG9fc2lnbm9mZgpiaW5kIC4gICA8JE0xQi1LZXktaT4gZG9fYWRkX2FsbApiaW5kIC4gICA8JE0xQi1LZXktST4gZG9fYWRkX2FsbApiaW5kIC4gICA8JE0xQi1LZXktUmV0dXJuPiBkb19jb21taXQKZm9yZWFjaCBpIFtsaXN0ICR1aV9pbmRleCAkdWlfd29ya2Rpcl0gewoJYmluZCAkaSA8QnV0dG9uLTE+ICAgICAgICJ0b2dnbGVfb3JfZGlmZiAgICAgICAgICRpICV4ICV5OyBicmVhayIKCWJpbmQgJGkgPCRNMUItQnV0dG9uLTE+ICAiYWRkX29uZV90b19zZWxlY3Rpb24gICAkaSAleCAleTsgYnJlYWsiCgliaW5kICRpIDxTaGlmdC1CdXR0b24tMT4gImFkZF9yYW5nZV90b19zZWxlY3Rpb24gJGkgJXggJXk7IGJyZWFrIgp9CnVuc2V0IGkKCnNldCBmaWxlX2xpc3RzKCR1aV9pbmRleCkgW2xpc3RdCnNldCBmaWxlX2xpc3RzKCR1aV93b3JrZGlyKSBbbGlzdF0KCndtIHRpdGxlIC4gIlthcHBuYW1lXSAoW2ZpbGUgbm9ybWFsaXplIFtmaWxlIGRpcm5hbWUgW2dpdGRpcl1dXSkiCmZvY3VzIC1mb3JjZSAkdWlfY29tbQoKIyAtLSBXYXJuIHRoZSB1c2VyIGFib3V0IGVudmlyb25tZW50YWwgcHJvYmxlbXMuICBDeWd3aW4ncyBUY2wKIyAgICBkb2VzICpub3QqIHBhc3MgaXRzIGVudiBhcnJheSBvbnRvIGFueSBwcm9jZXNzZXMgaXQgc3Bhd25zLgojICAgIFRoaXMgbWVhbnMgdGhhdCBnaXQgcHJvY2Vzc2VzIGdldCBub25lIG9mIG91ciBlbnZpcm9ubWVudC4KIwppZiB7W2lzX0N5Z3dpbl19IHsKCXNldCBpZ25vcmVkX2VudiAwCglzZXQgc3VnZ2VzdF91c2VyIHt9CglzZXQgbXNnICJQb3NzaWJsZSBlbnZpcm9ubWVudCBpc3N1ZXMgZXhpc3QuCgpUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcHJvYmFibHkKZ29pbmcgdG8gYmUgaWdub3JlZCBieSBhbnkgR2l0IHN1YnByb2Nlc3MgcnVuCmJ5IFthcHBuYW1lXToKCiIKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgZW52XSB7CgkJc3dpdGNoIC1yZWdleHAgLS0gJG5hbWUgewoJCXteR0lUX0lOREVYX0ZJTEUkfSAtCgkJe15HSVRfT0JKRUNUX0RJUkVDVE9SWSR9IC0KCQl7XkdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTJH0gLQoJCXteR0lUX0RJRkZfT1BUUyR9IC0KCQl7XkdJVF9FWFRFUk5BTF9ESUZGJH0gLQoJCXteR0lUX1BBR0VSJH0gLQoJCXteR0lUX1RSQUNFJH0gLQoJCXteR0lUX0NPTkZJRyR9IC0KCQl7XkdJVF9DT05GSUdfTE9DQUwkfSAtCgkJe15HSVRfKEFVVEhPUnxDT01NSVRURVIpX0RBVEUkfSB7CgkJCWFwcGVuZCBtc2cgIiAtICRuYW1lXG4iCgkJCWluY3IgaWdub3JlZF9lbnYKCQl9CgkJe15HSVRfKEFVVEhPUnxDT01NSVRURVIpXyhOQU1FfEVNQUlMKSR9IHsKCQkJYXBwZW5kIG1zZyAiIC0gJG5hbWVcbiIKCQkJaW5jciBpZ25vcmVkX2VudgoJCQlzZXQgc3VnZ2VzdF91c2VyICRuYW1lCgkJfQoJCX0KCX0KCWlmIHskaWdub3JlZF9lbnYgPiAwfSB7CgkJYXBwZW5kIG1zZyAiClRoaXMgaXMgZHVlIHRvIGEga25vd24gaXNzdWUgd2l0aCB0aGUKVGNsIGJpbmFyeSBkaXN0cmlidXRlZCBieSBDeWd3aW4uIgoKCQlpZiB7JHN1Z2dlc3RfdXNlciBuZSB7fX0gewoJCQlhcHBlbmQgbXNnICIKCkEgZ29vZCByZXBsYWNlbWVudCBmb3IgJHN1Z2dlc3RfdXNlcgppcyBwbGFjaW5nIHZhbHVlcyBmb3IgdGhlIHVzZXIubmFtZSBhbmQKdXNlci5lbWFpbCBzZXR0aW5ncyBpbnRvIHlvdXIgcGVyc29uYWwKfi8uZ2l0Y29uZmlnIGZpbGUuCiIKCQl9CgkJd2Fybl9wb3B1cCAkbXNnCgl9Cgl1bnNldCBpZ25vcmVkX2VudiBtc2cgc3VnZ2VzdF91c2VyIG5hbWUKfQoKIyAtLSBPbmx5IGluaXRpYWxpemUgY29tcGxleCBVSSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RheSBydW5uaW5nLgojCmlmIHtbaXNfZW5hYmxlZCB0cmFuc3BvcnRdfSB7Cglsb2FkX2FsbF9yZW1vdGVzCglsb2FkX2FsbF9oZWFkcwoKCXBvcHVsYXRlX2JyYW5jaF9tZW51Cglwb3B1bGF0ZV9mZXRjaF9tZW51Cglwb3B1bGF0ZV9wdXNoX21lbnUKfQoKIyAtLSBPbmx5IHN1Z2dlc3QgYSBnYyBydW4gaWYgd2UgYXJlIGdvaW5nIHRvIHN0YXkgcnVubmluZy4KIwppZiB7W2lzX2VuYWJsZWQgbXVsdGljb21taXRdfSB7CglzZXQgb2JqZWN0X2xpbWl0IDIwMDAKCWlmIHtbaXNfV2luZG93c119IHtzZXQgb2JqZWN0X2xpbWl0IDIwMH0KCXJlZ2V4cCB7XihbMC05XSspIG9iamVjdHMsfSBbZ2l0IGNvdW50LW9iamVjdHNdIF9qdW5rIG9iamVjdHNfY3VycmVudAoJaWYgeyRvYmplY3RzX2N1cnJlbnQgPj0gJG9iamVjdF9saW1pdH0gewoJCWlmIHtbYXNrX3BvcHVwIFwKCQkJIlRoaXMgcmVwb3NpdG9yeSBjdXJyZW50bHkgaGFzICRvYmplY3RzX2N1cnJlbnQgbG9vc2Ugb2JqZWN0cy4KClRvIG1haW50YWluIG9wdGltYWwgcGVyZm9ybWFuY2UgaXQgaXMgc3Ryb25nbHkKcmVjb21tZW5kZWQgdGhhdCB5b3UgY29tcHJlc3MgdGhlIGRhdGFiYXNlCndoZW4gbW9yZSB0aGFuICRvYmplY3RfbGltaXQgbG9vc2Ugb2JqZWN0cyBleGlzdC4KCkNvbXByZXNzIHRoZSBkYXRhYmFzZSBub3c/Il0gZXEgeWVzfSB7CgkJCWRvX2djCgkJfQoJfQoJdW5zZXQgb2JqZWN0X2xpbWl0IF9qdW5rIG9iamVjdHNfY3VycmVudAp9Cgpsb2NrX2luZGV4IGJlZ2luLXJlYWQKYWZ0ZXIgMSBkb19yZXNjYW4K