LyoKICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIFB1cmR1ZSBVbml2ZXJzaXR5CiAqIFdyaXR0ZW4gYnkgR3JlZ29yIFJpY2hhcmRzCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqIAogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgogKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoKKGZ1bmN0aW9uKCkgewogICAgLy8gcHV0IGJlbmNobWFya3MgaGVyZQogICAgdmFyIGJlbmNobWFya3MgPSBbImFtYXpvbi1jaHJvbWUiLCAiYW1hem9uLWNocm9tZS13aW4iLCAiYW1hem9uLWZpcmVmb3giLAogICAgICAgICAgICAgICAgICAgICAgImFtYXpvbi1maXJlZm94LXdpbiIsICJhbWF6b24tc2FmYXJpIiwgImZhY2Vib29rLWNocm9tZSIsCiAgICAgICAgICAgICAgICAgICAgICAiZmFjZWJvb2stY2hyb21lLXdpbiIsICJmYWNlYm9vay1maXJlZm94IiwKICAgICAgICAgICAgICAgICAgICAgICJmYWNlYm9vay1maXJlZm94LXdpbiIsICJmYWNlYm9vay1zYWZhcmkiLAogICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS1jaHJvbWUiLCAiZ29vZ2xlLWNocm9tZS13aW4iLCAiZ29vZ2xlLWZpcmVmb3giLAogICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS1maXJlZm94LXdpbiIsICJnb29nbGUtc2FmYXJpIiwgInR3aXR0ZXItY2hyb21lIiwKICAgICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyLWNocm9tZS13aW4iLCAidHdpdHRlci1maXJlZm94IiwKICAgICAgICAgICAgICAgICAgICAgICJ0d2l0dGVyLWZpcmVmb3gtd2luIiwgInR3aXR0ZXItc2FmYXJpIiwgInlhaG9vLWNocm9tZSIsCiAgICAgICAgICAgICAgICAgICAgICAieWFob28tY2hyb21lLXdpbiIsICJ5YWhvby1maXJlZm94IiwgInlhaG9vLWZpcmVmb3gtd2luIiwKICAgICAgICAgICAgICAgICAgICAgICJ5YWhvby1zYWZhcmkiXTsKICAgIHZhciBtb2RlcyA9IHsKICAgICAgICAiKiI6IFsidXJlbSJdLAogICAgICAgICJhbWF6b24tZmlyZWZveCI6IFsidXJtIl0sCiAgICAgICAgImFtYXpvbi1maXJlZm94LXdpbiI6IFsidXJtIl0sCiAgICAgICAgImdvb2dsZS1maXJlZm94IjogWyJ1ZW0iXSwKICAgICAgICAidHdpdHRlci1jaHJvbWUtd2luIjogWyJyZW0iXQogICAgfTsKICAgIHZhciBtaW5SdW5zID0gMjM7CiAgICB2YXIga2VlcFJ1bnMgPSAyMDsKICAgIHZhciBtYXhSdW5zID0gMTAwOwogICAgdmFyIG1heENJTSA9IDAuMTA7CgogICAgLy8gZml4dXBzIGZvciBvbGQgZW5naW5lcwogICAgaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7CiAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uKGYsIHZhbCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhbCA9IGYodmFsLCB0aGlzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdmFsOwogICAgICAgIH07CiAgICB9CgogICAgLy8gYWxsIHRlc3QgcmVzdWx0cwogICAgdmFyIHJlc3VsdHMgPSB7fTsKCiAgICB2YXIgY3VyUnVuID0gMDsKICAgIHZhciBjdXJCZW5jaG1hcmsgPSAwOwogICAgdmFyIGN1ck1vZGUgPSAwOwoKICAgIGZ1bmN0aW9uIGdldE1vZGVzKGJtKSB7CiAgICAgICAgaWYgKGJtIGluIG1vZGVzKSByZXR1cm4gbW9kZXNbYm1dOwogICAgICAgIHJldHVybiBtb2Rlc1siKiJdOwogICAgfQoKICAgIC8vIGNhbGwgdGhpcyB0byBlaXRoZXIgcmVydW4gb3IgZ28gdG8gYW5vdGhlciBwYWdlIGFuZCBjb21lIGJhY2sKICAgIGZ1bmN0aW9uIHJlcnVuKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cuc2Vzc2lvblN0b3JhZ2UpIHsKICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoaXMgZm9yIHRoZSBzZXNzaW9uIGFuZCBnbyAncm91bmQgdG8gYW5vdGhlciBwYWdlIHRvIGZvcmNlIHVuY2FjaGluZyBvbiBDaHJvbWUKICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLkpTQk5HX2hhcm5lc3NTdGF0ZSA9IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHRzLAogICAgICAgICAgICAgICAgICAgIGN1clJ1bjogY3VyUnVuLAogICAgICAgICAgICAgICAgICAgIGN1ckJlbmNobWFyazogY3VyQmVuY2htYXJrLAogICAgICAgICAgICAgICAgICAgIGN1ck1vZGU6IGN1ck1vZGUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKC9cL1teXC9dKiQvLCAiL3JlbG9hZC5odG1sIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChleCkge30KICAgICAgICBydW5CZW5jaG1hcmsoKTsKICAgIH0KCiAgICAvLyBsb2FkIG91ciBjdXJyZW50IHN0YXRlIGFuZCBydW4KICAgIGZ1bmN0aW9uIG9ubG9hZCgpIHsKICAgICAgICB2YXIgZ29iID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdvIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZSAmJiAiSlNCTkdfaGFybmVzc1N0YXRlIiBpbiBzZXNzaW9uU3RvcmFnZSkgewogICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5KU0JOR19oYXJuZXNzU3RhdGUpOwogICAgICAgICAgICAgICAgcmVzdWx0cyA9IHN0YXRlLnJlc3VsdHM7CiAgICAgICAgICAgICAgICBjdXJSdW4gPSBzdGF0ZS5jdXJSdW47CiAgICAgICAgICAgICAgICBjdXJCZW5jaG1hcmsgPSBzdGF0ZS5jdXJCZW5jaG1hcms7CiAgICAgICAgICAgICAgICBjdXJNb2RlID0gc3RhdGUuY3VyTW9kZTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocnVuQmVuY2htYXJrLCAyMDApOwogICAgICAgICAgICAgICAgZ29iLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChleCkge30KICAgICAgICBnb2Iub25jbGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnb2Iuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAgICAgc2V0VGltZW91dChydW5CZW5jaG1hcmssIDIwMCk7CiAgICAgICAgfTsKICAgICAgICBpZiAoLyNydW4vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpKSB7CiAgICAgICAgICAgIGdvYi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bkJlbmNobWFyaywgMjAwKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcnVuQmVuY2htYXJrKCkgewogICAgICAgIHZhciBvdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0Iik7CiAgICAgICAgdmFyIGJtZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYm1mcmFtZSIpOwoKICAgICAgICAvLyBzaG91bGQgd2Ugc3RvcD8KICAgICAgICBpZiAoY3VyUnVuIDwgbWluUnVucykgewogICAgICAgICAgICBvdXRwdXQuaW5uZXJIVE1MID0gKGN1clJ1bisxKSArICIvIiArIG1pblJ1bnM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gY2hlY2sgaWYgb3VyIFMvTSBpcyBPSwogICAgICAgICAgICB2YXIgc3RhdHMgPSBoYW5kbGVSZXN1bHRzKGZhbHNlKTsKICAgICAgICAgICAgb3V0cHV0LmlubmVySFRNTCA9IChjdXJSdW4rMSkgKyAiICIgKyBzdGF0cy5jaW0gKyAiICgiICsgbWF4Q0lNICsgIikiOwogICAgICAgICAgICBpZiAoY3VyUnVuID49IG1heFJ1bnMgfHwgc3RhdHMuY2ltIDwgbWF4Q0lNKSB7CiAgICAgICAgICAgICAgICBibWZyYW1lLnNyYyA9ICJhYm91dDpibGFuayI7CiAgICAgICAgICAgICAgICBibWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgICAgICAgICBoYW5kbGVSZXN1bHRzKHRydWUpOwogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZSkgZGVsZXRlIHNlc3Npb25TdG9yYWdlLkpTQk5HX2hhcm5lc3NTdGF0ZTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gZ2V0IG91dCBvdXIgYmVuY2htYXJrIGFuZCBtb2RlCiAgICAgICAgdmFyIGJlbmNobWFyayA9IGJlbmNobWFya3NbY3VyQmVuY2htYXJrXTsKICAgICAgICB2YXIgbW9kZXMgPSBnZXRNb2RlcyhiZW5jaG1hcmspOwogICAgICAgIHZhciBtb2RlID0gbW9kZXNbY3VyTW9kZV07CiAgICAgICAgaWYgKCsrY3VyTW9kZSA+PSBtb2Rlcy5sZW5ndGgpIHsKICAgICAgICAgICAgY3VyTW9kZSA9IDA7CiAgICAgICAgICAgIGN1ckJlbmNobWFyaysrOwogICAgICAgIH0KICAgICAgICBpZiAoY3VyQmVuY2htYXJrID49IGJlbmNobWFya3MubGVuZ3RoKSB7CiAgICAgICAgICAgIGN1ckJlbmNobWFyayA9IDA7CiAgICAgICAgICAgIGN1clJ1bisrOwogICAgICAgIH0KCiAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIHJlc3VsdHMgc3BhY2UKICAgICAgICBpZiAoIShiZW5jaG1hcmsgaW4gcmVzdWx0cykpIHJlc3VsdHNbYmVuY2htYXJrXSA9IHt9OwogICAgICAgIGlmICghKG1vZGUgaW4gcmVzdWx0c1tiZW5jaG1hcmtdKSkgcmVzdWx0c1tiZW5jaG1hcmtdW21vZGVdID0gW107CgogICAgICAgIC8vIEV4cG9zZSB0aW1lIG1lYXN1cmluZyBmdW5jdGlvbi4KICAgICAgICBpZiAod2luZG93LnBlcmZvcm1hbmNlICYmIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3cpCiAgICAgICAgICAgIHdpbmRvdy5jdXJyZW50VGltZUluTVMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSB9OwogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwcmVjaXNlVGltZSAhPT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgICAgIHdpbmRvdy5jdXJyZW50VGltZUluTVMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHByZWNpc2VUaW1lKCkgKiAxMDAwOyB9OwogICAgICAgIGVsc2UKICAgICAgICAgICAgd2luZG93LmN1cnJlbnRUaW1lSW5NUyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gRGF0ZS5ub3coKTsgfTsKCiAgICAgICAgLy8gc2V0IHVwIHRoZSByZWNlaXZlcgogICAgICAgIGlmICgvdi8udGVzdChtb2RlKSkgewogICAgICAgICAgICAvLyB2ZXJpZmljYXRpb24gbW9kZSwgd2Ugb25seSBjYXJlIGlmIHRoZXJlJ3MgYW4gZXJyb3IKICAgICAgICAgICAgd2luZG93LkpTQk5HX2hhbmRsZVJlc3VsdCA9IGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgaWYgKHJlcy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIGlmICghKCJlcnJvcnMiIGluIHJlc3VsdHMpKSByZXN1bHRzLmVycm9ycyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZXJyb3JzLnB1c2goYmVuY2htYXJrICsgIi4iICsgbW9kZSArICI6ICIgKyByZXMubXNnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcnVuKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2luZG93LkpTQk5HX2hhbmRsZVJlc3VsdCA9IGZ1bmN0aW9uKHJlcykgewogICAgICAgICAgICAgICAgaWYgKCFyZXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2JlbmNobWFya11bbW9kZV0ucHVzaChyZXMudGltZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXJ1bigpOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8gdGhlbiBsb2FkIGl0CiAgICAgICAgYm1mcmFtZS5zcmMgPSBiZW5jaG1hcmsgKyAiLyIgKyBtb2RlICsgIi5odG1sIjsKICAgIH0KCiAgICAvLyBoYW5kbGUgYWxsIG9mIG91ciByZXN1bHRzCiAgICBmdW5jdGlvbiBoYW5kbGVSZXN1bHRzKHByKSB7CiAgICAgICAgdmFyIG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKTsKICAgICAgICBmdW5jdGlvbiBwcmludChzdHIpIHsKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0cikpOwogICAgICAgICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHByaW50YXJyKGFycikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcHJpbnQoYXJyW2ldKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcGVyY2VudChudW0pIHsKICAgICAgICAgICAgcmV0dXJuIChudW0qMTAwKS50b0ZpeGVkKDIpICsgIiUiOwogICAgICAgIH0KCiAgICAgICAgLy8gY2xlYXIgb3V0IHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cwogICAgICAgIGlmIChwcikgb3V0cHV0LmlubmVySFRNTCA9ICIiOwoKICAgICAgICAvLyB0b3RhbHMKICAgICAgICB2YXIgdG90YWxzID0gewogICAgICAgICAgICBtZWFuOiAxLAogICAgICAgICAgICBzdGRkZXY6IDEsCiAgICAgICAgICAgIHNlbTogMSwKICAgICAgICAgICAgY2k6IDEsCiAgICAgICAgICAgIHJ1bnM6IDAKICAgICAgICB9OwoKICAgICAgICAvLyBzdHVmZiB0byBwcmludCBsYXRlcgogICAgICAgIHZhciBwdG90YWxzID0gW107CiAgICAgICAgdmFyIHByZXN1bHRzID0gW107CiAgICAgICAgdmFyIHByYXcgPSBbXTsKICAgICAgICB2YXIgc3BjID0gIlx1MDBhMFx1MDBhMCI7CiAgICAgICAgdmFyIHNwYzIgPSBzcGMgKyBzcGM7CgogICAgICAgIC8vIGNhbGN1bGF0ZSBhbGwgdGhlIHJlYWwgcmVzdWx0cwogICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYmVuY2htYXJrcy5sZW5ndGg7IGIrKykgewogICAgICAgICAgICB2YXIgYmVuY2htYXJrID0gYmVuY2htYXJrc1tiXTsKICAgICAgICAgICAgdmFyIG1vZGVzID0gZ2V0TW9kZXMoYmVuY2htYXJrKTsKICAgICAgICAgICAgaWYgKHByKSB7CiAgICAgICAgICAgICAgICBwcmVzdWx0cy5wdXNoKHNwYyArIGJlbmNobWFyayArICI6Iik7CiAgICAgICAgICAgICAgICBwcmF3LnB1c2goc3BjICsgYmVuY2htYXJrICsgIjoiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBtb2Rlcy5sZW5ndGg7IG0rKykgewogICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBtb2Rlc1ttXTsKICAgICAgICAgICAgICAgIHZhciBibXJlc3VsdHMgPSByZXN1bHRzW2JlbmNobWFya11bbW9kZV0uc2xpY2UoLWtlZXBSdW5zKTsKICAgICAgICAgICAgICAgIGlmIChibXJlc3VsdHMubGVuZ3RoID09IDApIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmF3IHJlc3VsdHMKICAgICAgICAgICAgICAgIHZhciByciA9IHNwYzIgKyBtb2RlICsgIjogWyI7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJtcmVzdWx0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHJyICs9ICIsICI7CiAgICAgICAgICAgICAgICAgICAgcnIgKz0gYm1yZXN1bHRzW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcnIgKz0gIl0iOwogICAgICAgICAgICAgICAgaWYgKHByKSBwcmF3LnB1c2gocnIpOwoKICAgICAgICAgICAgICAgIC8vIG5vdyBnZXQgdGhlIHN0YXRzIGZvciB0aGlzIHJ1bgogICAgICAgICAgICAgICAgdmFyIGJtc3RhdHMgPSBzdGF0cyhibXJlc3VsdHMpOwoKICAgICAgICAgICAgICAgIC8vIG11bCBpdCB0byB0aGUgdG90YWxzCiAgICAgICAgICAgICAgICB0b3RhbHMubWVhbiAqPSBibXN0YXRzLm1lYW47CiAgICAgICAgICAgICAgICB0b3RhbHMuc3RkZGV2ICo9IGJtc3RhdHMuc3RkZGV2OwogICAgICAgICAgICAgICAgdG90YWxzLnNlbSAqPSBibXN0YXRzLnNlbTsKICAgICAgICAgICAgICAgIHRvdGFscy5jaSAqPSBibXN0YXRzLmNpOwogICAgICAgICAgICAgICAgdG90YWxzLnJ1bnMrKzsKCiAgICAgICAgICAgICAgICAvLyBhbmQgb3V0cHV0IGl0CiAgICAgICAgICAgICAgICBpZiAocHIpIHByZXN1bHRzLnB1c2goc3BjMiArIG1vZGUgKyAiOiAiICsKICAgICAgICAgICAgICAgICAgICBibXN0YXRzLm1lYW4udG9GaXhlZCgyKSArICJtcyCxICIgKyBwZXJjZW50KGJtc3RhdHMuY2ltKSArCiAgICAgICAgICAgICAgICAgICAgIiAoc3RkZGV2PSIgKyBwZXJjZW50KGJtc3RhdHMuc20pICsgIiwgc3RkZXJyPSIgKwogICAgICAgICAgICAgICAgICAgIHBlcmNlbnQoYm1zdGF0cy5zZW1tKSArICIpIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwcikgewogICAgICAgICAgICAgICAgcHJlc3VsdHMucHVzaCgiIik7CiAgICAgICAgICAgICAgICBwcmF3LnB1c2goIiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgY2FsY3VsYXRlIHRoZSB0b3RhbHMKICAgICAgICB2YXIgcG93ZXIgPSAxIC8gdG90YWxzLnJ1bnM7CiAgICAgICAgdG90YWxzLm1lYW4gPSBNYXRoLnBvdyh0b3RhbHMubWVhbiwgcG93ZXIpOwogICAgICAgIHRvdGFscy5zdGRkZXYgPSBNYXRoLnBvdyh0b3RhbHMuc3RkZGV2LCBwb3dlcik7CiAgICAgICAgdG90YWxzLnNtID0gdG90YWxzLnN0ZGRldiAvIHRvdGFscy5tZWFuOwogICAgICAgIHRvdGFscy5zZW0gPSBNYXRoLnBvdyh0b3RhbHMuc2VtLCBwb3dlcik7CiAgICAgICAgdG90YWxzLnNlbW0gPSB0b3RhbHMuc2VtIC8gdG90YWxzLm1lYW47CiAgICAgICAgdG90YWxzLmNpID0gTWF0aC5wb3codG90YWxzLmNpLCBwb3dlcik7CiAgICAgICAgdG90YWxzLmNpbSA9IHRvdGFscy5jaSAvIHRvdGFscy5tZWFuOwogICAgICAgIHB0b3RhbHMucHVzaCgiRmluYWwgcmVzdWx0czoiKTsKICAgICAgICBwdG90YWxzLnB1c2goc3BjICsgdG90YWxzLm1lYW4udG9GaXhlZCgyKSArICJtcyCxICIgKyBwZXJjZW50KHRvdGFscy5jaW0pICsgIiAobG93ZXIgaXMgYmV0dGVyKSIpOwogICAgICAgIHB0b3RhbHMucHVzaChzcGMgKyAiU3RhbmRhcmQgZGV2aWF0aW9uID0gIiArIHBlcmNlbnQodG90YWxzLnNtKSArICIgb2YgbWVhbiIpOwogICAgICAgIHB0b3RhbHMucHVzaChzcGMgKyAiU3RhbmRhcmQgZXJyb3IgPSAiICsgcGVyY2VudCh0b3RhbHMuc2VtbSkgKyAiIG9mIG1lYW4iKTsKICAgICAgICBpZiAodG90YWxzLmNpbSA+PSBtYXhDSU0pCiAgICAgICAgICAgIHB0b3RhbHMucHVzaChzcGMgKyAiV0FSTklORzogVGhlc2UgcmVzdWx0cyBhcmUgbm90IHRydXN0d29ydGh5ISBBZnRlciAiICsgbWF4UnVucyArICIgcnVucywgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgc3RpbGwgZ3JlYXRlciB0aGFuICIgKyBwZXJjZW50KG1heENJTSkgKyAiIG9mIHRoZSBtZWFuISIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcHRvdGFscy5wdXNoKHNwYyArIGN1clJ1biArICIgcnVucyIpOwogICAgICAgIHB0b3RhbHMucHVzaCgiIik7CgogICAgICAgIC8vIGlmIHRoZXJlIGFyZSBlcnJvcnMsIG1hcmsgdGhvc2UgdG9vCiAgICAgICAgaWYgKCJlcnJvcnMiIGluIHJlc3VsdHMpIHsKICAgICAgICAgICAgcHRvdGFscy5wdXNoKCJFUlJPUlM6Iik7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5lcnJvcnMubGVuZ3RoOyBpKyspIHB0b3RhbHMucHVzaChzcGMgKyByZXN1bHRzLmVycm9yc1tpXSk7CiAgICAgICAgICAgIHB0b3RhbHMucHVzaCgiIik7CiAgICAgICAgfQoKICAgICAgICBpZiAocHIpIHsKICAgICAgICAgICAgLy8gYW5kIHByaW50IGl0IGFsbCBvdXQKICAgICAgICAgICAgcHJpbnRhcnIocHRvdGFscyk7CiAgICAgICAgICAgIHByaW50KCJSZXN1bHQgYnJlYWtkb3duOiIpOwogICAgICAgICAgICBwcmludGFycihwcmVzdWx0cyk7CiAgICAgICAgICAgIHByaW50KCJSYXcgcmVzdWx0czoiKTsKICAgICAgICAgICAgcHJpbnRhcnIocHJhdyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdG90YWxzOwogICAgfQoKICAgIC8vIHN0YW5kYXJkIHQtZGlzdHJpYnV0aW9uIGZvciBub3JtYWxseSBkaXN0cmlidXRlZCBzYW1wbGVzCiAgICB2YXIgdERpc3RyaWJ1dGlvbiA9IFtOYU4sIE5hTiwgMTIuNzEsIDQuMzAsIDMuMTgsIDIuNzgsIDIuNTcsIDIuNDUsIDIuMzYsCiAgICAyLjMxLCAyLjI2LCAyLjIzLCAyLjIwLCAyLjE4LCAyLjE2LCAyLjE0LCAyLjEzLCAyLjEyLCAyLjExLCAyLjEwLCAyLjA5LAogICAgMi4wOSwgMi4wOCwgMi4wNywgMi4wNywgMi4wNiwgMi4wNiwgMi4wNiwgMi4wNSwgMi4wNSwgMi4wNSwgMi4wNCwgMi4wNCwKICAgIDIuMDQsIDIuMDMsIDIuMDMsIDIuMDMsIDIuMDMsIDIuMDMsIDIuMDIsIDIuMDIsIDIuMDIsIDIuMDIsIDIuMDIsIDIuMDIsCiAgICAyLjAyLCAyLjAxLCAyLjAxLCAyLjAxLCAyLjAxLCAyLjAxLCAyLjAxLCAyLjAxLCAyLjAxLCAyLjAxLCAyLjAwLCAyLjAwLAogICAgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwgMi4wMCwKICAgIDIuMDAsIDEuOTksIDEuOTksIDEuOTksIDEuOTksIDEuOTksIDEuOTksIDEuOTksIDEuOTksIDEuOTksIDEuOTksIDEuOTksCiAgICAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LCAxLjk5LAogICAgMS45OSwgMS45OSwgMS45OSwgMS45OSwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwKICAgIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsCiAgICAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LAogICAgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwgMS45OCwKICAgIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsIDEuOTgsCiAgICAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk4LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsCiAgICAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LCAxLjk3LAogICAgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywgMS45NywKICAgIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTcsIDEuOTZdOwoKICAgIC8vIHQgZGlzdHJpYnV0aW9uCiAgICBmdW5jdGlvbiB0RGlzdChuKSB7CiAgICAgICAgaWYgKG4gPj0gdERpc3RyaWJ1dGlvbi5sZW5ndGgpCiAgICAgICAgICAgIHJldHVybiB0RGlzdHJpYnV0aW9uW3REaXN0cmlidXRpb24ubGVuZ3RoLTFdOwogICAgICAgIHJldHVybiB0RGlzdHJpYnV0aW9uW25dOwogICAgfQoKICAgIC8vIGdldCBzdGF0aXN0aWNzCiAgICBmdW5jdGlvbiBzdGF0cyhyZXN1bHRzKSB7CiAgICAgICAgdmFyIHJldCA9IHt9OwoKICAgICAgICBmdW5jdGlvbiBzdW0oYXJyKSB7CiAgICAgICAgICAgIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uKHAsIGMpIHsgcmV0dXJuIHAgKyBjOyB9LCAwKTsKICAgICAgICB9CgogICAgICAgIC8vIG1lYW4KICAgICAgICByZXQubWVhbiA9IHN1bShyZXN1bHRzKSAvIHJlc3VsdHMubGVuZ3RoOwoKICAgICAgICAvLyBzYW1wbGUgc3RkZGV2CiAgICAgICAgcmV0LnN0ZGRldiA9IE1hdGguc3FydCgKICAgICAgICAgICAgc3VtKAogICAgICAgICAgICAgICAgcmVzdWx0cy5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gTWF0aC5wb3coZSAtIHJldC5tZWFuLCAyKTsgfSkKICAgICAgICAgICAgKSAvIChyZXN1bHRzLmxlbmd0aCAtIDEpCiAgICAgICAgKTsKCiAgICAgICAgLy8gc3RkZGV2IC8gbWVhbgogICAgICAgIHJldC5zbSA9IHJldC5zdGRkZXYgLyByZXQubWVhbjsKCiAgICAgICAgLy8gc2FtcGxlIFNFTSAoc3RkZXJyKQogICAgICAgIHJldC5zZW0gPSByZXQuc3RkZGV2IC8gTWF0aC5zcXJ0KHJlc3VsdHMubGVuZ3RoKTsKCiAgICAgICAgLy8gc2FtcGxlIFNFTS9tZWFuCiAgICAgICAgcmV0LnNlbW0gPSByZXQuc2VtIC8gcmV0Lm1lYW47CgogICAgICAgIC8vIHNhbXBsZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCByYW5nZQogICAgICAgIHJldC5jaSA9IHREaXN0KHJlc3VsdHMubGVuZ3RoKSAqIHJldC5zZW07CgogICAgICAgIC8vIHNhbXBsZSA5NSUgQ0kgLyBtZWFuCiAgICAgICAgcmV0LmNpbSA9IHJldC5jaSAvIHJldC5tZWFuOwoKICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIHdpbmRvdy5vbmxvYWQgPSBvbmxvYWQ7Cn0pKCk7Cg==