LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAqCiAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogKgogKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAqIHF1ZXN0aW9ucy4KICovCi8qCiAgICBAdGVzdAogICAgQHN1bW1hcnkgdGVzdCBJU082MzktMiBsYW5ndWFnZSBjb2RlcwogICAgQGNvbXBpbGUgLWVuY29kaW5nIGFzY2lpIC1zb3VyY2UgNSBCdWc0MTc1OTk4VGVzdC5qYXZhCiAgICBAcnVuIG1haW4gQnVnNDE3NTk5OFRlc3QKICAgIEBidWcgNDE3NTk5OAoqLwovKgogKgogKgogKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk4IC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAogKgogKiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzIHNvdXJjZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGlzCiAqIGNvcHlyaWdodGVkIGFuZCBvd25lZCBieSBJQk0uIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdmlkZWQKICogdW5kZXIgdGVybXMgb2YgYSBMaWNlbnNlIEFncmVlbWVudCBiZXR3ZWVuIElCTSBhbmQgU3VuLgogKiBUaGlzIHRlY2hub2xvZ3kgaXMgcHJvdGVjdGVkIGJ5IG11bHRpcGxlIFVTIGFuZCBJbnRlcm5hdGlvbmFsCiAqIHBhdGVudHMuIFRoaXMgbm90aWNlIGFuZCBhdHRyaWJ1dGlvbiB0byBJQk0gbWF5IG5vdCBiZSByZW1vdmVkLgogKgogKi8KCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEuaW8uKjsKCi8qKgogKiAgQnVnNDE3NTk5OFRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgZm9sbG93aW5nIGJ1ZyBoYXMgYmVlbiBmaXhlZDoKICogIEJ1ZyA0MTc1OTk4IC0gVGhlIGphdmEudXRpbC5Mb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkgcmV0dXJucyB3cm9uZyByZXN1bHQgZm9yIGEgbG9jYWxlIHdpdGgKICogICAgICAgICAgIGxhbmd1YWdlIGNvZGUgJ3RhJyhUYW1pbCkuCiAqLwpwdWJsaWMgY2xhc3MgQnVnNDE3NTk5OFRlc3QgZXh0ZW5kcyBMb2NhbGVUZXN0Rm13ayB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXcgQnVnNDE3NTk5OFRlc3QoKS5ydW4oYXJncyk7CiAgICAgICAgLy9nZW5lcmF0ZVRhYmxlcygpOyAgICAvL3VuY29tbWVudCB0aGlzIHRvIHJlZ2VuZXJhdGUgZGF0YSB0YWJsZXMKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBib29sZWFuIGJhZCA9IGZhbHNlOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09ERVMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbG9jYWxlQ29kZXMgPSBDT0RFU1tpXTsKICAgICAgICAgICAgZmluYWwgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxvY2FsZUNvZGVzWzBdLCAiIik7CiAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpc28zID0gbC5nZXRJU08zTGFuZ3VhZ2UoKTsKICAgICAgICAgICAgaWYgKCFpc28zLmVxdWFscyhsb2NhbGVDb2Rlc1sxXSkgLyomJiAhaXNvMy5lcXVhbHMobG9jYWxlQ29kZXNbMl0pKi8pIHsKICAgICAgICAgICAgICAgIGxvZ2xuKCJMb2NhbGUoIitsKyIpIHJldHVybmVkIGJhZCBJU08zIGxhbmd1YWdlIGNvZGUuIgogICAgICAgICAgICAgICAgICAgICAgICArIiAgIEdvdCAnIitpc28zKyInIGluc3RlYWQgb2YgJyIrbG9jYWxlQ29kZXNbMV0rIiciLyorIiBvciAnIitsb2NhbGVDb2Rlc1syXSsiJyIqLyk7CiAgICAgICAgICAgICAgICBiYWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChiYWQpIHsKICAgICAgICAgICAgZXJybG4oIkJhZCBJU08zIGxhbmd1YWdlIGNvZGVzIGRldGVjdGVkLiIpOwogICAgICAgIH0KICAgIH0KCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBDT0RFUyA9IHsKICAgICAgICB7InB0IiwicG9yIiwicG9yIn0sCiAgICAgICAgeyJldSIsImV1cyIsImJhcSJ9LAogICAgICAgIHsicHMiLCJwdXMiLCJwdXMifSwKICAgICAgICB7ImV0IiwiZXN0IiwiZXN0In0sCiAgICAgICAgeyJrYSIsImthdCIsImdlbyJ9LAogICAgICAgIHsiZXMiLCJzcGEiLCJzcGEifSwKICAgICAgICB7ImVvIiwiZXBvIiwiZXBvIn0sCiAgICAgICAgeyJlbiIsImVuZyIsImVuZyJ9LAogICAgICAgIHsicGwiLCJwb2wiLCJwb2wifSwKICAgICAgICB7ImVsIiwiZWxsIiwiZ3JlIn0sCiAgICAgICAgeyJ1eiIsInV6YiIsInV6YiJ9LAogICAgICAgIHsianYiLCJqYXYiLCJqYXYifSwKICAgICAgICB7InVyIiwidXJkIiwidXJkIn0sCiAgICAgICAgeyJ1ayIsInVrciIsInVrciJ9LAogICAgICAgIHsidWciLCJ1aWciLCJ1aWcifSwKICAgICAgICB7Inp1IiwienVsIiwienVsIn0sCiAgICAgICAgeyJqYSIsImpwbiIsImpwbiJ9LAogICAgICAgIHsib3IiLCJvcmkiLCJvcmkifSwKICAgICAgICB7Im9tIiwib3JtIiwib3JtIn0sCiAgICAgICAgeyJ6aCIsInpobyIsImNoaSJ9LAogICAgICAgIHsidHciLCJ0d2kiLCJ0d2kifSwKICAgICAgICB7ImRlIiwiZGV1IiwiZ2VyIn0sCiAgICAgICAgeyJvYyIsIm9jaSIsIm9jaSJ9LAogICAgICAgIHsiemEiLCJ6aGEiLCJ6aGEifSwKICAgICAgICB7InR0IiwidGF0IiwidGF0In0sCiAgICAgICAgeyJpdSIsImlrdSIsImlrdSJ9LAogICAgICAgIHsidHMiLCJ0c28iLCJ0c28ifSwKICAgICAgICB7Iml0IiwiaXRhIiwiaXRhIn0sCiAgICAgICAgeyJ0ciIsInR1ciIsInR1ciJ9LAogICAgICAgIHsiZGEiLCJkYW4iLCJkYW4ifSwKICAgICAgICB7ImlzIiwiaXNsIiwiaWNlIn0sCiAgICAgICAgeyJ0byIsInRvbiIsInRvbiJ9LAogICAgICAgIHsidGwiLCJ0Z2wiLCJ0Z2wifSwKICAgICAgICB7InRrIiwidHVrIiwidHVrIn0sCiAgICAgICAgeyJpayIsImlwayIsImlwayJ9LAogICAgICAgIHsidGkiLCJ0aXIiLCJ0aXIifSwKICAgICAgICB7InRoIiwidGhhIiwidGhhIn0sCiAgICAgICAgeyJ0ZyIsInRnayIsInRnayJ9LAogICAgICAgIHsidGUiLCJ0ZWwiLCJ0ZWwifSwKICAgICAgICB7ImN5IiwiY3ltIiwid2VsIn0sCiAgICAgICAgeyJpZSIsImlsZSIsImlsZSJ9LAogICAgICAgIHsiaWQiLCJpbmQiLCJpbmQifSwKICAgICAgICB7InRhIiwidGFtIiwidGFtIn0sCiAgICAgICAgeyJpYSIsImluYSIsImluYSJ9LAogICAgICAgIHsiY3MiLCJjZXMiLCJjemUifSwKICAgICAgICB7InlvIiwieW9yIiwieW9yIn0sCiAgICAgICAgeyJubyIsIm5vciIsIm5vciJ9LAogICAgICAgIHsiY28iLCJjb3MiLCJjb3MifSwKICAgICAgICB7Im5sIiwibmxkIiwiZHV0In0sCiAgICAgICAgeyJ5aSIsInlpZCIsInlpZCJ9LAogICAgICAgIHsiaHkiLCJoeWUiLCJhcm0ifSwKICAgICAgICB7InN3Iiwic3dhIiwic3dhIn0sCiAgICAgICAgeyJuZSIsIm5lcCIsIm5lcCJ9LAogICAgICAgIHsic3YiLCJzd2UiLCJzd2UifSwKICAgICAgICB7InN1Iiwic3VuIiwic3VuIn0sCiAgICAgICAgeyJodSIsImh1biIsImh1biJ9LAogICAgICAgIHsibmEiLCJuYXUiLCJuYXUifSwKICAgICAgICB7InNyIiwic3JwIiwic2NjIn0sCiAgICAgICAgeyJjYSIsImNhdCIsImNhdCJ9LAogICAgICAgIHsic3EiLCJzcWkiLCJhbGIifSwKICAgICAgICB7ImhyIiwiaHJ2Iiwic2NyIn0sCiAgICAgICAgeyJzbyIsInNvbSIsInNvbSJ9LAogICAgICAgIHsic24iLCJzbmEiLCJzbmEifSwKICAgICAgICB7InNtIiwic21vIiwic21vIn0sCiAgICAgICAgeyJzbCIsInNsdiIsInNsdiJ9LAogICAgICAgIHsic2siLCJzbGsiLCJzbG8ifSwKICAgICAgICB7InNpIiwic2luIiwic2luIn0sCiAgICAgICAgeyJoaSIsImhpbiIsImhpbiJ9LAogICAgICAgIHsibXkiLCJteWEiLCJidXIifSwKICAgICAgICB7InNkIiwic25kIiwic25kIn0sCiAgICAgICAgeyJoZSIsImhlYiIsImhlYiJ9LAogICAgICAgIHsic2EiLCJzYW4iLCJzYW4ifSwKICAgICAgICB7Im10IiwibWx0IiwibWx0In0sCiAgICAgICAgeyJtcyIsIm1zYSIsIm1heSJ9LAogICAgICAgIHsiaGEiLCJoYXUiLCJoYXUifSwKICAgICAgICB7Im1yIiwibWFyIiwibWFyIn0sCiAgICAgICAgeyJiciIsImJyZSIsImJyZSJ9LAogICAgICAgIHsibW8iLCJtb2wiLCJtb2wifSwKICAgICAgICB7ImJvIiwiYm9kIiwidGliIn0sCiAgICAgICAgeyJtbiIsIm1vbiIsIm1vbiJ9LAogICAgICAgIHsiYm4iLCJiZW4iLCJiZW4ifSwKICAgICAgICB7Im1sIiwibWFsIiwibWFsIn0sCiAgICAgICAgeyJtayIsIm1rZCIsIm1hYyJ9LAogICAgICAgIHsieGgiLCJ4aG8iLCJ4aG8ifSwKICAgICAgICB7Im1pIiwibXJpIiwibWFvIn0sCiAgICAgICAgeyJiaSIsImJpcyIsImJpcyJ9LAogICAgICAgIHsiYmgiLCJiaWgiLCJiaWgifSwKICAgICAgICB7Im1nIiwibWxnIiwibWxnIn0sCiAgICAgICAgeyJiZyIsImJ1bCIsImJ1bCJ9LAogICAgICAgIHsicnciLCJraW4iLCJraW4ifSwKICAgICAgICB7ImJlIiwiYmVsIiwiYmVsIn0sCiAgICAgICAgeyJydSIsInJ1cyIsInJ1cyJ9LAogICAgICAgIHsiZ3UiLCJndWoiLCJndWoifSwKICAgICAgICB7ImJhIiwiYmFrIiwiYmFrIn0sCiAgICAgICAgeyJybyIsInJvbiIsInJ1bSJ9LAogICAgICAgIHsicm0iLCJyb2giLCJyb2gifSwKICAgICAgICB7ImduIiwiZ3JuIiwiZ3JuIn0sCiAgICAgICAgeyJheiIsImF6ZSIsImF6ZSJ9LAogICAgICAgIHsiYXkiLCJheW0iLCJheW0ifSwKICAgICAgICB7ImdkIiwiZ2xhIiwiZ2xhIn0sCiAgICAgICAgeyJsdiIsImxhdiIsImxhdiJ9LAogICAgICAgIHsibHQiLCJsaXQiLCJsaXQifSwKICAgICAgICB7ImdhIiwiZ2xlIiwiZ2xlIn0sCiAgICAgICAgeyJhcyIsImFzbSIsImFzbSJ9LAogICAgICAgIHsiYXIiLCJhcmEiLCJhcmEifSwKICAgICAgICB7IndvIiwid29sIiwid29sIn0sCiAgICAgICAgeyJsbiIsImxpbiIsImxpbiJ9LAogICAgICAgIHsiYW0iLCJhbWgiLCJhbWgifSwKICAgICAgICB7ImZ5IiwiZnJ5IiwiZnJ5In0sCiAgICAgICAgeyJhZiIsImFmciIsImFmciJ9LAogICAgICAgIHsicXUiLCJxdWUiLCJxdWUifSwKICAgICAgICB7ImFiIiwiYWJrIiwiYWJrIn0sCiAgICAgICAgeyJsYSIsImxhdCIsImxhdCJ9LAogICAgICAgIHsiYWEiLCJhYXIiLCJhYXIifSwKICAgICAgICB7ImZyIiwiZnJhIiwiZnJlIn0sCiAgICAgICAgeyJmbyIsImZhbyIsImZhbyJ9LAogICAgICAgIHsiZmoiLCJmaWoiLCJmaWoifSwKICAgICAgICB7ImZpIiwiZmluIiwiZmluIn0sCiAgICAgICAgeyJreSIsImtpciIsImtpciJ9LAogICAgICAgIHsia3UiLCJrdXIiLCJrdXIifSwKICAgICAgICB7ImZhIiwiZmFzIiwicGVyIn0sCiAgICAgICAgeyJrcyIsImthcyIsImthcyJ9LAogICAgICAgIHsidm8iLCJ2b2wiLCJ2b2wifSwKICAgICAgICB7ImtvIiwia29yIiwia29yIn0sCiAgICAgICAgeyJrbiIsImthbiIsImthbiJ9LAogICAgICAgIHsia2siLCJrYXoiLCJrYXoifSwKICAgICAgICB7InZpIiwidmllIiwidmllIn0sCiAgICB9OwoKLyoKICAgIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGFibGUgYWJvdmUgZnJvbSB0aGUgdHdvIElTTyBzdGFuZGFyZHMuCiAgICBJdCBtYXRjaGVzIHRoZSBsYW5ndWFnZSBuYW1lcyAobm90IHRoZSBjb2RlcykgZnJvbSBib3RoIHN0YW5kYXJkcyB0byBhc3NvY2lhdGUKICAgIHRoZSB0d28gYW5kIHRocmVlIGxldHRlciBjb2Rlcy4KCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNPNjM5ID0gImQ6XFx0ZW1wXFxpc282MzkudHh0IjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU082MzkyID0gImQ6XFx0ZW1wXFxpc28tNjM5LTIudHh0IjsKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVUYWJsZXMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgSVNPNjM5RmlsZSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihJU082MzkpKTsKICAgICAgICAgICAgSGFzaHRhYmxlIGk2MzkgPSBuZXcgSGFzaHRhYmxlKCk7CiAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgPSBJU082MzlGaWxlLnJlYWRMaW5lKCk7IGxpbmUgIT0gbnVsbDsgbGluZSA9IElTTzYzOUZpbGUucmVhZExpbmUoKSkgewogICAgICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZHggPSBsaW5lLmluZGV4T2YoJyAnKTsKICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnMSA9IGxpbmUuc3Vic3RyaW5nKDAsIG5keCk7CiAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG5keDIgPSBsaW5lLmluZGV4T2YoJyAnLCBuZHgrMSk7CiAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzIgPSBsaW5lLnN1YnN0cmluZyhuZHgrMSwgbmR4MiA8IDAgPyBsaW5lLmxlbmd0aCgpIDogbmR4Mik7CiAgICAgICAgICAgICAgICAgICAgaTYzOS5wdXQoYXJnMSwgYXJnMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIElTTzYzOTJGaWxlID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKElTTzYzOTIpKTsKICAgICAgICAgICAgSGFzaHRhYmxlIGk2MzkyID0gbmV3IEhhc2h0YWJsZSgpOwogICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5lID0gSVNPNjM5MkZpbGUucmVhZExpbmUoKTsgbGluZSAhPSBudWxsOyBsaW5lID0gSVNPNjM5MkZpbGUucmVhZExpbmUoKSkgewogICAgICAgICAgICAgICAgZmluYWwgaW50IG5keCA9IGxpbmUuaW5kZXhPZignICcpOwogICAgICAgICAgICAgICAgZmluYWwgaW50IG5keDIgPSBsaW5lLmluZGV4T2YoJyAnLCBuZHgrMSk7CiAgICAgICAgICAgICAgICBpbnQgbmR4MyA9IGxpbmUuaW5kZXhPZignICcsIG5keDIrMSk7CiAgICAgICAgICAgICAgICBpZiAobmR4MyA8IDApIG5keDMgPSBsaW5lLmxlbmd0aCgpOwogICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzEgPSBsaW5lLnN1YnN0cmluZygwLCBuZHgpOwogICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZzIgPSBsaW5lLnN1YnN0cmluZyhuZHgrMSwgbmR4Mik7CiAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnMyA9IGxpbmUuc3Vic3RyaW5nKG5keDIrMSwgbmR4Myk7CiAgICAgICAgICAgICAgICBpNjM5Mi5wdXQoYXJnMywgbmV3IElTTzYzOTJFbnRyeShhcmcxLCBhcmcyKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBpNjM5LmtleXMoKTsKICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmFtZSA9IGk2MzkuZ2V0KGtleSk7CiAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBpNjM5Mi5nZXQobmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiXCIiK2tleSsiXCIsIik7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ9LCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwogICAgICAgIH0KICAgIH0KCgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSVNPNjM5MkVudHJ5IHsKICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvZGU7CiAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOwogICAgICAgIHB1YmxpYyBJU082MzkyRW50cnkoU3RyaW5nIGNvZGUsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiAiXCIiK2NvZGUrIlwiLFwiIituYW1lKyJcIiI7CiAgICAgICAgfQoKICAgIH0KKi8KCn0KCi8qCgpkYXRhIGZyb20gZnRwOi8vZGt1dWcuZGsgb24gTWFyY2ggNCwgMTk5OQp2ZXJpZmllZCBieSBodHRwOi8vd3d3LnRyaWFjb20uY29tL2FyY2hpdmUvaXNvNjM5LTIuZW4uaHRtbAoKaXNvIDYzOSBkYXRhCmFhIEFmYXIKYWIgQWJraGF6aWFuCmFmIEFmcmlrYWFucwphbSBBbWhhcmljCmFyIEFyYWJpYwphcyBBc3NhbWVzZQpheSBBeW1hcmEKYXogQXplcmJhaWphbmkKYmEgQmFzaGtpcgpiZSBCZWxhcnVzc2lhbgpiZyBCdWxnYXJpYW4KYmggQmloYXJpCmJpIEJpc2xhbWEKYm4gQmVuZ2FsaQpibyBUaWJldGFuCmJyIEJyZXRvbgpjYSBDYXRhbGFuCmNvIENvcnNpY2FuCmNzIEN6ZWNoCmN5IFdlbHNoCmRhIERhbmlzaApkZSBHZXJtYW4KZHogQmh1dGFuaQplbCBHcmVlawplbiBFbmdsaXNoCmVvIEVzcGVyYW50bwplcyBTcGFuaXNoCmV0IEVzdG9uaWFuCmV1IEJhc3F1ZQpmYSBQZXJzaWFuCmZpIEZpbm5pc2gKZmogRmlqaWFuCmZvIEZhcm9lc2UKZnIgRnJlbmNoCmZ5IEZyaXNpYW4KZ2EgSXJpc2gKZ2QgR2FlbGljCmdsIEdhbGljaWFuCmduIEd1YXJhbmkKZ3UgR3VqYXJhdGkKaGEgSGF1c2EKaGUgSGVicmV3CmhpIEhpbmRpCmhyIENyb2F0aWFuCmh1IEh1bmdhcmlhbgpoeSBBcm1lbmlhbgppYSBJbnRlcmxpbmd1YQppZCBJbmRvbmVzaWFuCmllIEludGVybGluZ3VlCmlrIEludXBpYWsKaXMgSWNlbGFuZGljCml0IEl0YWxpYW4KaXUgSW51a3RpdHV0CmphIEphcGFuZXNlCmp3IEphdmFuZXNlCmthIEdlb3JnaWFuCmtrIEthemFraAprbCBHcmVlbmxhbmRpYwprbSBDYW1ib2RpYW4Ka24gS2FubmFkYQprbyBLb3JlYW4Ka3MgS2FzaG1pcmkKa3UgS3VyZGlzaApreSBLaXJnaGl6CmxhIExhdGluCmxuIExpbmdhbGEKbG8gTGFvdGhpYW4KbHQgTGl0aHVhbmlhbgpsdiBMYXR2aWFuCm1nIE1hbGFnYXN5Cm1pIE1hb3JpCm1rIE1hY2Vkb25pYW4KbWwgTWFsYXlhbGFtCm1uIE1vbmdvbGlhbgptbyBNb2xkYXZpYW4KbXIgTWFyYXRoaQptcyBNYWxheQptdCBNYWx0ZXNlCm15IEJ1cm1lc2UKbmEgTmF1cnUKbmUgTmVwYWxpCm5sIER1dGNoCm5vIE5vcndlZ2lhbgpvYyBPY2NpdGFuCm9tIE9yb21vCm9yIE9yaXlhCnBhIFB1bmphYmkKcGwgUG9saXNoCnBzIFB1c2h0bwpwdCBQb3J0dWd1ZXNlCnF1IFF1ZWNodWEKcm0gUmFldG8tUm9tYW5jZQpybiBLaXJ1bmRpCnJvIFJvbWFuaWFuCnJ1IFJ1c3NpYW4KcncgS2lueWFyd2FuZGEKc2EgU2Fuc2tyaXQKc2QgU2luZGhpCnNnIFNhbmdobwpzaCBDcm9hdGlhbiAoU2VyYm8pCnNpIFNpbmhhbGVzZQpzayBTbG92YWsKc2wgU2xvdmVuaWFuCnNtIFNhbW9hbgpzbiBTaG9uYQpzbyBTb21hbGkKc3EgQWxiYW5pYW4Kc3IgU2VyYmlhbgpzcyBTaXN3YXRpCnN0IFNlc290aG8Kc3UgU3VuZGFuZXNlCnN2IFN3ZWRpc2gKc3cgU3dhaGlsaQp0YSBUYW1pbAp0ZSBUZWx1Z3UKdGcgVGFqaWsKdGggVGhhaQp0aSBUaWdyaW55YQp0ayBUdXJrbWVuCnRsIFRhZ2Fsb2cKdG4gU2V0c3dhbmEKdG8gVG9uZ2EKdHIgVHVya2lzaAp0cyBUc29uZ2EKdHQgVGF0YXIKdHcgVHdpCnVnIFVpZ2h1cgp1ayBVa3JhaW5pYW4KdXIgVXJkdQp1eiBVemJlawp2aSBWaWV0bmFtZXNlCnZvIFZvbGFwdWsKd28gV29sb2YKeGggWGhvc2EKeWkgWWlkZGlzaAp5byBZb3J1YmEKemEgWmh1YW5nCnpoIENoaW5lc2UKenUgWnVsdQoKSVNPIDYzOS0yIGRhdGEKCmFhciBhYXIgQWZhcgphYmsgYWJrIEFia2hhemlhbgphY2UgYWNlIEFjaGluZXNlCmFjaCBhY2ggQWNvbGkKYWRhIGFkYSBBZGFuZ21lCmFmYSBhZmEgQWZyby1Bc2lhdGljIChPdGhlcikKYWZoIGFmaCBBZnJpaGlsaQphZnIgYWZyIEFmcmlrYWFucwpha2EgYWthIEFrYW4KYWtrIGFrayBBa2thZGlhbgphbGUgYWxlIEFsZXV0CmFsZyBhbGcgQWxnb25xdWlhbiBsYW5ndWFnZXMKYW1oIGFtaCBBbWhhcmljCmFuZyBhbmcgRW5nbGlzaC1PbGQgKGNhLiA0NTAtMTEwMCkKYXBhIGFwYSBBcGFjaGUgbGFuZ3VhZ2VzCmFyYSBhcmEgQXJhYmljCmFyYyBhcmMgQXJhbWFpYwphcm4gYXJuIEFyYXVjYW5pYW4KYXJwIGFycCBBcmFwYWhvCmFydCBhcnQgQXJ0aWZpY2lhbCAoT3RoZXIpCmFydyBhcncgQXJhd2FrCmFzbSBhc20gQXNzYW1lc2UKYXRoIGF0aCBBdGhhcGFzY2FuIGxhbmd1YWdlcwphdXMgYXVzIEF1c3RyYWxpYW4gbGFuZ3VhZ2VzCmF2YSBhdmEgQXZhcmljCmF2ZSBhdmUgQXZlc3Rhbgphd2EgYXdhIEF3YWRoaQpheW0gYXltIEF5bWFyYQphemUgYXplIEF6ZXJiYWlqYW5pCmJhZCBiYWQgQmFuZGEKYmFpIGJhaSBCYW1pbGVrZSBsYW5ndWFnZXMKYmFrIGJhayBCYXNoa2lyCmJhbCBiYWwgQmFsdWNoaQpiYW0gYmFtIEJhbWJhcmEKYmFuIGJhbiBCYWxpbmVzZQpiYXMgYmFzIEJhc2EKYmF0IGJhdCBCYWx0aWMgKE90aGVyKQpiZWogYmVqIEJlamEKYmVsIGJlbCBCZWxhcnVzc2lhbgpiZW0gYmVtIEJlbWJhCmJlbiBiZW4gQmVuZ2FsaQpiZXIgYmVyIEJlcmJlciAoT3RoZXIpCmJobyBiaG8gQmhvanB1cmkKYmloIGJpaCBCaWhhcmkKYmlrIGJpayBCaWtvbApiaW4gYmluIEJpbmkKYmlzIGJpcyBCaXNsYW1hCmJsYSBibGEgU2lrc2lrYQpibnQgYm50IEJhbnR1IChPdGhlcikKYm9kIHRpYiBUaWJldGFuCmJyYSBicmEgQnJhagpicmUgYnJlIEJyZXRvbgpidGsgYnRrIEJhdGFrIChJbmRvbmVzaWEpCmJ1YSBidWEgQnVyaWF0CmJ1ZyBidWcgQnVnaW5lc2UKYnVsIGJ1bCBCdWxnYXJpYW4KY2FkIGNhZCBDYWRkbwpjYWkgY2FpIENlbnRyYWwtQW1lcmljYW4tSW5kaWFuIChPdGhlcikKY2FyIGNhciBDYXJpYgpjYXQgY2F0IENhdGFsYW4KY2F1IGNhdSBDYXVjYXNpYW4gKE90aGVyKQpjZWIgY2ViIENlYnVhbm8KY2VsIGNlbCBDZWx0aWMgKE90aGVyKQpjZXMgY3plIEN6ZWNoCmNoYSBjaGEgQ2hhbW9ycm8KY2hiIGNoYiBDaGliY2hhCmNoZSBjaGUgQ2hlY2hlbgpjaGcgY2hnIENoYWdhdGFpCmNoayBjaGsgQ2h1dWtlc2UKY2htIGNobSBNYXJpCmNobiBjaG4gQ2hpbm9vay1qYXJnb24KY2hvIGNobyBDaG9jdGF3CmNocCBjaHAgQ2hpcGV3eWFuCmNociBjaHIgQ2hlcm9rZWUKY2h1IGNodSBDaHVyY2gtU2xhdmljCmNodiBjaHYgQ2h1dmFzaApjaHkgY2h5IENoZXllbm5lCmNtYyBjbWMgQ2hhbWljIGxhbmd1YWdlcwpjb3AgY29wIENvcHRpYwpjb3IgY29yIENvcm5pc2gKY29zIGNvcyBDb3JzaWNhbgpjcGUgY3BlIENyZW9sZXMtYW5kLXBpZGdpbnMtRW5nbGlzaC1iYXNlZCAoT3RoZXIpCmNwZiBjcGYgQ3Jlb2xlcy1hbmQtcGlkZ2lucy1GcmVuY2gtYmFzZWQgKE90aGVyKQpjcHAgY3BwIENyZW9sZXMtYW5kLXBpZGdpbnMtUG9ydHVndWVzZS1iYXNlZCAoT3RoZXIpCmNyZSBjcmUgQ3JlZQpjcnAgY3JwIENyZW9sZXMtYW5kLXBpZGdpbnMgKE90aGVyKQpjdXMgY3VzIEN1c2hpdGljIChPdGhlcikKY3ltIHdlbCBXZWxzaApkYWsgZGFrIERha290YQpkYW4gZGFuIERhbmlzaApkYXkgZGF5IERheWFrCmRlbCBkZWwgRGVsYXdhcmUKZGVuIGRlbiBTbGF2ZSAoQXRoYXBhc2NhbikKZGV1IGdlciBHZXJtYW4KZGdyIGRnciBEb2dyaWIKZGluIGRpbiBEaW5rYQpkaXYgZGl2IERpdmVoaQpkb2kgZG9pIERvZ3JpCmRyYSBkcmEgRHJhdmlkaWFuIChPdGhlcikKZHVhIGR1YSBEdWFsYQpkdW0gZHVtIER1dGNoLU1pZGRsZSAoY2EuIDEwNTAtMTM1MCkKZHl1IGR5dSBEeXVsYQpkem8gZHpvIER6b25na2hhCmVmaSBlZmkgRWZpawplZ3kgZWd5IEVneXB0aWFuIChBbmNpZW50KQpla2EgZWthIEVrYWp1awplbGwgZ3JlIEdyZWVrIE1vZGVybiAocG9zdCAxNDUzKQplbHggZWx4IEVsYW1pdGUKZW5nIGVuZyBFbmdsaXNoCmVubSBlbm0gRW5nbGlzaC1NaWRkbGUgKDExMDAtMTUwMCkKZXBvIGVwbyBFc3BlcmFudG8KZXN0IGVzdCBFc3RvbmlhbgpldXMgYmFxIEJhc3F1ZQpld2UgZXdlIEV3ZQpld28gZXdvIEV3b25kbwpmYW4gZmFuIEZhbmcKZmFvIGZhbyBGYXJvZXNlCmZhcyBwZXIgUGVyc2lhbgpmYXQgZmF0IEZhbnRpCmZpaiBmaWogRmlqaWFuCmZpbiBmaW4gRmlubmlzaApmaXUgZml1IEZpbm5vLVVncmlhbiAoT3RoZXIpCmZvbiBmb24gRm9uCmZyYSBmcmUgRnJlbmNoCmZybSBmcm0gRnJlbmNoLU1pZGRsZSAoY2EuIDE0MDAtMTYwMCkKZnJvIGZybyBGcmVuY2gtT2xkICg4NDItY2EuIDE0MDApCmZyeSBmcnkgRnJpc2lhbgpmdWwgZnVsIEZ1bGFoCmZ1ciBmdXIgRnJpdWxpYW4KZ2FhIGdhYSBHYQpnYXkgZ2F5IEdheW8KZ2JhIGdiYSBHYmF5YQpnZW0gZ2VtIEdlcm1hbmljIChPdGhlcikKZ2V6IGdleiBHZWV6CmdpbCBnaWwgR2lsYmVydGVzZQpnZGggZ2FlIEdhZWxpYwpnYWkgaXJpIElyaXNoCmdsZyBnbGcgR2FsbGVnYW4KZ2x2IGdsdiBNYW54CmdtaCBnbWggR2VybWFuLU1pZGRsZSBIaWdoIChjYS4gMTA1MC0xNTAwKQpnb2ggZ29oIEdlcm1hbi1PbGQgSGlnaCAoY2EuIDc1MC0xMDUwKQpnb24gZ29uIEdvbmRpCmdvciBnb3IgR29yb250YWxvCmdvdCBnb3QgR290aGljCmdyYiBncmIgR3JlYm8KZ3JjIGdyYyBHcmVlay1BbmNpZW50ICh0byAxNDUzKQpncm4gZ3JuIEd1YXJhbmkKZ3VqIGd1aiBHdWphcmF0aQpnd2kgZ3dpIEd3aWNoJ2luCmhhaSBoYWkgSGFpZGEKaGF1IGhhdSBIYXVzYQpoYXcgaGF3IEhhd2FpaWFuCmhlYiBoZWIgSGVicmV3CmhlciBoZXIgSGVyZXJvCmhpbCBoaWwgSGlsaWdheW5vbgpoaW0gaGltIEhpbWFjaGFsaQpoaW4gaGluIEhpbmRpCmhpdCBoaXQgSGl0dGl0ZQpobW4gaG1uIEhtb25nCmhtbyBobW8gSGlyaSBNb3R1CmhydiBzY3IgQ3JvYXRpYW4KaHVuIGh1biBIdW5nYXJpYW4KaHVwIGh1cCBIdXBhCmh5ZSBhcm0gQXJtZW5pYW4KaWJhIGliYSBJYmFuCmlibyBpYm8gSWdibwppam8gaWpvIElqbwppa3UgaWt1IEludWt0aXR1dAppbGUgaWxlIEludGVybGluZ3VlCmlsbyBpbG8gSWxva28KaW5hIGluYSBJbnRlcmxpbmd1YSAoSW50ZXJuYXRpb25hbCBBdXhpbGFyeSBMYW5ndWFnZSBBc3NvY2lhdGlvbikKaW5jIGluYyBJbmRpYyAoT3RoZXIpCmluZCBpbmQgSW5kb25lc2lhbgppbmUgaW5lIEluZG8tRXVyb3BlYW4gKE90aGVyKQppcGsgaXBrIEludXBpYWsKaXJhIGlyYSBJcmFuaWFuIChPdGhlcikKaXJvIGlybyBJcm9xdW9pYW4gbGFuZ3VhZ2VzCmlzbCBpY2UgSWNlbGFuZGljCml0YSBpdGEgSXRhbGlhbgpqYXcgamF2IEphdmFuZXNlCmpwbiBqcG4gSmFwYW5lc2UKanByIGpwciBKdWRlby1QZXJzaWFuCmpyYiBqcmIgSnVkZW8tQXJhYmljCmthYSBrYWEgS2FyYS1LYWxwYWsKa2FiIGthYiBLYWJ5bGUKa2FjIGthYyBLYWNoaW4Ka2FsIGthbCBLYWxhYWxsaXN1dAprYW0ga2FtIEthbWJhCmthbiBrYW4gS2FubmFkYQprYXIga2FyIEthcmVuCmthcyBrYXMgS2FzaG1pcmkKa2F0IGdlbyBHZW9yZ2lhbgprYXUga2F1IEthbnVyaQprYXcga2F3IEthd2kKa2F6IGtheiBLYXpha2gKa2hhIGtoYSBLaGFzaQpraGkga2hpIEtob2lzYW4gKE90aGVyKQpraG0ga2htIEtobWVyCmtobyBraG8gS2hvdGFuZXNlCmtpayBraWsgS2lrdXl1CmtpbiBraW4gS2lueWFyd2FuZGEKa2lyIGtpciBLaXJnaGl6CmttYiBrbWIgS2ltYnVuZHUKa29rIGtvayBLb25rYW5pCmtvbSBrb20gS29taQprb24ga29uIEtvbmdvCmtvciBrb3IgS29yZWFuCmtvcyBrb3MgS29zcmFlYW4Ka3BlIGtwZSBLcGVsbGUKa3JvIGtybyBLcnUKa3J1IGtydSBLdXJ1a2gKa3VhIGt1YSBLdWFueWFtYQprdW0ga3VtIEt1bXlrCmt1ciBrdXIgS3VyZGlzaAprdXQga3V0IEt1dGVuYWkKbGFkIGxhZCBMYWRpbm8KbGFoIGxhaCBMYWhuZGEKbGFtIGxhbSBMYW1iYQpsYW8gbGFvIExhbwpsYXQgbGF0IExhdGluCmxhdiBsYXYgTGF0dmlhbgpsZXogbGV6IExlemdoaWFuCmxpbiBsaW4gTGluZ2FsYQpsaXQgbGl0IExpdGh1YW5pYW4KbG9sIGxvbCBNb25nbwpsb3ogbG96IExvemkKbHR6IGx0eiBMZXR6ZWJ1cmdlc2NoCmx1YSBsdWEgTHViYS1MdWx1YQpsdWIgbHViIEx1YmEtS2F0YW5nYQpsdWcgbHVnIEdhbmRhCmx1aSBsdWkgTHVpc2VubwpsdW4gbHVuIEx1bmRhCmx1byBsdW8gTHVvIChLZW55YSBhbmQgVGFuemFuaWEpCmx1cyBsdXMgTHVzaGFpCm1hZCBtYWQgTWFkdXJlc2UKbWFnIG1hZyBNYWdhaGkKbWFoIG1haCBNYXJzaGFsbAptYWkgbWFpIE1haXRoaWxpCm1hayBtYWsgTWFrYXNhcgptYWwgbWFsIE1hbGF5YWxhbQptYW4gbWFuIE1hbmRpbmdvCm1hcCBtYXAgQXVzdHJvbmVzaWFuIChPdGhlcikKbWFyIG1hciBNYXJhdGhpCm1hcyBtYXMgTWFzYWkKbWRyIG1kciBNYW5kYXIKbWVuIG1lbiBNZW5kZQptZ2EgbWdhIElyaXNoLU1pZGRsZSAoOTAwLTEyMDApCm1pYyBtaWMgTWljbWFjCm1pbiBtaW4gTWluYW5na2FiYXUKbWlzIG1pcyBNaXNjZWxsYW5lb3VzIGxhbmd1YWdlcwpta2QgbWFjIE1hY2Vkb25pYW4KbWtoIG1raCBNb24tS2htZXIgKE90aGVyKQptbGcgbWxnIE1hbGFnYXN5Cm1sdCBtbHQgTWFsdGVzZQptbmkgbW5pIE1hbmlwdXJpCm1ubyBtbm8gTWFub2JvIGxhbmd1YWdlcwptb2ggbW9oIE1vaGF3awptb2wgbW9sIE1vbGRhdmlhbgptb24gbW9uIE1vbmdvbGlhbgptb3MgbW9zIE1vc3NpCm1yaSBtYW8gTWFvcmkKbXNhIG1heSBNYWxheQptdWwgbXVsIE11bHRpcGxlIGxhbmd1YWdlcwptdW4gbXVuIE11bmRhIGxhbmd1YWdlcwptdXMgbXVzIENyZWVrCm13ciBtd3IgTWFyd2FyaQpteWEgYnVyIEJ1cm1lc2UKbXluIG15biBNYXlhbiBsYW5ndWFnZXMKbmFoIG5haCBOYWh1YXRsCm5haSBuYWkgTm9ydGggQW1lcmljYW4gSW5kaWFuIChPdGhlcikKbmF1IG5hdSBOYXVydQpuYXYgbmF2IE5hdmFqbwpuYmwgbmJsIE5kZWJlbGUsIFNvdXRoCm5kZSBuZGUgTmRlYmVsZSwgTm9ydGgKbmRvIG5kbyBOZG9uZ2EKbmVwIG5lcCBOZXBhbGkKbmV3IG5ldyBOZXdhcmkKbmlhIG5pYSBOaWFzCm5pYyBuaWMgTmlnZXItS29yZG9mYW5pYW4gKE90aGVyKQpuaXUgbml1IE5pdWVhbgpubGQgZHV0IER1dGNoCm5vbiBub24gTm9yc2UsIE9sZApub3Igbm9yIE5vcndlZ2lhbgpuc28gbnNvIFNvaHRvLCBOb3J0aGVybgpudWIgbnViIE51YmlhbiBsYW5ndWFnZXMKbnlhIG55YSBOeWFuamEKbnltIG55bSBOeWFtd2V6aQpueW4gbnluIE55YW5rb2xlCm55byBueW8gTnlvcm8KbnppIG56aSBOemltYQpvY2kgb2NpIE9jY2l0YW4gKHBvc3QgMTUwMCkKb2ppIG9qaSBPamlid2EKb3JpIG9yaSBPcml5YQpvcm0gb3JtIE9yb21vCm9zYSBvc2EgT3NhZ2UKb3NzIG9zcyBPc3NldGljCm90YSBvdGEgVHVya2lzaCwgT3R0b21hbiAoMTUwMC0xOTI4KQpvdG8gb3RvIE90b21pYW4gbGFuZ3VhZ2VzCnBhYSBwYWEgUGFwdWFuIChPdGhlcikKcGFnIHBhZyBQYW5nYXNpbmFuCnBhbCBwYWwgUGFobGF2aQpwYW0gcGFtIFBhbXBhbmdhCnBhbiBwYW4gUGFuamFiaQpwYXAgcGFwIFBhcGlhbWVudG8KcGF1IHBhdSBQYWxhdWFuCnBlbyBwZW8gUGVyc2lhbiwgT2xkIChjYS4gNjAwLTQwMCBCLkMuKQpwaGkgcGhpIFBoaWxpcHBpbmUgKE90aGVyKQpwaG4gcGhuIFBob2VuaWNpYW4KcGxpIHBsaSBQYWxpCnBvbCBwb2wgUG9saXNoCnBvbiBwb24gUG9obnBlaWFuCnBvciBwb3IgUG9ydHVndWVzZQpwcmEgcHJhIFByYWtyaXQgbGFuZ3VhZ2VzCnBybyBwcm8gUHJvdmVu52FsLCBPbGQgKHRvIDE1MDApCnB1cyBwdXMgUHVzaHRvCnFhYS1xdHogcWFhLXF0eiBSZXNlcnZlZCBmb3IgbG9jYWwgdXNlCnF1ZSBxdWUgUXVlY2h1YQpyYWogcmFqIFJhamFzdGhhbmkKcmFwIHJhcCBSYXBhbnVpCnJhciByYXIgUmFyb3Rvbmdhbgpyb2Egcm9hIFJvbWFuY2UgKE90aGVyKQpyb2ggcm9oIFJhZXRvLVJvbWFuY2UKcm9tIHJvbSBSb21hbnkKcm9uIHJ1bSBSb21hbmlhbgpydW4gcnVuIFJ1bmRpCnJ1cyBydXMgUnVzc2lhbgpzYWQgc2FkIFNhbmRhd2UKc2FnIHNhZyBTYW5nbwpzYWggc2FoIFlha3V0CnNhaSBzYWkgU291dGggQW1lcmljYW4gSW5kaWFuIChPdGhlcikKc2FsIHNhbCBTYWxpc2hhbiBsYW5ndWFnZXMKc2FtIHNhbSBTYW1hcml0YW4gQXJhbWFpYwpzYW4gc2FuIFNhbnNrcml0CnNhcyBzYXMgU2FzYWsKc2F0IHNhdCBTYW50YWxpCnNjbyBzY28gU2NvdHMKc2VsIHNlbCBTZWxrdXAKc2VtIHNlbSBTZW1pdGljIChPdGhlcikKc2dhIHNnYSBJcmlzaC1PbGQgKHRvIDkwMCkKc2huIHNobiBTaGFuCnNpZCBzaWQgU2lkYW1vCnNpbiBzaW4gU2luaGFsZXNlCnNpbyBzaW8gU2lvdWFuIGxhbmd1YWdlcwpzaXQgc2l0IFNpbm8tVGliZXRhbiAoT3RoZXIpCnNsYSBzbGEgU2xhdmljIChPdGhlcikKc2xrIHNsbyBTbG92YWsKc2x2IHNsdiBTbG92ZW5pYW4Kc21pIHNtaSBTYW1pIGxhbmd1YWdlcwpzbW8gc21vIFNhbW9hbgpzbmEgc25hIFNob25hCnNuZCBzbmQgU2luZGhpCnNuayBzbmsgU29uaW5rZQpzb2cgc29nIFNvZ2RpYW4Kc29tIHNvbSBTb21hbGkKc29uIHNvbiBTb25naGFpCnNvdCBzb3QgU290aG8gU291dGhlcm4Kc3BhIHNwYSBTcGFuaXNoCnNxaSBhbGIgQWxiYW5pYW4Kc3JkIHNyZCBTYXJkaW5pYW4Kc3JwIHNjYyBTZXJiaWFuCnNyciBzcnIgU2VyZXIKc3NhIHNzYSBOaWxvLVNhaGFyYW4gKE90aGVyKQpzc3cgc3N3IFN3YXRpCnN1ayBzdWsgU3VrdW1hCnN1biBzdW4gU3VuZGFuZXNlCnN1cyBzdXMgU3VzdQpzdXggc3V4IFN1bWVyaWFuCnN3YSBzd2EgU3dhaGlsaQpzd2Ugc3dlIFN3ZWRpc2gKc3lyIHN5ciBTeXJpYWMKdGFoIHRhaCBUYWhpdGlhbgp0YWkgdGFpIFRhaSAoT3RoZXIpCnRhbSB0YW0gVGFtaWwKdGF0IHRhdCBUYXRhcgp0ZWwgdGVsIFRlbHVndQp0ZW0gdGVtIFRpbW5lCnRlciB0ZXIgVGVyZW5vCnRldCB0ZXQgVGV0dW0KdGdrIHRnayBUYWppawp0Z2wgdGdsIFRhZ2Fsb2cKdGhhIHRoYSBUaGFpCnRpZyB0aWcgVGlncmUKdGlyIHRpciBUaWdyaW55YQp0aXYgdGl2IFRpdgp0a2wgdGtsIFRva2VsYXUKdGxpIHRsaSBUbGluZ2l0CnRtaCB0bWggVGFtYXNoZWsKdG9nIHRvZyBUb25nYSAoTnlhc2EpCnRvbiB0b24gVG9uZ2EgKFRvbmdhIElzbGFuZHMpCnRwaSB0cGkgVG9rIFBpc2luCnRzaSB0c2kgVHNpbXNoaWFuCnRzbiB0c24gVHN3YW5hCnRzbyB0c28gVHNvbmdhCnR1ayB0dWsgVHVya21lbgp0dW0gdHVtIFR1bWJ1a2EKdHVyIHR1ciBUdXJraXNoCnR1dCB0dXQgQWx0YWljCnR2bCB0dmwgVHV2YWx1CnR3aSB0d2kgVHdpCnR5diB0eXYgVHV2aW5pYW4KdWdhIHVnYSBVZ2FyaXRpYwp1aWcgdWlnIFVpZ2h1cgp1a3IgdWtyIFVrcmFpbmlhbgp1bWIgdW1iIFVtYnVuZHUKdW5kIHVuZCBVbmRldGVybWluZWQKdXJkIHVyZCBVcmR1CnV6YiB1emIgVXpiZWsKdmFpIHZhaSBWYWkKdmVuIHZlbiBWZW5kYQp2aWUgdmllIFZpZXRuYW1lc2UKdm9sIHZvbCBWb2xhcHVrCnZvdCB2b3QgVm90aWMKd2FrIHdhayBXYWthc2hhbgp3YWwgd2FsIFdhbGFtbwp3YXIgd2FyIFdhcmF5CndhcyB3YXMgV2FzaG8Kd2VuIHdlbiBTb3JiaWFuCndvbCB3b2wgV29sb2YKeGhvIHhobyBYaG9zYQp5YW8geWFvIFlhbwp5YXAgeWFwIFlhcGVzZQp5aWQgeWlkIFlpZGRpc2gKeW9yIHlvciBZb3J1YmEKeXBrIHlwayBZdXBpawp6YXAgemFwIFphcG90ZWMKemVuIHplbiBaZW5hZ2EKemhhIHpoYSBaaHVhbmcKemhvIGNoaSBDaGluZXNlCnpuZCB6bmQgWmFuZGUKenVsIHp1bCBadWx1Cnp1biB6dW4gWnVuaQoKKi8K