IyEvYmluL3NoCiMKIyBTY3JpcHQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIFdJTkVQUkVGSVggZGlyZWN0b3J5CiMKIyBDb3B5cmlnaHQgMTk5OSBPdmUgS+V2ZW4KIyBDb3B5cmlnaHQgMjAwNCBDaHJpcyBNb3JnYW4KIyBDb3B5cmlnaHQgMjAwNCBBbGV4YW5kcmUgSnVsbGlhcmQKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQojCgp1c2FnZSgpCnsKICAgIGVjaG8gIlVzYWdlOiAkMCBbb3B0aW9uc10iCiAgICBlY2hvICIiCiAgICBlY2hvICJPcHRpb25zOiIKICAgIGVjaG8gIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIG1lc3NhZ2UiCiAgICBlY2hvICIgICAgICAtLXByZWZpeCA8ZGlyPiAgICAgICAgIERpcmVjdG9yeSB0byBjcmVhdGUgKGRlZmF1bHQ6IFwkV0lORVBSRUZJWCBvciB+Ly53aW5lKSIKICAgIGVjaG8gIiAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgRG9uJ3QgcHJpbnQgc3RhdHVzIG1lc3NhZ2VzIgogICAgZWNobyAiICAgICAgLS11c2Utd2luZS10cmVlIDxkaXI+ICBSdW4gZnJvbSB0aGUgV2luZSBidWlsZCB0cmVlIDxkaXI+IgogICAgZWNobyAiICAtdywgLS13YWl0ICAgICAgICAgICAgICAgICBXYWl0IGZvciB0aGUgd2luZXNlcnZlciB0byBleGl0IGJlZm9yZSByZXR1cm5pbmciCiAgICBlY2hvICIiCn0KCnNldCAtZQoKZGxsZGlyPSJAZGxsZGlyQCIKZGF0YWRpcj0iQGRhdGFkaXJAL3dpbmUiCgpkb193YWl0PTAKcXVpZXQ9MAoKd2hpbGUgWyAkIyAtZ3QgMCBdCmRvCiAgICBjYXNlICIkMSIgaW4KICAgICAgICAtaHwtLWhlbHApCiAgICAgICAgICAgIHVzYWdlCiAgICAgICAgICAgIGV4aXQgMAogICAgICAgICAgICA7OwogICAgICAgIC0tcHJlZml4KQogICAgICAgICAgICBXSU5FUFJFRklYPSIkMiIKICAgICAgICAgICAgc2hpZnQgMgogICAgICAgICAgICA7OwogICAgICAgIC1xfC0tcXVpZXQpCiAgICAgICAgICAgIHF1aWV0PTEKICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgOzsKICAgICAgICAtd3wtLXdhaXQpCiAgICAgICAgICAgIGRvX3dhaXQ9MQogICAgICAgICAgICBzaGlmdAogICAgICAgICAgICA7OwogICAgICAgIC0tdXNlLXdpbmUtdHJlZSkKICAgICAgICAgICAgdG9wZGlyPWBjZCAiJDIiICYmIHB3ZGAKICAgICAgICAgICAgaWYgWyAteCAiJHRvcGRpci9zZXJ2ZXIvd2luZXNlcnZlciIgXQogICAgICAgICAgICB0aGVuCiAgICAgICAgICAgICAgICBXSU5FTE9BREVSPSIkdG9wZGlyL3dpbmUiCiAgICAgICAgICAgICAgICBXSU5FU0VSVkVSPSIkdG9wZGlyL3NlcnZlci93aW5lc2VydmVyIgogICAgICAgICAgICAgICAgaWYgWyAtbiAiJExEX0xJQlJBUllfUEFUSCIgXQogICAgICAgICAgICAgICAgdGhlbgogICAgICAgICAgICAgICAgICAgIExEX0xJQlJBUllfUEFUSD0iJHRvcGRpci9saWJzOiRMRF9MSUJSQVJZX1BBVEgiCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgTERfTElCUkFSWV9QQVRIPSIkdG9wZGlyL2xpYnMiCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAoKICAgICAgICAgICAgICAgICMgZmluZCB0aGUgc291cmNlIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgbGluaz1gcmVhZGxpbmsgIiRXSU5FTE9BREVSImAKICAgICAgICAgICAgICAgIGlmIFsgLXogIiRsaW5rIiBdCiAgICAgICAgICAgICAgICB0aGVuCiAgICAgICAgICAgICAgICAgICAgdG9wc3JjZGlyPSIkdG9wZGlyIgogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGxpbms9YGRpcm5hbWUgIiRsaW5rImAKICAgICAgICAgICAgICAgICAgICBjYXNlICIkbGluayIgaW4KICAgICAgICAgICAgICAgICAgICAgICAgLyopIHRvcHNyY2Rpcj1gY2QgIiRsaW5rLy4uIiAmJiBwd2RgIDs7CiAgICAgICAgICAgICAgICAgICAgICAgICAqKSB0b3BzcmNkaXI9YGNkICIkdG9wZGlyLyRsaW5rLy4uIiAmJiBwd2RgIDs7CiAgICAgICAgICAgICAgICAgICAgZXNhYwogICAgICAgICAgICAgICAgZmkKCiAgICAgICAgICAgICAgICBkbGxkaXI9IiR0b3BkaXIvcHJvZ3JhbXMiCiAgICAgICAgICAgICAgICBkYXRhZGlyPSIkdG9wc3JjZGlyL3Rvb2xzIgogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBlY2hvICIkMiBpcyBub3QgYSB2YWxpZCBXaW5lIGJ1aWxkIHRyZWUiCiAgICAgICAgICAgICAgICBleGl0IDEKICAgICAgICAgICAgZmkKICAgICAgICAgICAgc2hpZnQgMgogICAgICAgICAgICA7OwogICAgICAgICopCiAgICAgICAgICAgIGVjaG8gIlVua25vd24gb3B0aW9uICQxIgogICAgICAgICAgICB1c2FnZQogICAgICAgICAgICBleGl0IDEKICAgICAgICAgICAgOzsKICBlc2FjCmRvbmUKCldJTkVQUkVGSVg9IiR7V0lORVBSRUZJWDotJEhPTUUvLndpbmV9IgoKaWYgWyAtZCAiJFdJTkVQUkVGSVgiIF0gfHwgbWtkaXIgIiRXSU5FUFJFRklYIjsgdGhlbiA6CmVsc2UKICAgIGVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgJFdJTkVQUkVGSVgsIGFib3J0aW5nIgogICAgZXhpdCAxCmZpCgpXSU5FUFJFRklYPWBjZCAiJFdJTkVQUkVGSVgiICYmIHB3ZGAKCiMgQ3JlYXRlIHRoZSBkcml2ZSBzeW1saW5rcwoKaWYgWyAhIC1kICIkV0lORVBSRUZJWC9kb3NkZXZpY2VzIiBdCnRoZW4KICAgIG1rZGlyICIkV0lORVBSRUZJWC9kb3NkZXZpY2VzIgogICAgWyAtZCAiJFdJTkVQUkVGSVgvZHJpdmVfYyIgXSB8fCBta2RpciAiJFdJTkVQUkVGSVgvZHJpdmVfYyIKICAgIGxuIC1zICIuLi9kcml2ZV9jIiAiJFdJTkVQUkVGSVgvZG9zZGV2aWNlcy9jOiIKICAgIGxuIC1zICIvIiAiJFdJTkVQUkVGSVgvZG9zZGV2aWNlcy96OiIKZmkKCkNST09UPSIkV0lORVBSRUZJWC9kb3NkZXZpY2VzL2M6IgoKIyBDcmVhdGUgdGhlIGRpcmVjdG9yeSB0cmVlCgpmb3IgaSBpbiBcCiAgICAiJENST09UL3dpbmRvd3MiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9jb21tYW5kIiBcCiAgICAiJENST09UL3dpbmRvd3MvZm9udHMiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9pbmYiIFwKICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iIFwKICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMiIgXAogICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2RyaXZlcnMiIFwKICAgICIkQ1JPT1Qvd2luZG93cy90ZW1wIgpkbwogICAgWyAtZCAiJGkiIF0gfHwgbWtkaXIgIiRpIgpkb25lCgojIENyZWF0ZSB0aGUgYXBwbGljYXRpb24gc3ltbGlua3MKCmxpbmtfYXBwKCkKewogICAgaWYgWyAhIC1mICIkMiIgXQogICAgdGhlbgogICAgICAgICMgbWFrZSBhIGNvcHkgaWYgdGhlIG9yaWdpbmFsIGlzIHdyaXRhYmxlCiAgICAgICAgaWYgWyAtdyAiJGRsbGRpci8kMS5leGUuc28iIF0KICAgICAgICB0aGVuCiAgICAgICAgICAgIGNwICIkZGxsZGlyLyQxLmV4ZS5zbyIgIiQyIiB8fCBlY2hvICJXYXJuaW5nOiBmYWlsZWQgdG8gY3JlYXRlICQyIgogICAgICAgIGVsc2UKICAgICAgICAgICAgbG4gLXMgIiRkbGxkaXIvJDEuZXhlLnNvIiAiJDIiIHx8IGVjaG8gIldhcm5pbmc6IGZhaWxlZCB0byBjcmVhdGUgJDIiCiAgICAgICAgZmkKICAgIGZpCn0KCmxpbmtfYXBwIHN0YXJ0ICAgICAgICAiJENST09UL3dpbmRvd3MvY29tbWFuZC9zdGFydC5leGUiCmxpbmtfYXBwIG5vdGVwYWQgICAgICAiJENST09UL3dpbmRvd3Mvbm90ZXBhZC5leGUiCmxpbmtfYXBwIHJlZ2VkaXQgICAgICAiJENST09UL3dpbmRvd3MvcmVnZWRpdC5leGUiCmxpbmtfYXBwIHJ1bmRsbDMyICAgICAiJENST09UL3dpbmRvd3MvcnVuZGxsMzIuZXhlIgpsaW5rX2FwcCB3Y21kICAgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL3djbWQuZXhlIgpsaW5rX2FwcCBjb250cm9sICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2NvbnRyb2wuZXhlIgpsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2hlbHAuZXhlIgpsaW5rX2FwcCBtc2lleGVjICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL21zaWV4ZWMuZXhlIgpsaW5rX2FwcCBub3RlcGFkICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL25vdGVwYWQuZXhlIgpsaW5rX2FwcCBwcm9nbWFuICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL3Byb2dtYW4uZXhlIgpsaW5rX2FwcCByZWdzdnIzMiAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL3JlZ3N2cjMyLmV4ZSIKbGlua19hcHAgd2luZW1pbmUgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi93aW5taW5lLmV4ZSIKbGlua19hcHAgd2ludmVyICAgICAgICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi93aW52ZXIuZXhlIgpsaW5rX2FwcCB1bmluc3RhbGxlciAgIiRDUk9PVC93aW5kb3dzL3VuaW5zdGFsbC5leGUiCmxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGVscC5leGUiCmxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGxwMzIuZXhlIgpsaW5rX2FwcCB3aW5lYnJvd3NlciAgIiRDUk9PVC93aW5kb3dzL3dpbmVicm93c2VyLmV4ZSIKCiMgQ29weSB0aGUgLmluZiBzY3JpcHQgYW5kIHJ1biBpdAoKY3AgIiRkYXRhZGlyL3dpbmUuaW5mIiAiJENST09UL3dpbmRvd3MvaW5mL3dpbmUuaW5mIgpleHBvcnQgV0lORVBSRUZJWAoiJHtXSU5FTE9BREVSOi13aW5lfSIgcnVuZGxsMzIuZXhlIHNldHVwYXBpLmRsbCxJbnN0YWxsSGluZlNlY3Rpb24gRGVmYXVsdEluc3RhbGwgMTI4IHdpbmUuaW5mCgojIFdhaXQgZm9yIHRoZSB3aW5lc2VydmVyIHRvIGZpbmlzaAoKaWYgWyAkZG9fd2FpdCA9IDEgXQp0aGVuCiAgICAiJHtXSU5FU0VSVkVSOi13aW5lc2VydmVyfSIgLXcKZmkKCmlmIFsgJHF1aWV0ID0gMCBdCnRoZW4KICAgIGVjaG8gIiRXSU5FUFJFRklYIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LiIKZmkK