IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICAgICAgICAgICAgICAgICAgICBDQURFTkNFIENPUFlSSUdIVCBOT1RJQ0UKIyAgICAgICAgIKkgMjAwOC0yMDA5IENhZGVuY2UgRGVzaWduIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBGb3VuZGF0aW9uIEZsb3cgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcGVyZm9ybSBzcGVjaWFsaXplZAojIHRhc2tzIHdpdGhpbiBJbm5vdnVzIFN5c3RlbS4KIwojIFRoaXMgd29yayBtYXkgbm90IGJlIGNvcGllZCwgcmUtcHVibGlzaGVkLCB1cGxvYWRlZCwgb3IgZGlzdHJpYnV0ZWQgaW4gYW55IHdheSwKIyBpbiBhbnkgbWVkaXVtLCB3aGV0aGVyIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uCiMgZnJvbSBDYWRlbmNlLiBOb3R3aXRoc3RhbmRpbmcgYW55IHJlc3RyaWN0aW9ucyBoZXJlaW4sIHN1YmplY3QgdG8gY29tcGxpYW5jZQojIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDYWRlbmNlIHNvZnR3YXJlIGxpY2Vuc2UgYWdyZWVtZW50IHVuZGVyCiMgd2hpY2ggdGhpcyBtYXRlcmlhbCB3YXMgcHJvdmlkZWQsIHRoaXMgbWF0ZXJpYWwgbWF5IGJlIGNvcGllZCBhbmQgaW50ZXJuYWxseQojIGRpc3RyaWJ1dGVkIHNvbGVseSBmb3IgaW50ZXJuYWwgcHVycG9zZXMgZm9yIHVzZSB3aXRoIENhZGVuY2UgdG9vbHMuCiMKIyBUaGlzIHdvcmsgaXMgQ2FkZW5jZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIG1heSB1bmRlciBubyBjaXJjdW1zdGFuY2VzIGJlCiMgZ2l2ZW4gdG8gdGhpcmQgcGFydGllcywgbmVpdGhlciBpbiBvcmlnaW5hbCBub3IgaW4gbW9kaWZpZWQgdmVyc2lvbnMsIHdpdGhvdXQKIyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBDYWRlbmNlLiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcwojIHRoZSBwcm9wcmlldGFyeSBhbmQgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIG9mIENhZGVuY2Ugb3IgaXRzIGxpY2Vuc29ycywgYW5kCiMgaXMgc3VwcGxpZWQgc3ViamVjdCB0bywgYW5kIG1heSBiZSB1c2VkIG9ubHkgYnkgQ2FkZW5jZSdzIGN1cnJlbnQgY3VzdG9tZXJzCiMgaW4gYWNjb3JkYW5jZSB3aXRoLCBhIHByZXZpb3VzbHkgZXhlY3V0ZWQgbGljZW5zZSBhZ3JlZW1lbnQgYmV0d2VlbiBDYWRlbmNlCiMgYW5kIGl0cyBjdXN0b21lci4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVEhJUyBNQVRFUklBTCBJUyBQUk9WSURFRCBCWSBDQURFTkNFICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKIyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgojIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCiMgSU4gTk8gRVZFTlQgU0hBTEwgQ0FERU5DRSBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMCiMgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTICBNQVRFUklBTCwgRVZFTiBJRgojIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpnbG9iYWwgZW52IAoKaWYgeyFbaW5mbyBleGlzdHMgZW52KFZQQVRIKV19IHsKICAgc2V0IGVudihWUEFUSCkgIi4vbWFrZSIKfQoKaWYgeyFbaW5mbyBleGlzdHMgdmFyc119IHsKICAgc291cmNlIEZGL3ZhcnMudGNsCn0KZm9yZWFjaCBmaWxlICR2YXJzKGNvbmZpZ19maWxlcykgewogICBzb3VyY2UgJGZpbGUKfQoKc2V0IHZhcnMoY29kZWdlbikgZmFsc2UKCmlmIHtbaW5mbyBleGlzdHMgZW52KEZGX1NUQVJUKV19IHsKICAgaWYge1tmaWxlIGV4aXN0cyAkZW52KFZQQVRIKS8kZW52KEZGX1NUQVJUKV19IHsKICAgICAgZXhlYyBybSAkZW52KFZQQVRIKS8kZW52KEZGX1NUQVJUKQogICB9CiAgIHNldCBzdGFydF9zdGVwICRlbnYoRkZfU1RBUlQpCn0gZWxzZSB7CiAgIHNldCBzdGFydF9zdGVwIGluaXQKfQppZiB7W2luZm8gZXhpc3RzIGVudihGRl9TVE9QKV19IHsKICAgc2V0IHN0b3Bfc3RlcCAkZW52KEZGX1NUT1ApCn0gZWxzZSB7CiAgIHNldCBzdG9wX3N0ZXAgc2lnbm9mZgp9Cgpzb3VyY2UgJHZhcnMoc2NyaXB0X3Jvb3QpL0lOTk9WVVMvcHJvY3MudGNsCgpzZXQgc3RlcF9saXN0ICR2YXJzKGJzdGVwcykKCnNldCB0aW1lIDAKc2V0IGluZGV4IDAKZm9yZWFjaCBzdGVwICRzdGVwX2xpc3QgewogICBpZiB7W2ZpbGUgZXhpc3RzICRlbnYoVlBBVEgpLyRzdGVwXX0gewogICAgICBpZiB7W2ZpbGUgbXRpbWUgJGVudihWUEFUSCkvJHN0ZXBdID4gJHRpbWV9IHsKICAgICAgICAgaWYge1tsaW5kZXggJHN0ZXBfbGlzdCAkaW5kZXhdID09ICJzaWdub2ZmIn0gewogICAgICAgICAgICBQdXRzICI8RkY+IFN0ZXAgc2lnbm9mZiBjb21wbGV0ZSAuLi4gbm90aGluZyB0byBkbyIKICAgICAgICAgICAgZXhpdAogICAgICAgICB9IGVsc2UgeyAKICAgICAgICAgICAgc2V0IHN0YXJ0X3N0ZXAgW2xpbmRleCAkc3RlcF9saXN0IFtleHByICRpbmRleCArIDFdXQogICAgICAgICB9CiAgICAgIH0KICAgfSBlbHNlIHsKICAgICAgc2V0IHN0YXJ0X3N0ZXAgJHN0ZXAKICAgICAgYnJlYWsKICAgfQogICBpbmNyIGluZGV4Cn0KCmlmIHtbbHNlYXJjaCAkc3RlcF9saXN0ICRzdGFydF9zdGVwXSA+IFtsc2VhcmNoICRzdGVwX2xpc3QgJHN0b3Bfc3RlcF19IHsKICAgUHV0cyAiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgUHV0cyAiPEZGPiAkc3RvcF9zdGVwIHN0ZXAgaXMgdXAgdG8gZGF0ZSIKICAgUHV0cyAiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgZXhpdAp9ClB1dHMgIjxGRj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCmlmIHskc3RhcnRfc3RlcCA9PSAkc3RvcF9zdGVwfSB7CiAgIFB1dHMgIjxGRj4gUlVOTklORyBTVEVQICRzdGFydF9zdGVwIC4uLiIKfSBlbHNlIHsgCiAgIFB1dHMgIjxGRj4gUlVOTklORyBTVEVQICRzdGFydF9zdGVwIHRocm91Z2ggJHN0b3Bfc3RlcCAuLi4iCn0KUHV0cyAiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKc2xlZXAgNQoKaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNjcmlwdF9yb290KV19IHsKICAgc291cmNlICR2YXJzKHNjcmlwdF9yb290KS9JTk5PVlVTL3Byb2NzLnRjbAogICBzb3VyY2UgJHZhcnMoc2NyaXB0X3Jvb3QpL0VUQy91dGlscy50Y2wKIyAgIHNvdXJjZSAkdmFycyhzY3JpcHRfcm9vdCkvRVRDL0lOTk9WVVMvdXRpbHMudGNsCn0gZWxzZSAgewogICBQdXRzICI8RkY+IEVSUk9SOiB2YXJzKHNjcmlwdF9yb290KSBub3QgZGVmaW5lZCAuLi4gcGxlYXNlIGRlZmluZSB5b3VyIGluIHNldHVwLnRjbCIKICAgZXhpdCAxCn0KCnNldCBmb3VuZCAwCnNldCBpbmRleCAwCnNldCBwcm9jX2xpc3QgW2xpc3RdIApmb3JlYWNoIHN0ZXAgJHN0ZXBfbGlzdCB7CiAgIGlmIHskc3RlcCA9PSAkc3RhcnRfc3RlcH0gewogICAgICBzZXQgdmFycyhzdGVwKSAkc3RlcAogICAgICBldmFsICI6OkZGX0VESTo6aW5pdGlhbGl6ZV9mbG93IgogICAgICBpZiB7JHN0ZXAgPT0gImluaXQifSB7CiAgICAgICAgIGV2YWwgOjpGRl9FREk6OnJ1bl9pbml0IDAKICAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0IG5leHRfc3RlcCBbbGluZGV4ICRzdGVwX2xpc3QgW2V4cHIgJGluZGV4LTFdXQogICAgICAgICBpZiB7ISR2YXJzKGZpeF9ob2xkKX0gewogICAgICAgICAgICBzd2l0Y2ggJHN0ZXAgewogICAgICAgICAgICAgICAicm91dGUiIHsgc2V0IG5leHRfc3RlcCAicG9zdGN0cyIgfQogICAgICAgICAgICAgICAicG9zdHJvdXRlX3NpIiB7IHNldCBuZXh0X3N0ZXAgInBvc3Ryb3V0ZSIgfQogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXZhbCAiOjpGRl9FREk6OmxvYWRfZGVzaWduIDAgJG5leHRfc3RlcCIKICAgICAgICAgZXZhbCAiOjpGRl9FREk6OnJ1bl8kc3RlcCAwIgogICAgICB9CiAgICAgIGV2YWwgIjo6RkZfRURJOjpzYXZlX3Jlc3VsdHMgMCAkc3RlcCIKICAgICAgaWYgeyRzdGVwID09ICRzdG9wX3N0ZXB9IHsKICAgICAgICAgUHV0cyAiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICBQdXRzICI8RkY+ICAgICAgICAgIEZPVU5EQVRJT04gRkxPVyBDT01QTEVURSIKICAgICAgICAgUHV0cyAiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICBleGl0CiAgICAgIH0KICAgICAgc2V0IGZvdW5kIDEKICAgfSBlbHNlIHsKICAgICAgaWYgeyRmb3VuZH0gewogICAgICAgICBldmFsICI6OkZGX0VESTo6cnVuXyRzdGVwIDAiCiAgICAgICAgIGV2YWwgIjo6RkZfRURJOjpzYXZlX3Jlc3VsdHMgMCAkc3RlcCIKICAgICAgICAgaWYgeyRzdGVwID09ICRzdG9wX3N0ZXB9IHsKICAgICAgICAgICAgUHV0cyAiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICAgICBQdXRzICI8RkY+ICAgICAgICAgIEZPVU5EQVRJT04gRkxPVyBDT01QTEVURSIKICAgICAgICAgICAgUHV0cyAiPEZGPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogICAgICAgICAgICBzZXQgZm91bmQgMAogICAgICAgICB9IAogICAgICB9IAogICB9CiAgIGluY3IgaW5kZXggICAKfQoKZXhpdAo=